Resin容器文件解析漏洞深入分析
Resin是CAUCHO公司出品的一個Application Server,對Servlet和JSP提供了良好的支持,性能也比較優良,自身采用JAVA語言開發。Resin本身包含了一個支持HTTP/1.1的WEB服務器。雖然它可以顯示動態內容,但是它顯示靜態內容的能力也非常強,性能直逼Apache httpd,許多站點都是使用該WEB服務器構建的。
Resin存在類似iis6.0的文件解析漏洞,影響全部版本,不僅能夠豐富其他高危漏洞挖掘知識庫,也給隱藏后門帶來了新的一種潛在方式。
環境搭建
官方下載地址:
Resin Download
https://caucho.com/products/resin/download
這里下載resin最新版本v4.0.65,配置遠程調試(修改`resin.properties`中的`jvm_args`):

啟動:
resin.exe -java-home "C:\Program Files\Java\jdk1.8.0_20" start

Web服務和遠程調試服務均啟動成功:


漏洞復現
漏洞表現形式上與iis6.0文件解析漏洞類似,整個復現過程非常簡單,可以在Web路徑下創建一個新的vul.jsp文件夾,然后在vul.jsp文件夾下面創建一個非jsp后綴名文件vul.txt:


訪問:

實現了JSP解析。
漏洞分析
啟動調試,定位HTTP請求的必由之路`com.caucho.server.http.HttpRequest#HttpRequest`并打下斷點:

調用棧如下:

往下走,一直到第495行,調用`getInvocation`函數:

一路往下走,最終進入了`com.caucho.server.http.AbstractHttpRequest`類的`getInvocation`函數:

進入`buildInvocation`函數,一路往下跟進:

直到進入`com.caucho.server.dispatch#mapServlet`:

提取了URL相關變量`matchResult`,進入第138行,其中的`_servletMap`如下:

0 = {UrlMap$RegexpEntry@3205} "RegexpEntry[*.jsp]"1 = {UrlMap$RegexpEntry@3206} "RegexpEntry[*.jspf]"2 = {UrlMap$RegexpEntry@3207} "RegexpEntry[*.jspx]"3 = {UrlMap$RegexpEntry@3208} "RegexpEntry[*.php]"
進入`map`函數:


通過正則表達式會匹配到提交URL路徑中的`/vul.jsp`:

從而進入jsp的解析邏輯。


從上面可以看出,`*.jsp`、`*.jspx`、`*.jspf`都存在一樣的問題,其實在resin的配置文件`conf/app-default.xml`中就已經進行了設定:

后記
Resin文件解析漏洞和以前iis6.0文件解析漏洞在形式上非常類似,影響包括最新版本在內的各個版本,至于這個漏洞能用來干什么,就需要小伙伴們結合遇到的實際情況,自行深入分析研究了。