[i=s] 本帖最后由 zeke 于 2025-9-23 16:29 编辑 [/i]
WEB渗透测试工程师系统班250303期
41节课作业
一、 java反序列化漏洞产生的函数
以下代码皆为java
- readObject() - 最核心的漏洞入口
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 漏洞触发点
- readUnshared() - 类似readObject但更严格
Object obj = ois.readUnshared();
- XML反序列化相关
// XStream
XStream xstream = new XStream();
xstream.fromXML(xmlString); // 危险操作
// XMLDecoder
XMLDecoder decoder = new XMLDecoder(input);
Object obj = decoder.readObject();
- JSON反序列化(某些库)
// Jackson的enableDefaultTyping(已废弃)
objectMapper.enableDefaultTyping();
// FastJSON的autoType
JSON.parse(jsonString);
JSON.parseObject(jsonString, Class.class);
- YAML反序列化
Yaml yaml = new Yaml();
yaml.load(yamlString); // SnakeYAML漏洞点
- 重写的readObject()方法
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject(); // 先正常反序列化
Runtime.getRuntime().exec(this.command); // 恶意代码
}
- 其他魔术方法
// 反序列化过程中自动调用的方法
private void readObjectNoData()
private void readResolve()
private Object readExternal()
二、 java序列化的数据特征有哪些
- 魔数签名(Magic Number)
固定开头:AC ED 00 05(十六进制)
这是Java序列化数据最明显的特征,几乎100%标识这是Java序列化流。
- 十六进制特征
AC ED 00 05 73 72 00 ...
AC ED:魔数
00 05:版本号(通常为5)
73:TC_OBJECT,表示对象开始
72:TC_CLASSDESC,表示类描述
- base64编码特征为rO0AB开头
三、 复现课堂序列化案例代码,了解序列化和反序列化的过程
Level 3: 对象中值的权限
考察 控制修饰符:
public(公有): 公有的类成员可以在任何地方被访问。
protected(受保护): 受保护的类成员则可以被其自身以及其子类和父类访问。(可继承)
private(私有): 私有的类成员则只能被其定义所在的类访问。(不可继承)
这里 SubFLAG 继承了 FLAG,除开 public 修饰的值,对于另外两个:
protected $protected_flag 可以通过 get_protected_flag() / get_private_flag() 访问,因为受保护的变量是可以被继承的。
private $private_flag则只能通过 get_private_flag() 进行访问,因为私有变量不能被继承。
而对象中函数的调用和值的访问类似,也通过 -> 符号实现:$对象名 -> 函数名();
POST提交:
code=echo $target->public_flag.$target->get_protected_flag().$target->get_private_flag();
code=echo $target->public_flag.$sub_target->show_protected_flag().$target->get_private_flag();


Level 4: 序列化初体验
一道用来考察序列化的套壳题目,序列化虽然不会标记函数,但是会完整的输出变量和变量内容。
题目已经使用 $flag_is_here = new FLAG(); 实例化创建了一个对象,所以我们只需要序列化并且打印出来这一段字符串。
POST提交:
code=echo serialize($flag_is_here);
序列化数据:
O:4:"FLAG":3:{s:18:"FLAGflag1_string";s:8:"ser4l1ze";s:18:"FLAGflag2_number";i:2;s:18:"FLAGflag3_object";O:5:"FLAG3":1:{s:25:"FLAG3flag3_object_array";a:2:{i:0;s:3:"se3";i:1;s:2:"me";}}}


Level 5: 序列化的普通值规则
演示和考察序列化中 不同类型变量的不同格式。
而从结果上理解,反序列化其实和参数创建是一个等同的过程 —— 比如下面的例子:
$a_string = "HelloCTF"; /*<=等价于=>*/ $a_string = unserialize('s:8:"HelloCTF";');
所以该题目按照后面部分的要求编写对应的变量进行序列化,将字符串赋给对应参数即可。

序列化数据:
o=O:7:"a_class":1:{s:7:"a_value";s:4:"FLAG";}&s=s:5:"IWANT";&a=a:2:{s:1:"a";s:3:"Plz";s:1:"b";s:6:"Give_M3";}&i=i:1;&b=b:1;&n=N;
POST传参


JAVA反序列化-readobject
①准备:搭建靶场(java8环境)

②yakit开启DNSLog服务(测试过了所以有记录,这里默认没有)

③开启yakit自带的java生成利用链,生成dnslog的利用链

④利用链打入

⑤DNSLog有记录,测试成功

四、复现Shiro反序列化漏洞,并说明漏洞的流量特征
①准备:java漏洞靶场

集成工具ONE-FOX的shiro反序列化利用工具

②特点:有记住密码这样的选项
③打开该工具,填入url地址,检测利用链并爆破利用链及回显

④爆破找到了一个CB183的利用链,直接切到命令执行,输入一个命令calc,成功打开

Shiro反序列化漏洞流量特征
- 最核心的特征:RememberMe Cookie
http
Cookie: rememberMe=删除我rO0ABXQABkhlbGxv...
Cookie名称固定:rememberMe
值特征:Base64编码的Java序列化数据
开头标识:通常以rO0开头(Base64编码的AC ED 00 05)
- 完整的HTTP请求特征
http
POST /admin/login HTTP/1.1
Host: target.com
User-Agent: Mozilla/5.0
Cookie: rememberMe=rO0ABXQABkhlbGxv...(很长的一串Base64)
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
- 不同攻击阶段的流量特征
探测阶段:
http
#发送简单的序列化对象探测
Cookie: rememberMe=rO0ABXQABkhlbGxv...(短payload)
#响应特征:可能返回500错误或特定的Shiro错误页面
利用阶段:
http
#包含恶意反序列化链的payload
Cookie: rememberMe=基编码的CommonsCollections5/6链...(很长)
#长度特征:通常超过1000字符的Base64
- 加密后的特征(AES加密)
Shiro默认使用AES加密RememberMe值:
密钥硬编码:kPH+bIxk5D2deZiIxcaaaA==(默认)
加密模式:AES-CBC
识别特征:虽然是加密的,但Cookie名和长度仍可识别
- 响应特征
成功利用的特征:
http
HTTP/1.1 200 OK
Set-Cookie: rememberMe=deleteMe
Content-Type: text/html
#可能包含命令执行结果或内存马响应
失败的特征:
http
HTTP/1.1 500 Internal Server Error
#或者Shiro特定的错误信息
一、笔记标题:WEB渗透系统班-反序列化漏洞-php 靶场+反序列化漏洞-java 简介
二、文章内容:
1.课程内容概要
主要知识点1:反序列化漏洞php靶场
主要知识点2:反序列化漏洞java靶场
主要知识点3:shiro反序列化
主要知识点4:修复防御
2.重点知识与细节
概念解析
概念1:无
概念2:
关键步骤
步骤1:无
步骤2:
步骤3:
相关代码
Less-3


Less-4

Less-5


3.实操练习和解析
如作业
4.个人总结
本节课最大的收获是:练习了反序列化漏洞的php靶场,java靶场的漏洞集成工具
仍然存在疑问的地方:暂无
需要课后深入学习的内容:php靶场更深层次的关