Google Web Toolkit簡稱(GWT),是一款開源Java軟體開發架構。今天這篇文章會介紹如何在這樣的環境中通過注入表達式語句進而導緻的高危漏洞。
在WEB-INF/web.xml中,我發現了以下的web端點映射:
我們可以從上面代碼中看到引用了伺服器映射。由于GWT可以通過定義用戶端以便于表示用戶端能夠進行哪些通路。我們看看這些用戶端類com.aaa.bbb.ccc.ddd.client:
通過以上代碼我們可以看到有三個函數,是以把它們單獨拿出來,看看它們的各自功能都是什麼。在ServiceImpl的主函數中,我們找到了如下代碼:
在這段代碼中我們通過輸入字元串來更改"MibWidgetBeanName"屬性。除了這一點,好像沒有什麼可以利用的。我們繼續看setMibNodesInfo函數:
這個函數需要一個MIBNodeModel類型的一個清單。mibNodeModelList2MibNodeList這個方法會檢查我們輸入的清單是否符合規範,并且根據清單的一個元素的值傳回不同的值。
如果清單是空,這個函數會定義一個新清單,并且将内容設定為MIBNodeModel的預設值。然後getBeanByName函數就會被調用。繼續看看這一函數吧
由于這是一個私有函數,是以我們不能通過用戶端直接檢視到這個函數的内容。在第8行我們可以了解到這裡再次使用了”MibWidgetBeanName”屬性,将一個字元串存儲到了localObject2中。
localObject2這個變量稍後會在第14行被用到去接受一個語言表達式。很明顯,這是一個經典的表達式注入漏洞,不過前提是先反彙編出代碼呀~
首先,這不是一個有傳回值的語言表達式注入漏洞。這就意味着你不知道它是不是已經執行你輸入的指令。是以,我将它認為是語言表達式盲注。
我通過一個簡單的例子進行說明,假如我們一個JSF(java伺服器架構)存在這樣的一個漏洞,那麼漏洞代碼會類似下方:
那麼,通過以下攻擊代碼就可以實作攻擊
由于浏覽器會将"+"号轉換為空格,是以我們對"+"号進行url編碼,如果我們得到的結果是10,那麼我們就知道伺服器已經執行這一個"9+1"這個指令。使用數學表達式進行注入檢測是burpsuit檢測注入的方法。
但是,在上述我們進行審計的代碼當中,我們是不是不能去輕易的判斷他是不是存在語言表達式漏洞?當然不是,我們還有其他方法。通過查找JSF說明文檔,我發現了一些特别棒的函數,能夠友善我們在不發出http請求确定是否存在EL注入。
Oracle官方文檔陳述道你可以在FacesContext對象中使用getExternalContext方法。這個方法會傳回一個ExternalContext類型的值,它允許我們設定特定對象的響應屬性。當我檢視文檔時,這兩個函數引起了我的注意:
是以我們可以通過設定這個特定字元串為下面java代碼:
如果響應狀态值為302,重定向到了”http://srcincite.io/ “,那麼我們就可以确定存在漏洞。
我們第一個請求是對MibWidgetBeanName屬性進行指派
通過傳回響應為”//ok[[],0,6]”可以了解到,我們對GWT注意已經成功。然後第二個請求觸發存放在session中的字元串。但是,當我們發送請求之前,因為setMibNodesInfo函數傳入的是一個複雜的變量類型,我們需要檢視被保護檔案的源代碼,了解一下允許送出的類型。在[strongname].gwt.rpc檔案中,我找到了在數組中可以送出的類型: java.util.ArrayList/382197682。
現在我們可以發送我們的請求資料了
正确的傳回包内容應該和下面相似:
當然,能夠重定向說明已經執行成功了。但是我們需要的是得到shell,在這篇文章http://blog.mindedsecurity.com/2015/11/reliable-os-shell-with-el-expression.html可以使用ScriptEngineManager的腳本執行java代碼。不過他們的代碼都特别長,是以我使用相同的方法自己寫了一個
更新MibWidgetBeanName屬性值,然後使用setMibNodesInfo再一次除非這個字元串,然後得到系統權限
觸發語言表達式:

這一漏洞幾乎不可能在黑盒滲透測試中被發現。像burp suite這樣的工具不會發現這樣的漏洞,尤其是在考慮到字元串儲存到seesion中這種情況。
随着網絡技術的進步,我們對自動化的依賴越來越大, 在這一領域我們需要更多知識,技能以及工具。
http://srcincite.io/blog/2017/05/22/from-serialized-to-shell-auditing-google-web-toolkit-with-el-injection.html
轉載請聯系作者并注明出處!
Ms08067安全實驗室專注于網絡安全知識的普及和教育訓練。團隊已出版《Web安全攻防:滲透測試實戰指南》,《内網安全攻防:滲透測試實戰指南》,《Python安全攻防:滲透測試實戰指南》,《Java代碼安全審計(入門篇)》等書籍。
團隊公衆号定期分享關于CTF靶場、内網滲透、APT方面技術幹貨,從零開始、以實戰落地為主,緻力于做一個實用的幹貨分享型公衆号。
官方網站:https://www.ms08067.com/
掃描下方二維碼加入實驗室VIP社群
加入後邀請加入内部VIP群,内部微信群永久有效!