Apache Struts 2 漏洞汇总
Apache Struts2 是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行。
Struts2特征:
- 通过页面回显的错误消息来判断,页面不回显错误消息时则无效。
- 通过网页后缀来判断,如.do .action,有可能不准。
- 判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
漏洞影响版本:
影响版本 | |
S2-001 | Struts 2.0.0 - 2.0.8 |
S2-005 | Struts 2.0.0-2.1.8.1 |
S2-007 | Struts 2.0.0 - 2.2.3 |
S2-008 | Struts 2.1.0 – 2.3.1 |
S2-009 | Struts 2.1.0 - 2.3.1.1 |
S2-012 | Struts 2.1.0-2.3.13 |
S2-015 | Struts 2.0.0 - 2.3.14.2 |
S2-016 | Struts 2.0.0 – 2.3.15 |
S2-019 | Struts 2.0.0 - 2.3.15.1 |
S2-045 |
Struts2.3.5 – 2.3.31,Struts2.5 – 2.5.10 |
S2-048 | Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本 |
S2-052 |
Struts 2.1.2 - Struts 2.3.33,Struts 2.5 - Struts 2.5.12 |
S2-053 |
Struts 2.0.1-2.3.33,Struts 2.5-2.5.10 |
S2-057 |
Struts 2.3–2.3.34,Struts2.5–2.5.16 |
S2-devMode | 当Struts开启devMode时,该漏洞将影响Struts 2.1.0–2.5.1,通杀Struts2所有版本 |
S2-059 |
Struts 2.0.0 - Struts 2.5.20 |
S2-062 |
Apache Struts 2.0.0-2.5.29 |
漏洞原理
漏洞原理 | |
S2-001 | 该漏洞因用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。如注册或登录页面,提交失败后一般会默认返回之前提交的数据,由于后端使用%{value}对提交的数据执行了一次OGNL 表达式解析,所以可以直接构造 Payload进行命令执行。 |
S2-005 | s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开 |
S2-007 | age来自于用户输入,传递一个非整数给id导致错误,struts会将用户的输入当作ongl表达式执行,从而导致了漏洞 |
S2-008 | S2-008 涉及多个漏洞,Cookie 拦截器错误配置可造成 OGNL 表达式执行,但是由于大多 Web 容器(如 Tomcat)对 Cookie 名称都有字符限制,一些关键字符无法使用使得这个点显得比较鸡肋。另一个比较鸡肋的点就是在 struts2 应用开启 devMode 模式后会有多个调试接口能够直接查看对象信息或直接执行命令,但是这种情况在生产环境中几乎不可能存在,所以还是很鸡肋。 |
S2-009 | OGNL提供了广泛的表达式评估功能等功能。该漏洞允许恶意用户绕过ParametersInterceptor内置的所有保护(正则表达式,拒绝方法调用),从而能够将任何暴露的字符串变量中的恶意表达式注入进行进一步评估。ParametersInterceptor中的正则表达式将top ['foo'](0)作为有效的表达式匹配,OGNL将其作为(top ['foo'])(0)处理,并将“foo”操作参数的值作为OGNL表达式求值。这使得恶意用户将任意的OGNL语句放入由操作公开的任何String变量中,并将其评估为OGNL表达式,并且由于OGNL语句在HTTP参数中,攻击者可以使用黑名单字符(例如#)禁用方法执行并执行任意方法,绕过ParametersInterceptor和OGNL库保护。 |
S2-012 | 如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 ${param_name} 作为重定向变量,UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。 |
S2-015 | 如果一个请求与任何其他定义的操作不匹配,它将被匹配*,并且所请求的操作名称将用于以操作名称加载JSP文件。并且,1作为OGNL表达式的威胁值,{ }可以在服务器端执行任意的Java代码。 |
S2-016 | 问题主要出在对于特殊URL处理中,redirect与redirectAction后面跟上Ognl表达式会被服务器执行。 |
S2-019 | 要求开发者模式,且poc第一个参数是debug,触发点在DebuggingInterceptor上,查看intercept函数,从debug参数获取调试模式,如果模式是command,则把expression参数放到stack.findValue中,最终放到了ognl.getValue中 |
S2-045 |
Struts2默认解析上传文件的Content-Type这个header头,利用模拟上传发包,在解析错误的情况下,会执行错误信息中的OGNL代码。OGNL是应用于Java中的一个开源的表达式语言,能够访问对象方法、操作集合对象。
|
S2-048 | Apache Struts 1插件的Apache Struts 2.3.X版本中存在远程代码执行漏洞,该漏洞出现于Struts2的某个类中,该类是为了将Struts1中的Action包装成为Struts2中的Action,以保证Struts2的兼容性。在Struts2中的Struts1插件启用的情况下,远程攻击者可通过使用恶意字段值,构造特定的输入,发送到ActionMessage类中,从而导致任意命令执行,进而获取目标主机系统权限 |
S2-052 | Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,可被远程攻击。 |
S2-053 | Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。 |
S2-057 |
alwaysSelectFullNamespace为true。action元素没有设置namespace属性,或者使用了通配符。命名空间将由用户从url传递并解析为OGNL表达式,最终导致远程代码执行漏洞 |
S2-devMode | 当Struts2开启devMode模式时,将导致严重远程代码执行漏洞。如果WebService 启动权限为最高权限时,可远程执行任意命令,包括关机、建立新用户、以及删除服务器上所有文件等等。 |
S2-059 |
Apache Struts2使用某些标签时,会对标签属性值进行二次表达式解析,当标签属性值使用了%{skillName}并且skillName的值用户可以控制,就会造成OGNL表达式执行,都很弱鸡,利用条件苛刻 |
S2-062 |
如果开发人员使用%{...}语法应用强制OGNL解析,标签的某些属性仍然可被二次解析。当对标签属性中未经验证的原始用户输入进行解析时可能会导致远程代码执行。 |
漏洞利用工具:HatBoy/Struts2-Scan: Struts2全漏洞扫描利用工具 (github.com)