点击T00ls关注 查看更多
首先恭喜T00LS十周年:)
背景
在一次对某客户的检测过程中,发现了一个由Spring应用开发程序员错误书写代码导致的安全问题。过后对该漏洞进行相应的研究,了解此漏洞背景知识是要先了解基础的MVC开发模式。
具体相关依赖知识在此就不进行赘述。
1. Spring MVC的报错页面
在对客户网站的参数进行常规异常输入时,遇见了一个非常让人困惑的HTTP 500错误页面。 为什么一个参数能导致/Spring提供View的功能错误?
2.Debug回溯
以下为Exception回溯内容:
于是下载了Spring的源代码进行分析,此串字符在Spring中只有3至4次出现的地方,所以较好定位报错地点。
而且报错页面没有被关闭,所以通过上图也能直接找到引发错误的原因为以下代码行。
render()函数源代码:
最终调用到的就是render函数。
先需要了解一下Spring MVC的整个调用流程。
在render()函数中,最终会追踪到函数createView()。
createView()函数原型:
可以看到Spring对两种前缀(forward:与redirect)进行了特殊处理。
:
根据视图名到指定的位置获取对应的模板文件
:
根据视图名跳转
在处理时会再调用一次InternalResourceView,而InternalResourceView是Spring中用来加载Jar包中内部资源用的,所以可以用来做Jar包内的任意文件读取。
不过以上InternalResourceView受配置影响:
例:
如果此时调用InternalResourceView实际上会在前面加上前缀,所以在配置suffix的情况下,可能就不能读取任意Jar包内的文件了。
3、危 害
所以如上所述的这些东西到底能造成什么危害呢?
初步想法为:
写了一个本地测试有漏洞的代码Demo验证以上想法。
(1) 权限认证Bypass [成功]
假设采用了装饰器(Decorator)来进行敏感功能的统一权限认证,直接使用view的是能够直接绕过权限认证装饰器,对敏感功能进行直接访问。
(2) 文件读取 [成功]
测试URL:http://127.0.0.1:8080/login?username=admin&password=111&view=forward:/database.properties
(3) HTTP Header Injection [失败]
由于Spring对传入程序的CRLF进行了处理。将其转化为了空格,所以该漏洞没有成功实现。
4、限 制
该漏洞有以下两点限制
无法读取Jar外的文件
如果加了suffix可能,无法读取想要的文件
对于第1点限制,有一个未经验证的想法。是否能组合CVE-2018-1271在Windows环境下对目录外的文件进行读取呢?但是由于手头边Windows环境还没有搭建好,可能需要过段时间才能进行测试:p
5、Exploit!
References
https://o2platform.files.wordpress.com/2011/07/ounce_springframework_vulnerabilities.pdf
https://danielmiessler.com/study/mvc/
领取专属 10元无门槛券
私享最新 技术干货