git倉庫的tag:是使用git作版本管理的時候打的標籤,至關於一個再也不變化的,固定的分支,對應於倉庫中的一個commit。html
首先爲了復現漏洞環境,須要下載漏洞代碼,由於該漏洞主要出現 Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10 這幾個版本的struts2發行版,那麼直接從tag下checkout出來這些代碼就可以復現有漏洞的struts2,因此咱們將從struts的git倉庫中的tag下checkout代碼,這裏咱們從github上checkout出來STRUTS_2_5_10這個tag。git
同時經過網上提供的文章,咱們知道漏洞補丁主要修復的位置,使用git log查看漏洞修復後提交的內容,咱們只須要將代碼回滾到漏洞修復的前一個commit。即回退到紅框下的一個commit。github
這個時候安裝maven,進行build,web
mvn -Dmaven.test.skip=true package -DskipAssembly=trueapache
maven會自動下載依賴包,和build出來須要發佈的版本,生成的jar包是struts2-core-2.5.10.jar安全
經過使用maven新建web項目,和添加struts2支持,可以獲取到依賴度包。app
這個時候把這些包copy過來,並使用eclipse新建web工程,就可以得到一個存在漏洞的struts2工程。eclipse
struts2工程的目錄結構以下所示。maven
這個時候就能夠進行調試了。函數
在eclipse中加載上struts2的源碼,就能夠對struts2進行調試了
咱們將出錯的報文複製出來,放到burp裏頭進行調試。並在struts2的入口點打上斷點,這裏咱們打的斷點在org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter的dofilter函數上。
這裏講了struts2的執行流程以後對理解漏洞成因的理解有很大幫助。
當請求到來時,struts2會對請求作處理,將裸露的http報文轉換成本身須要的結構體,本次漏洞在這種轉化過程當中會發生轉化錯誤,並將錯誤信息存在告終構體重。轉化出錯的位置以下圖所示。存在於org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter的dofilter函數的圖中所示的代碼位置。
因爲struts2會對每個請求執行攔截器操做,當執行到FileuploadInterceptor的時候,這裏咱們看FileuploadInterceptor的intercept函數,每個攔截器都要實現這個函數。
漏洞出現的位置以下圖所示。
圖中51行,因爲multiWrapper對象如前所述,已經被parse過,且存在錯誤,因此51行執行經過,可以執行到54行,這裏就是漏洞出現的位置。
出現漏洞的函數就是LocalizedTextUtil.findText。
咱們看一下這個函數的說明。
注意第三條。
中文大意是:這個函數會去查找錯誤信息究竟是什麼,查找方式是查找出錯的對象的自己,及他的父類,若是在這些地方都沒有查找到那麼就將查找對象的其餘屬性,並把這些信息當作ognl表達式進行執行。(我猜測此處須要使用ognl表達式執行的緣由是做者認爲出錯的信息能在這些信息中,獲取這些信息,當作ognl表達式執行,而後照前面的方式繼續查找)
本案中,出錯代碼
findText(error.getClazz(), error.getTextKey(), ActionContext.getContext().getLocale(), error.getDefaultMessage(), error.getArgs()));
就是查找了error.getClazz()的class沒有找到,
後來查找了error的error.getDefaultMessage()中的信息,並把它當作ognl表達式進行執行了。這裏咱們放入了ognl表達式,並得到了命令執行的效果。因此該漏洞出現的緣由是信任了客戶提交的輸入,錯誤地將客戶的輸入放入了能夠執行ognl表達式的函數中。
本文指出了調試struts2的方法,同時標記了出錯的幾個關鍵點,讀者有興趣能夠執行單步操做,進行調試。
歡迎老司機指導findText函數的設計本意。我的認爲common-upload包返回了正確的出錯信息,struts2沒有判斷是否存在安全問題,執行了其中的錯誤信息的ognl表達式。是兩個包之間的協做問題。
http://bobao.360.cn/learning/detail/3596.html
http://bobao.360.cn/learning/detail/3587.html
http://bobao.360.cn/learning/detail/3574.html
http://blog.csdn.net/yuan_xw/article/details/7838123