php 文件上传不含一句 php 代码 RCE 最新新姿势
字数 1289 2025-09-01 11:25:54

PHP文件上传不含PHP代码实现RCE的最新姿势

前言

本技术文档详细分析了一种新型的PHP文件上传漏洞利用技术,该技术可以在不包含任何PHP代码的情况下实现远程代码执行(RCE)。这种技术在实战中具有很高的价值,特别是在严格限制文件上传内容的环境中。

漏洞场景分析

环境限制

  1. 文件上传限制

    • 白名单验证
    • 严格的后缀限制
    • 文件内容过滤
  2. 文件包含限制

    • 使用basename()防止目录穿越
    • 沙箱目录存在
    • 文件必须存在
    • 文件扩展名必须是zip/bz2/gz/xz/7z

常规思路受阻

在这种严格限制下,常规的文件上传绕过方法几乎都失效:

  • 无法上传普通PHP文件
  • 无法通过解析漏洞利用
  • 无法使用phar反序列化(关键字被过滤)

突破方法:利用PHAR自动解析机制

核心思路

利用PHP底层对PHAR文件的自动解析机制,通过上传特殊构造的压缩文件,在文件包含时触发PHP代码执行。

详细步骤

  1. 创建PHAR文件

    • 修改php.ini设置:phar.readonly = Off
    • 创建包含恶意代码的PHAR文件
  2. 压缩PHAR文件

    • 将PHAR文件压缩为zip/bz2/gz/xz/7z格式
    • 这样可以绕过文件内容过滤
  3. 上传压缩文件

    • 上传压缩后的文件(如malicious.phar.zip)
    • 由于是压缩格式,可以绕过内容检查
  4. 触发文件包含

    • 通过文件包含功能包含上传的文件
    • PHP会自动解析PHAR文件并执行其中的代码

技术原理分析

PHP底层在处理文件包含时,会对PHAR文件进行特殊处理:

  1. PHAR文件识别

    • 如果文件名包含.phar且不是URL(如phar://),PHP会将其识别为本地PHAR文件
    • 文件名可以是1.phar.jpg等形式
  2. 自动解析过程

    • 调用phar_open_from_filename处理
    • 通过phar_open_from_fp读取文件内容
    • 自动识别格式(phar/tar/zip/gz/bz2)
    • 查找__HALT_COMPILER();标记
    • 初始化phar_archive_data
  3. 格式处理

    • 检测到zip magic时,调用phar_parse_zipfile()
    • 检测到TAR结构时,调用phar_parse_tarfile()
    • 整个过程会自动解压文件内容

关键点总结

  1. PHAR文件特性

    • 不需要文件扩展名为.php
    • 可以嵌入到压缩文件中
    • 自动解析机制
  2. 绕过限制的关键

    • 上传压缩格式的PHAR文件
    • 利用PHP自动解压和解析机制
    • 文件名中包含.phar触发解析
  3. 防御建议

    • 禁用PHAR功能(phar.readonly = On)
    • 严格检查上传文件的真实类型
    • 限制文件包含功能

实战价值

这种技术在实际渗透测试中非常有用,特别是在以下场景:

  • 严格限制文件上传内容的环境
  • 无法上传普通PHP文件的情况
  • 需要绕过内容安全检查的场景

通过利用PHP底层的自动解析机制,攻击者可以在看似安全的文件上传限制下实现代码执行,展示了PHP语言的复杂性和潜在安全风险。

PHP文件上传不含PHP代码实现RCE的最新姿势 前言 本技术文档详细分析了一种新型的PHP文件上传漏洞利用技术,该技术可以在不包含任何PHP代码的情况下实现远程代码执行(RCE)。这种技术在实战中具有很高的价值,特别是在严格限制文件上传内容的环境中。 漏洞场景分析 环境限制 文件上传限制 : 白名单验证 严格的后缀限制 文件内容过滤 文件包含限制 : 使用 basename() 防止目录穿越 沙箱目录存在 文件必须存在 文件扩展名必须是 zip / bz2 / gz / xz / 7z 常规思路受阻 在这种严格限制下,常规的文件上传绕过方法几乎都失效: 无法上传普通PHP文件 无法通过解析漏洞利用 无法使用phar反序列化(关键字被过滤) 突破方法:利用PHAR自动解析机制 核心思路 利用PHP底层对PHAR文件的自动解析机制,通过上传特殊构造的压缩文件,在文件包含时触发PHP代码执行。 详细步骤 创建PHAR文件 : 修改 php.ini 设置: phar.readonly = Off 创建包含恶意代码的PHAR文件 压缩PHAR文件 : 将PHAR文件压缩为zip/bz2/gz/xz/7z格式 这样可以绕过文件内容过滤 上传压缩文件 : 上传压缩后的文件(如 malicious.phar.zip ) 由于是压缩格式,可以绕过内容检查 触发文件包含 : 通过文件包含功能包含上传的文件 PHP会自动解析PHAR文件并执行其中的代码 技术原理分析 PHP底层在处理文件包含时,会对PHAR文件进行特殊处理: PHAR文件识别 : 如果文件名包含 .phar 且不是URL(如 phar:// ),PHP会将其识别为本地PHAR文件 文件名可以是 1.phar.jpg 等形式 自动解析过程 : 调用 phar_open_from_filename 处理 通过 phar_open_from_fp 读取文件内容 自动识别格式(phar/tar/zip/gz/bz2) 查找 __HALT_COMPILER(); 标记 初始化 phar_archive_data 格式处理 : 检测到zip magic时,调用 phar_parse_zipfile() 检测到TAR结构时,调用 phar_parse_tarfile() 整个过程会自动解压文件内容 关键点总结 PHAR文件特性 : 不需要文件扩展名为 .php 可以嵌入到压缩文件中 自动解析机制 绕过限制的关键 : 上传压缩格式的PHAR文件 利用PHP自动解压和解析机制 文件名中包含 .phar 触发解析 防御建议 : 禁用PHAR功能( phar.readonly = On ) 严格检查上传文件的真实类型 限制文件包含功能 实战价值 这种技术在实际渗透测试中非常有用,特别是在以下场景: 严格限制文件上传内容的环境 无法上传普通PHP文件的情况 需要绕过内容安全检查的场景 通过利用PHP底层的自动解析机制,攻击者可以在看似安全的文件上传限制下实现代码执行,展示了PHP语言的复杂性和潜在安全风险。