文章总结: 本文系统讲解文件上传绕过与文件包含漏洞利用技术,涵盖前端JS校验、MIME类型伪造、黑名单绕过、00截断及条件竞争等绕过手法,并通过Pikachu靶场复现LFI/RFI攻击流程,最后提出扩展名白名单、随机重命名、剥离执行权限及关闭远程包含等加固方案。 综合评分: 85 文章分类: 渗透测试,WEB安全,漏洞分析
文件上传防御绕过与文件包含(LFI/RFI)
ddyy ddyy
DD2580
2026年9月4日 10:40 四川
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
免责声明:本文所涉及的技术实操与配置仅用于网络安全技术研究、学术交流与防御加固实践。任何个人或组织严禁将本文内容用于非法侵入或破坏计算机系统等违法活动,违者法律责任自负,与作者及平台无关。
0x00 靶场模块与准备
演练环境:Pikachu 靶场容器,运行于 [http://192.168.10.17:8082
# 1. 启动 Pikachu 容器(若已有停止的容器可直接执行 sudo docker start pikachu)sudo docker run -d --name pikachu -p 8082:80 area39/pikachu
# 2. 检查容器运行状态(确认 STATUS 显示为 Up)sudo docker ps | grep pikachu
服务端通过解析 HTTP 请求头中的 Content-Type 字段来判断文件类型(如仅放行 image/jpeg、image/png)。
绕过方式:上传脚本文件时,利用代理工具拦截,将请求体中的 Content-Type: application/octet-stream 或 application/x-php 伪造修改为合法的 image/jpeg,即可绕过基于请求头的检测。
- 后端黑名单限制绕过
当服务端采用黑名单策略过滤危险扩展名(如禁止 .php、.asp、.jsp)时,常见的变形手法包括:
- 特殊扩展名解析:部分 Web 容器(如 Apache 配置了多扩展名映射)支持解析 .php3、.php5、.phtml 等替代后缀。
- 大小写混写:在 Windows 等文件名大小写不敏感但校验代码未做小写转换的系统上,可尝试 .Php、.pHp。
- Windows 点与空格特性:Windows 操作系统底层保存文件时会自动剥离末尾的点和空格。构造扩展名为 test.php. 或 test.php ,可规避后端的字符串匹配,落盘时仍被系统还原为 test.php。
- 双写绕过:服务端若使用简单的替换函数(如 str_ireplace(‘php’, ”, $file))清空敏感后缀,构造 test.pphphp,在中间被剥离后前后两部分会自动重新拼合为 .php。
- 00 截断(0x00 / %00 截断)
C 语言底层字符串以空字符 \0(十六进制 0x00,ASCII 码 0)作为终止符。在文件保存拼接路径时,底层函数若遇到 00 字符,会误认为字符串已结束,从而截断丢弃其后的所有字符。
触发条件:PHP 版本低于 5.3.4,且配置项 magic_quotes_gpc 处于 Off 状态。
利用方式:
-
GET截断:
路径在 URL 参数中传输时,构造 path=upload/test.php%00,后端拼接待保存的后缀 .jpg 变成 upload/test.php%00.jpg,系统截断后实际落盘为 upload/test.php。
-
POST 截断:路径在 POST 请求体中传输时,需在代理工具的 Hex 视图中,将路径末尾填充的占位符(如空格十六进制 20)手动修改为 00。
- 条件竞争
服务端采用“先存储后校验”的缺陷逻辑:先将文件无条件写入上传目录,再读取其扩展名进行合规性验证,若发现不合规再调用 unlink() 删除。
利用方式:在文件已被保存但尚未被删除的微小时间差(几毫秒到几十毫秒)内,通过并发多线程持续发送 HTTP 请求访问该文件,触发其内部代码向网站目录写入一个新的独立文件。
0x02 Pikachu 文件上传复现
先准备一个用于安全测试的轻量验证文件 test.php:
<?php echo "123"; ?>
1.前端校验绕过
页面路径:Unsafe Fileupload -> client check
查看源代码:这里只有js过滤,仅在本地判断是否为 .jpg、.png、.gif。
上传该图片
动态引入,才能触发代码执行。</p>
<p>0x03 本地与远程文件包含(LFI / RFI)</p>
<p>PHP 中提供了 include、require、include_once、require_once 用于模块化引入文件。核心特性在于:只要文件内存在<?php ?>标签,无论后缀是什么,都会当做 PHP 代码执行。</p>
<p>LFI(本地文件包含):目标系统读取并执行本地文件系统已有文件。</p>
<p>RFI(远程文件包含):通过网络协议加载外部服务器脚本执行。依赖 php.ini 开启:</p>
<ul>
<li>allow_url_fopen = On</li>
<li>allow_url_include = On(生产环境绝大多数默认关闭)</li>
</ul>
<p>1.File Inclusion(local) 本地包含</p>
<p>页面路径:File Inclusion -> File Inclusion(local)</p>
<p>1.1动态解析已上传的图片马</p>
<pre><code>http://192.168.10.17:8082/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2026/09/03/3155896a9981232383e744502525.jpg&submit=%E6%8F%90%E4%BA%A4
</code></pre>
<p>直接浏览器访问这个 jpg 只会输出图片乱码,PHP 不会执行木马,必须走<code>fi\_local.php</code>本地文件包含漏洞去加载它。</p>
<p><img decoding=)
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论