|
11.jpg (97.69 KB, 下載次數(shù): 428)
下載附件
黑客
2012-12-19 22:06 上傳
2010年7月exploitdb爆出的《Struts2/XWork < 2.2.0 Remote Command Execution Vulnerability》,可以稱之為神一樣的漏洞,攻擊者只要構(gòu)造出合適的語句,就有很大的幾率獲得系統(tǒng)權(quán)限(System或者root,因為tomcat默認都會以這樣的權(quán)限運行),而且時至今日存在這個漏洞的網(wǎng)站仍然大有存在。本文將從源碼層面簡單的分析這個漏洞形成的根本原因。
0x02 Ognl表達式實現(xiàn)代碼執(zhí)行
Ognl表達式是一種基于Java的功能強大的表達式。通過使用它,我們能夠通過表達式存取Java對象樹中的任意屬性和調(diào)用Java對象樹的方法,可以輕松解決在數(shù)據(jù)流轉(zhuǎn)的過程中所碰到的各種問題。但是在實際使用中,編程人員更多使用的是Ognl的數(shù)據(jù)流轉(zhuǎn)傳輸?shù)墓δ,卻忘記了Ognl表達式可以執(zhí)行Java代碼的功能。下面我們來通過一個常用的方法來看下它的實現(xiàn)過程。
public class Login extends ActionSupport{
public String execute() {
ActionContext AC = ActionContext.getContext();
Map Parameters = (Map)AC.getParameters();
String[] username = (String[])Parameters.get("username");
System.out.println(AC.getValueStack().findValue(username[0]));
return SUCCESS;
}
}
上面這段代碼是我自己搭建的一個Struts2實現(xiàn)的簡單java web功能的action部分的代碼,具體功能就是,獲得用戶提交的username參數(shù),然后從值棧(Value Stack)中找到符合參數(shù)值的內(nèi)容,并打印。紅色字體部分的findValue方法是關(guān)鍵點,下面我將在這句代碼中加上斷點,來跟蹤分析它的行為。
跟蹤進入OgnlValueStack文件中的findValue(String expr)方法,關(guān)鍵代碼如下:
Object value = ognlUtil.getValue(expr, context, root);
繼續(xù)深入追蹤進入OgnlUtil文件,看到如下代碼:
public Object getValue(String name, Map context, Object root) throws OgnlException {
return Ognl.getValue(compile(name), context, root);
}
紅色部分為Ognl類自帶的方法,其作用是根據(jù)表達式(參數(shù)1),在上下文(參數(shù)2)和指定類中(參數(shù)3)查找響應的內(nèi)容,并返回,若沒有則返回空。在查詢的過程中,表達式會被執(zhí)行,這使得攻擊者有可乘之機,可以利用這個方法來執(zhí)行一些惡意的行為。
0x03利用實現(xiàn)
還是使用之前部分構(gòu)造的代碼,搭建一個可以用于web交互的測試平臺。通過傳遞名為username的參數(shù)來看下這個函數(shù)的威力。提交如下url:
http://target:8080/Login.action?username='#_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec('calc'))'
在目標服務器中,彈出了計算器
我們所傳遞的內(nèi)容被作為參數(shù)傳遞給了AC.getValueStack().findValue,之后它的內(nèi)容便被執(zhí)行了。解釋下傳入的語句作用,首先是給#_memberAccess["allowStaticMethodAccess"]變量賦予true值,這個變量是Xwork用于管理Ognl權(quán)限類中的成員,它控制Ognl是否可以執(zhí)行Java的靜態(tài)方法。第二句調(diào)用Java方法執(zhí)行系統(tǒng)調(diào)用,“@”是Ognl調(diào)用Java靜態(tài)方法的標識。
0x04總結(jié)
Ognl被用戶Xwork和Struts框架的核心代碼中,在這些框架中很多地方都存在findValue的調(diào)用,例如:Struts的校驗框架,如果類型不匹配則默認也會調(diào)用findValue函數(shù)來檢索用戶輸入的內(nèi)容。2010年爆出的Struts2遠程代碼執(zhí)行和其之后出現(xiàn)的代碼執(zhí)行問題,都和這個函數(shù)有關(guān)系。Struts2漏洞淺析之Ongl代碼執(zhí)行分析灰鴿子論壇www.dumiaotech.com |
|