簡述
ysoserial很強大,花時間好好研究研究其中的利用鏈對於了解java語言的一些特性很有幫助,也方便打好學習java安全的基礎,剛學反序列化時就分析過commoncollections,但是是跟着網上教程,自己理解也不夠充分,現在重新根據自己的調試進行理解,這篇文章先分析URLDNS
利用鏈分析:
調用鏈如上圖所示,由hashmap的key進行hash計算時,如果key為URL類的對象,則調用key.hashcode實際為調用了URL類對象的hashcode,從而觸發dns解析,這個手寫exp也比較容易,設置hashCode為1為了putval時候重新計算hash,否則直接返回hashCode就觸發不了dns解析了
工具介紹
IDEA
ysoserial jar : https://jitpack.io/com/github/frohoff/ysoserial/master-30099844c6-1/ysoserial-master-30099844c6-1.jar
ysoserial 源碼:https://codeload.github.com/frohoff/ysoserial/zip/master
使用:

接下來我們對x.txt進行反序列化操作:
package Reflect; import java.io.*; public class readobject { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream o = new ObjectInputStream(new FileInputStream("C:/users/kuaile/desktop/x.txt")); Object o1 = o.readObject(); System.out.println(o1); } }
查看我們的dnslog
倒着來分析,為什么能夠發起dns請求,來看urldns類文件
首先yso會調用getobjct方法,
URLStreamHandler,引用別人對這個類的理解。
一般而言, URL 的格式是: protocol://[authority]hostname:port/resource?queryString 。 URL 類能夠解析出 protocol、 hostname 、 port 等信息。 Protocol 決定了交互規范,通用的協議,比如 HTTP 、 File 、 FTP 等協議, JDK 自帶了默認的通訊實現。當然,自定義實現是允許的。 Hostname 和 port 一般用於 Socket 或者基於 Socket 其他協議通訊方式。Resource 即資源上下文。可能讀者利用 URL ,通過指定協議( protocol )來獲取指定資源的讀寫,比如 JDK 內置了HTTP 、 File 、 FTP 等協議的處理方法。
在成功地構造 URL 實例之后, URL API 中定義了一個 openConnection() 方法,返回一個 java.net.URLConnection 抽象類型的實例。不過,這里 URL 對象是代理對象,實際調用的是, java.net.URLStreamHandler 對象的 openConnection() 方法。
然后實例化了hashmap類,跟進去可以看到,有序列化接口,那就搜索readobject方法
看了一下他反序列化的代碼,
先跟一下hash方法,參數為key, 如果key 是 null 就返回0 否則就返回 hashcode方法處理后的值和h右移再進行亦或
因為key是java.net.URL對象,我們的key值就是我們的url,就可以跟進一下其中url類的hashcode方法
判斷hashcode 不等於-1 就返回,如果等於-1 就handler.hashcode,跟一下
調用了我們URL對象,
其中InetAddress.getByName(host);
含義就是相當於進行了一次dns請求
DEBUG跟了一下,
最后是再ser就是我們反序列化的值