php 文件上传不含一句 php 代码 RCE 最新新姿势
字数 1289 2025-09-01 11:25:54
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() - 整个过程会自动解压文件内容
- 检测到zip magic时,调用
关键点总结
-
PHAR文件特性:
- 不需要文件扩展名为
.php - 可以嵌入到压缩文件中
- 自动解析机制
- 不需要文件扩展名为
-
绕过限制的关键:
- 上传压缩格式的PHAR文件
- 利用PHP自动解压和解析机制
- 文件名中包含
.phar触发解析
-
防御建议:
- 禁用PHAR功能(
phar.readonly = On) - 严格检查上传文件的真实类型
- 限制文件包含功能
- 禁用PHAR功能(
实战价值
这种技术在实际渗透测试中非常有用,特别是在以下场景:
- 严格限制文件上传内容的环境
- 无法上传普通PHP文件的情况
- 需要绕过内容安全检查的场景
通过利用PHP底层的自动解析机制,攻击者可以在看似安全的文件上传限制下实现代码执行,展示了PHP语言的复杂性和潜在安全风险。