LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 安全 >

最新struts2命令执行漏洞分析

时间:2013-07-18 13:01来源:360 编辑:360 点击:
在 struts2 中, DefaultActionMapper 类支持以 action: 、 redirect: 、 redirectAction: 作为导航或是重定向前缀,但是这些前缀后面同时可以跟 OGNL 表达式,由于 struts2 没有对这些前缀做过滤,导致利

在struts2中,DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。

这里以“redirect:”前缀举例,struts2会将“redirect:”前缀后面的内容设置到redirect.location当中,这里我们一步步跟踪,首先是这个getMapping函数跟入

 

这里一直到这个handleSpecialParameters(),继续跟入

 

这里真正传入OGNL表达式是在这个parameterAction.execute()中,继续跟入来到DefaultActionMapper.java的代码

 

这里key.substring(REDIRECT_PREFIX.length())便是前缀后面的内容也就是OGNL表达式,struts2会调用setLocation方法将他设置到redirect.location中。然后这里调用mapping.setResult(redirect)将redirect对象设置到mapping对象中的result里,如图所示

 

然而上面的过程只是传递OGNL表达式,真正执行是在后面,这里是在FilterDispatcher类中的dispatcher.serviceAction()方法,这里的mapping对象中设置了传入的OGNL

这里跟入方法最终会在TextParseUtil这个类的调用stack.findValue()方法执行OGNL。

PoC:
http://192.168.237.131:8080/u/hello1.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'calc'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.getWriter()}
 
漏洞重现:

转载请保留固定链接: https://linuxeye.com/security/1833.html

------分隔线----------------------------
标签:struts2
栏目列表
推荐内容