一.概念
下面为代码执行,若与Java反序列化结合,就会有命令执行漏洞
二.利用
案例一:webgoat靶场 --不安全的反序列化
搭建:下载https://github.com/WebGoat/WebGoat/releases/download/v8.1.0/webgoat-server-8.1.0.jar
建议使用迅雷
在下载目录打开cmd执行下面代码
java -jar webgoat-server-8.1.0.jar
然后访问http://127.0.0.1:8080/WebGoat/login
注册新用户登录即可,打开是英文我用的谷歌自带翻译,选择题目。前四个模块是介绍
打开idea,看一下源码(在windows系统解压jar包,在idea创建项目查看,找到对应的jar文件,右键选择添加为库即可查看)
这道题目对应的为insecure-deserialization-8.1.0.jar,打开org目录
题目中的序列开头rO0AB,其实是 aced0005的base64编码的结果,这个就是Java序列化的16进制,而此字符串其实就是序列化后加密的字符
分析后使用ysoserial工具,构造payload
payload生成器 --ysoserial
下载打包的jar文件参考:
【JAVA反序列扫描工具】简介、下载、安装、使用_黑色地带(崛起)的博客-CSDN博客_反序列化漏洞扫描工具
老版的ysoserial.jar
链接:https://pan.baidu.com/s/18q2ruwCFGI1vMvl9j7lT3w?pwd=hj12
提取码:hj12
java反序列化字节转字符串工具--SerializationDumper 下载jar文件
java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-master.jar ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin
//hibernate-core-5.4.9.Final.jar 组件,webgoat源代码中含有
//calc.exe 打开计算器
//payload.bin 保存文件名称,这里还要base64,工具没有加密功能,所以先保存
py脚本对生成的文件进行base64解密,里面是encoding下面打错了
三.检测
漏洞经常存在于一些 web组件中。例如 weblogic,Fastjson,JBoss,WebSphere,Jenkins,OpenNMS,Shiro
需要了解以下知识
HTTP请求的参数cookie,Parameters
RMI协议,完全基于序列化
JNDI
JMX 协议,用于处理序列化对象
RMI 协议(Remote Method Protocol):远程方法调用。在JAVA 中,只要一个类 extends了 java.rmi.Remote接口,这个类就可以被客户端远程访问,并提供服务。
RMI协议默认端口1099,基于socket协议
JNDI(Java Naming and Directory Interface,Java命名和目录接口):是一个接口,能够查找和访问各种命名和目录服务。比如LDAP,DNS,RMI,CORBA。
JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI 服务供应接口(SPI)的实现,由管理者将JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务直接进行交互。
黑盒流量分析
在 Java反序列化传送的包中,一般有两种传送方式
TCP 传输,在TCP报文中,一般是二进制流的方式。流量特征:aced0005,这个16进制流基本上意味着Java反序列化的开始
HTTP 传输,在HTTP报文中,大多以base64传输。流量特征:rO0AB,其实是 aced0005的base64编码的结果
流量中有以上特征,意味着存在Java反序列化,可尝试构造payload
白盒代码审计
1.观察实现了Serializable 接口的类是否存在问题
2.观察重写了readObject方法的函数逻辑是否存在问题
3.再考察应用的Class Path中是否包含Apache Commons Collections库
4.生成反序列化 payload
5.执行payload
四.修复
1.类的白名单校验机制
传入的的数据在反序列化之前,对类型名做一个检测,不符合白名单的类不进行反序列化操作。
例如:Runtime 肯定不会在白名单中,执行命令的
2.禁止JVM执行外部命令 Runtime.exec
这个举措可以通过扩展 SecurityManager 可以实现