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文件解析漏洞在形式上非常类似,影响包括最新版本在内的各个版本,至于这个漏洞能用来干什么,就需要小伙伴们结合遇到的实际情况,自行深入分析研究了。
