1. 程式人生 > >Apache Struts2再爆高危漏洞

Apache Struts2再爆高危漏洞

struts2中,DefaultActionMapper類支援以"action:""redirect:""redirectAction:"作為導航或是重定向字首,但是這些字首後面同時可以跟OGNL表示式,由於struts2沒有對這些字首做過濾,導致利用OGNL表示式呼叫java靜態方法執行任意系統命令。

這裡以“redirect:”字首舉例,struts2會將“redirect:”字首後面的內容設定到redirect.location當中,這裡我們一步步跟蹤,首先是這個getMapping函式跟入

truts框架是Apache基金會Jakarta專案組的一個Open Source專案,它採用MVC模式,幫助java開發者利用J2EE開發Web應用。Struts框架廣泛應用於運營商、政府、金融行業的入口網站建設,作為網站開發的底層模版使用,目前大量開發者利用j2ee開發web應用的時候都會利用這個框架。Apache Struts2 是第二代基於Model-View-Controller (MVC)模型的JAVA企業級WEB應用框架。

  根據分析結果,此問題源於Apache Struts2對引數action的值redirect以及redirectAction沒有正確過濾,導致ognl程式碼執行。Apache Struts2的action:、redirect:和redirectAction:字首引數在實現其功能的過程中使用了Ognl表示式,並將使用者通過URL提交的內容拼接入Ognl表示式中,遠端攻擊者可以通過構造惡意URL來執行任意Java程式碼,進而可執行任意命令。redirect:和redirectAction:此兩項字首為Struts預設開啟功能。

此次爆出的高危漏洞,受影響Apache Struts2版本: Struts 2.0.0 - Struts 2.3.15。


 

這裡一直到這個handleSpecialParameters(),繼續跟入

 

這裡真正傳入OGNL表示式是在這個parameterAction.execute()中,繼續跟入來到DefaultActionMapper.java的程式碼

 

這裡key.substring(REDIRECT_PREFIX.length())便是字首後面的內容也就是OGNL表示式,struts2會呼叫setLocation方法將他設定到redirect.location中。然後這裡呼叫mapping.setResult(redirect)redirect物件設定到mapping物件中的result

裡,如圖所示

 

然而上面的過程只是傳遞OGNL表示式,真正執行是在後面,這裡是在FilterDispatcher類中的dispatcher.serviceAction()方法,這裡的mapping物件中設定了傳入的OGNL

這裡跟入方法最終會在TextParseUtil這個類的呼叫stack.findValue()方法執行OGNL

PoC

漏洞重現: