文件上传防御绕过与文件包含(LFI/RFI)

admin 2026-09-14 04:34:14 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统讲解文件上传绕过与文件包含漏洞利用技术,涵盖前端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

  • MIME-Type 校验绕过
  • 服务端通过解析 HTTP 请求头中的 Content-Type 字段来判断文件类型(如仅放行 image/jpeg、image/png)。

    绕过方式:上传脚本文件时,利用代理工具拦截,将请求体中的 Content-Type: application/octet-stream 或 application/x-php 伪造修改为合法的 image/jpeg,即可绕过基于请求头的检测。

    1. 后端黑名单限制绕过

    当服务端采用黑名单策略过滤危险扩展名(如禁止 .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。
    1. 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。

    1. 条件竞争

    服务端采用“先存储后校验”的缺陷逻辑:先将文件无条件写入上传目录,再读取其扩展名进行合规性验证,若发现不合规再调用 unlink() 删除。

    利用方式:在文件已被保存但尚未被删除的微小时间差(几毫秒到几十毫秒)内,通过并发多线程持续发送 HTTP 请求访问该文件,触发其内部代码向网站目录写入一个新的独立文件。

    0x02 Pikachu 文件上传复现

    先准备一个用于安全测试的轻量验证文件 test.php:

    <?php&nbsp;echo&nbsp;"123";&nbsp;?>
    

    1.前端校验绕过

    页面路径:Unsafe Fileupload -> client check

    查看源代码:这里只有js过滤,仅在本地判断是否为 .jpg、.png、.gif。

    上传该图片

    评论:0   参与:  0