java system.in 输入不回显_Java安全之URLDNS链
點擊上方藍色字體,選擇“標星公眾號”
優質文章,第一時間送達
? 作者?|??nice0e3
來源 |? urlify.cn/6Zfiiu
前言
在學習Java的反序列化漏洞的時候,就不得不學習他的一個利用鏈。很多剛剛入門的對于利用鏈這個詞可能比較陌生。那么這里先來了解一下Java反序列化和反序列化漏洞的一個產生。
1、Java反序列化
Java提供了一種對象序列化的機制,用一個字節序列表示一個對象,該字節包含對象的數據、對象的類型、對象的存儲屬性。字節序列寫出到文件后,相當于可以持久報錯了一個對象信息,這過程叫做序列化。序列化對象會通過ObjectOutputStream的writeObject方法將一個對象寫入到文件中。
而反序列化是使用了readObject?方法進行讀取并還原成在序列化前的一個類。
這一步驟并沒有什么安全問題,但是如果反序列化的數據是可控的情況下,那么我們就可以從某個輸入點,輸入惡意代碼,再去查找在哪個點,我們的輸入會被一層一層的帶去到我們的觸發點去,而這一步叫做尋找利用鏈的步驟。
2 、動態調試ysoserial
至于ysoserial就不多敘述了,自行百度。
ysoserial項目地址:ysoserial
拉取項目源碼,導入到IDEA中。
看到pom.xml知道該項目是個maven的項目,點擊pom.xml 進行刷新,將缺少的依賴給下載下來
下載完成,直到不爆紅了后,就可以開始調試ysoserial了。
先來查找一下該程序的入口點,點開pom.xml搜索mainclass就可以找到入口點的類
ctrl+左鍵點擊跟蹤進去,運行測試一下。
運行發現爆了一些錯誤,這里是因為我們并沒有去傳入值。
點擊Edit configurations,設置參數
再次運行就可以看到成功執行了。
這樣我們就獲取到了一個序列化的數據。
我們的ysoserial就能在idea里面去運行了。
3?、URLDNS鏈分析
URLDNS是ysoserial里面就簡單的一條利用鏈,但URLDNS的利用效果是只能觸發一次dns請求,而不能去執行命令。比較適用于漏洞驗證這一塊,而且URLDNS這條利用鏈并不依賴于第三方的類,而是JDK中內置的一些類和方法。
在一些漏洞利用沒有回顯的時候,我們也可以使用到該鏈來驗證漏洞是否存在,比如shiro反序列化就是使用dnslog來驗證漏洞是否存在,(盲猜的,并沒有去分析過,后面可以去分析一下)。
下面先來使用ysoserial的URLDNS
?java?-jar?.\ysoserial.jar?URLDNS?"http://2mdw9p.dnslog.cn"得到序列化后的數據,如果需要執行,我們需要對其進行反序列化,這里先不執行。先來看看在ysoserial中,該數據是怎么獲取的。
打開ysoserial/payloads/URLDNS.java的源碼
上面的注釋也寫明白了他的調用鏈
具體怎么執行的我們還得去debug看。
觸發點在hashmap的put方法,我們在put地方打一個斷點
來到hashmap的readobject中看到
這里使用了hash方法對key的值進行了處理,我們來跟蹤一下hash這個方法看看他具體的實現
這里的key的是java.net.URL的實例對象調用了key的hashcode。再跟進一下他的hashcode方法。
在hashcode方法中還調用了handler的hashcode。先來跟蹤一下hanler
調用 URLStreamHandler 的hashcode。進行跟蹤URLStreamHandler.hashcode。
跟進一下getProtocol方法
在jdk的api文檔里面寫著該方法是用來獲取協議的名稱的
回到剛剛的地方
再來跟蹤一下getHostAddress
來到這里后,可以發現會調用getHost、getByName這兩個方法。
JDKapi文檔查看 InetAddress.getByName方法
該方法會使用遠程請求,進行獲取主機的ip,那么這時候就會觸發一次請求,到了這里我們的dnslog平臺,就可以收到響應了。這就是這個URLDNS鏈的一個觸發點。
調用鏈:
HashMap.readObject()?->??HashMap.putVal()?->?HashMap.hash()?->?URL.hashCode()->URLStreamHandler.hashCode().getHostAddress
->URLStreamHandler.hashCode().getHostAddress
->URLStreamHandler.hashCode().getHostAddress.InetAddress.getByName
下面來測試一下
import?java.io.*;public?class?main?{
????public?static?void?main(String[]?args)?throws?IOException,?ClassNotFoundException?{
????????FileInputStream?fis?=?new?FileInputStream("out.bin");
????????ObjectInputStream?bit?=?new?ObjectInputStream(fis);
????????bit.readObject();
????}
}
執行后再看我們的dnslog平臺
在URLDNS里面其實導致反序列化的根本原因是因為hashmap重寫了readobject反序列化方法,而重寫后的readobject方法調用了putVal導致的一個利用鏈
參考文章
https://www.cnblogs.com/kuaile1314/p/13690210.html
https://www.cnblogs.com/ph4nt0mer/p/11994384.html
https://www.cnblogs.com/v1ntlyn/p/13549991.html
https://zhuanlan.zhihu.com/p/30045174
https://www.cnblogs.com/litlife/p/12596286.html
總結
以上是生活随笔為你收集整理的java system.in 输入不回显_Java安全之URLDNS链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米最强旗舰!小米13 Ultra 4月
- 下一篇: 王传福放话!比亚迪目标是今年年底成为中国