@Dukebf
2017-08-27T15:45:13.000000Z
字数 4655
阅读 3374
Struts2
漏洞
前人轮子
Struts2 历史 RCE 漏洞回顾不完全系列
S2-009
Struts2 s2-032远程代码执行分析
Struts2远程代码执行漏洞(S2-033)
Struts2远程命令执行漏洞 S2-045
S2-046漏洞调试及初步分析
Struts2高危漏洞S2-048动态分析
Struts2(S2-048)漏洞POC
Struts2各个版本下载
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts2框架存在多个远程代码执行(S2-005、S2-009、S2-013、S2-016、S2-019、S2-020、S2-037、devmode)
官方链接:https://struts.apache.org/docs/s2-001.html
影响版本:Struts 2.0.0 - Struts 2.0.8
修复摘要:数据 re-display 时禁止执行 OGNL 表达式
该漏洞其实是因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
官方链接:https://struts.apache.org/docs/s2-007.html
影响版本:Struts 2.0.0 - Struts 2.2.3
修复摘要:在转换的过程中进行字符过滤
当配置了验证规则 -validation.xml 时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL 表达式解析并返回。
官方链接:https://struts.apache.org/docs/s2-008.html
影响版本:Struts 2.1.0 - Struts 2.3.1
修复摘要:添加参数名和 Cookie 名白名单 acceptedParamNames = “[a-zA-Z0-9.][()_’]+”;
S2-008 涉及多个漏洞,Cookie 拦截器错误配置可造成 OGNL 表达式执行,但是由于大多 Web 容器(如 Tomcat)对 Cookie 名称都有字符限制,一些关键字符无法使用使得这个点显得比较鸡肋。另一个比较鸡肋的点就是在 struts2 应用开启 devMode 模式后会有多个调试接口能够直接查看对象信息或直接执行命令,正如 kxlzx 所提这种情况在生产环境中几乎不可能存在,因此就变得很鸡肋的,但我认为也不是绝对的,万一被黑了专门丢了一个开启了 debug 模式的应用到服务器上作为后门也是有可能的。
例如在 devMode 模式下直接添加参数 ?debug=command&expression= 会直接执行后面的 OGNL 表达式.
CVE 编号:CVE-2011-3923
漏洞类型:远程代码执行
漏洞级别:高危
漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
影响版本:Struts 2.0.0 - Struts 2.3.1.1
POC
官方链接:https://struts.apache.org/docs/s2-012.html
影响版本:Struts 2.0.0 - Struts 2.3.13
修复摘要:默认禁用 OGNLUtil 类的 OGNL 表达式执行
如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 {param_name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行.
官方链接:https://struts.apache.org/docs/s2-013.html, https://struts.apache.org/docs/s2-014.html
影响版本:Struts 2.0.0 - Struts 2.3.14 (Struts 2.3.14.1)
修复摘要:在对标签进行请求参数操作时禁用 OGNL 表达式解析
Struts2 标签中 和 都包含一个 includeParams 属性,其值可设置为 none,get 或 all,参考官方其对应意义如下:
若设置了 includeParams="get" 或者 includeParams="all",在获取对应类型参数时后端会对参数值进行 OGNL 表达式解析,因此可以插入任意 OGNL 表达式导致命令执行
官方链接:https://struts.apache.org/docs/s2-016.html
影响版本:Struts 2.0.0 - Struts 2.3.15
修复摘要:删除 “action:”,”redirect:”,”redirectAction:” 这些前置前缀调用
DefaultActionMapper 类支持以 action:,redirect: 和 redirectAction: 作为访问前缀,前缀后面可以跟 OGNL 表达式,由于 Struts2 未对其进行过滤,导致任意 Action 可以使用这些前缀执行任意 OGNL 表达式,从而导致任意命令执行,经测试发现 redirect: 和 redirectAction: 这两个前缀比较好容易构造出命令执行的 Payload
官方链接:https://struts.apache.org/docs/s2-029.html
影响版本:Struts 2.0.0 - Struts 2.3.16
修复摘要:限制传入标签属性的值,对其进行合规的正则验证
简单的说就是当开发者在模版中使用了类似如下的标签写法时,后端 Struts2 处理时会导致二次 OGNL 表达式执行的情况:
<s:textfield name="%{message}"></s:textfield>
这里需要注意的是,仅当只有 name 属性这样写的情况下才能触发 OGNL 表达式执行,并且该标签中不能显示写有 value 属性。
CVE 编号:CVE-2016-3087
漏洞类型:远程代码执行
漏洞级别:高危
漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
影响版本:Struts 2.3.20 – Struts 2.3.28 (不包括 2.3.20.3和 2.3.24.3)。2.3.28.1版本默认不启用"enableOGNLEvalExpression", 当存在以下配置时可触发该漏洞
REST插件并且开启了动态方法执行.
检查Struts2的配置文件struts.xml,确认“struts.enable.DynamicMethodInvocation” 是否为“true”,如为“true”,且版本在受影响版本范围内,则说明受影响,否则不受影响。
CVE 编号: CVE-2016-4438
漏洞类型:远程代码执行
漏洞级别:高危
漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
影响版本:Struts 2.3.20 – Struts 2.3.28 (不包括 2.3.20.3和 2.3.24.3)。
影响所有使用了REST插件的用户(不包括struts 2.25),所以s2-037是s2-033的升级版
在上一个版本里面也是method出的问题,当时是加入了cleanupActionName方法进行过滤,如果这个地方要修复,也可以加入这个方法过滤一下即可。更新至官方struts2.3.29
CVE 编号: CVE-2017-5638
漏洞类型:远程代码执行
漏洞级别:高危
漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
影响版本:struts2.3.5 – struts2.3.31 ,struts2.5 – struts2.5.10
恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。
漏洞关键点
1.基于Jakarta(Jakarta Multipart parser)插件的文件上传功能
2.恶意攻击者精心构造Content-Type的值
检测方式查看web目录下/WEB-INF/liS2-046漏洞调试及初步分析b/目录下的struts-core.x.x.jar ,如果这个版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之间则存在漏洞,
更行至Strusts2.3.32或者Strusts2.5.10.1,或使用第三方的防护设备进行防护。
临时解决方案:删除commons-fileupload-x.x.x.jar文件(会造成上传功能不可用)。
S2-046漏洞和S2-045漏洞非常相似,都是由报错信息带入了buildErrorMessage这个方法造成的。存在两个触发点:
1.严格过滤 Content-Type 、filename里的内容,严禁ognl表达式相关字段。
2.如果您使用基于Jakarta插件,请升级到Apache Struts 2.3.32或2.5.10.1版本。(强烈推荐)
3.使用pell、cos等其它multipart解析器
4.弃坑,使用SpringMV
漏洞编号: S2-0048
CVE 编号: CVE-2017-9791
影响版本: Struts 2.3.x
Apache Struts2.3.x系列版本中struts2-struts1-plugin存在远程代码执行漏洞,进而导致任意代码执行.