?

Jul 08 2017

Struts2高危漏洞S2-048動態分析

首頁 » 滲透測試 » Struts2高危漏洞S2-048動態分析   

綜述

2017年7月7日,Apache Struts發布最新的安全公告,Apache Structs2的strus1插件存在遠程代碼執行的高危漏洞,漏洞編號為CVE-2017-9791(S2-048)。攻擊者可以構造惡意的字段值通過Struts2的struts2-struts1-plugin的插件,遠程執行代碼

漏洞分析

(1) 漏洞簡介
Apache Struts2.3.x系列版本中struts2-struts1-plugin存在遠程代碼執行漏洞,進而導致任意代碼執行。
(2) 漏洞分析
官方的漏洞描述如下:

從官方的漏洞描述我們可以知道,這個漏洞本質上是在struts2-struts1-plugin這個jar包上。這個庫是用將struts1的action封裝成struts2的action以便在strut2上使用。本質原因還是在struts2-struts1-plugin包中Struts1Action.java中execute函數調用了getText函數,這個函數會執行ognl表達式,更可惡的是getText的輸入內容還是攻擊者可控的。以下分析基于struts2的官方示例struts2-showcase war包。首先Struts1Action的execute方法代碼如下,從紅框中信息可以看出其實質是調用SaveGangsterAction.execute方法,然后再調用getText(msg.getKey()….)。
1
在struts2-showcase的integration模塊下有SaveGangsterAction.java的execute方法的實現。具體如下:
2
在這個方法中就帶入有毒參數gforn.getName()放到了messages結構中,而gform.getName()的值是從客戶端獲取的。Gangsterform.getName()的實現如下:
3
我們這里傳入了${1+1}。有毒參數已經帶入,就差ognl表達式。繼續回到Struts1Action.java的execute方法下半部分,這里有getText()的入口,能清晰看到參數已經被污染,具體如下圖:
4
下面進入getText的實現函數:這個調用棧比較深,首先我們給出棧圖:
5
從Struts1action.execute函數開始,到ActionSupport的getText()方法,方法如下:
6
接著進入TextProviderSuppport.getText,接著調用其另一個重載類方法getText(),示例如下:
7
如圖所示,進入LocalizeTextUtil.findText,繼續分析其實現:從名字上也能看出其是根據用戶的配置做一些本地化的操作。代碼如下:
8
熟悉struts2的童鞋跟到這一步就能發現這就是一個很典型的ognl表達式入口,先是得到一個valueStack,再繼續遞歸得到ognl表達式的值。這里不再描述,詳情可參考官方鏈接:https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html
最后附上一個簡單的測試用例圖:
9
10

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽:這篇文章木有標簽

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «w8scan 一款模仿bugscan的掃描器 | 現代Web中的JSON劫持»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖