【漏洞分析】Struts2高危漏洞S2-048分析
本次漏洞觸發(fā)點在:
org.apache.struts2.s1.Struts1Action.execute() 方法中,如下圖所示。
org.apache.struts2.s1.Struts1Action 類為一個 Wrapper 類,用于將 Struts1 時代的 Action 包裝成為 Struts2 中的 Action,以讓它們在 struts2 框架中繼續(xù)工作。
在 Struts1Action 的 execute 方法中,會調(diào)用對應的 Struts1 Action 的 execute 方法(***個紅色箭頭處)。在調(diào)用完后,會檢查 request 中是否設置了 ActionMessage,如果是,則將會對 action messages 進行處理并回顯給客戶端。處理時使用了 getText 方法,這里就是漏洞的觸發(fā)點。所以漏洞的觸發(fā)條件是:在 struts1 action 中,將來自客戶端的參數(shù)值設置到了 action message 中。
在官方提供的 Showcase 中,就存在漏洞,如下圖:
getText 方法的主要作用就是實現(xiàn)網(wǎng)站語言的國際化,它會根據(jù)不同的 Locale 去對應的資源文件里面獲取相關文字信息(這些文件信息一般保存在 .properties 文件中),這些文字信息往往會回顯至客戶端。
Action messages 會通過 getText 方法最終進入 com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(String, Locale, ValueStack, Object[], String) 方法,如下:
此方法會將 action message 傳入 com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack)。com.opensymphony.xwork2.util.TextParseUtil.translateVariables(String, ValueStack) 方法主要用于擴展字符串中由 ${} 或 %{} 包裹的 OGNL 表達式,這里也就是 OGNL 的入口,隨后 action message 將進入 OGNL 的處理流程,漏洞被觸發(fā)。
關于 POC
1
|
暫不公布 |
總結(jié)
該漏洞觸發(fā)需要非默認插件 struts2-struts1-plugin
需要手動尋找程序中將客戶端參數(shù)值添加入 action message 的點