@@ -26,9 +26,9 @@ https://github.com/cn-panda/JavaCodeAudit
2626
2727导入项目,可以得到以下目录:
2828
29- ![ [ Pasted image 20211113151342 .png]]
29+ ![ 1 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/1.png )
3030
31- ![ [ Pasted image 20211113151348 .png]]
31+ ![ 2 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/2.png )
3232
3333项目是一个为了体现文件包含而特地写的一些功能,比如从本地引入文件、从远程引入文件等,此外,还有 Springboot+thymeleaf 的文件包含测试项目。
3434
@@ -97,17 +97,17 @@ File Include Test Page. <br>
9797
9898当我们令` file ` 的参数值为` data.txt ` 时,可以得到该文件的内容,如下图所示:
9999
100- ![ [ Pasted image 20211108194803 .png]]
100+ ![ 3 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/3.png )
101101
102102但是这里有个问题,就是这里包含的路径实际上只能是该 web 路径下的文件,并且该文件的类型只能是文本类型,如` jsp ` 、` txt ` 等,不支持图片等类型的文件。
103103
104104当尝试访问一个图片资源的时候,就会报错:
105105
106- ![ [ Pasted image 20211108211234 .png]]
106+ ![ 4 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/4.png )
107107
108108并且不支持解析.java 文件(原理上面已说过):
109109
110- ![ [ Pasted image 20211108211604 .png]]
110+ ![ 5 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/5.png )
111111
112112其次再来看看远程包含:
113113
@@ -133,43 +133,43 @@ This is my JSP page. <br>
133133
134134远程包含不但可以包含远程文件,同时可以包含本地文件,如下:
135135
136- ![ [ Pasted image 20211108221206 .png]]
136+ ![ 6 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/6.png )
137137
138- ![ [ Pasted image 20211108221136 .png]]
138+ ![ 7 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/7.png )
139139
140140包括图片资源(不解析图片,但是有图片的数据):
141141
142- ![ [ Pasted image 20211108221254 .png]]
142+ ![ 8 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/8.png )
143143
144144解析远程文件:
145145
146- ![ [ Pasted image 20211108221718 .png]]
146+ ![ 9 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/9.png )
147147
148- ![ [ Pasted image 20211108221740 .png]]
148+ ![ 10 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/10.png )
149149
150150深入利用,首先在 XSS 平台生成一个利用的 xss payload,然后在远程创建一个 html 页面,这个 html 里面镶嵌了这个 xss js,然后利用包含漏洞远程访问:
151151
152- ![ [ Pasted image 20211108222323 .png]]
152+ ![ 11 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/11.png )
153153
154154成功获取到了 cookie
155155
156- ![ [ Pasted image 20211108222148 .png]]
156+ ![ 12 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/12.png )
157157
158158除此之外,还可以利用 file、netdoc 协议来实现任意文件读取的目的:
159159
160- ![ [ Pasted image 20211109142811 .png]]
160+ ![ 13 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/13.png )
161161
162- ![ [ Pasted image 20211109143837 .png]]
162+ ![ 14 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/14.png )
163163
164164那么 java 文件包含漏洞做到的仅仅如此而已吗?
165165
166166答案是否定的,在前文中我提到 ` <c:import> ` 的 url 属性值可以使用 ` java.net.URL ` 类所支持的任何协议,因此 jar 协议也自然在其中,对 jar 协议的利用,通常是在 XXE 漏洞中,实际上在 java 的文件包含漏洞中也可以利用。
167167
168168利用方式和` K0rz3n ` 师傅提到的[ 利用 jar 上传文件] ( https://xz.aliyun.com/t/3357 ) 大差不差,同样是利用临时文件,然后报错获取临时文件的路径,由于时间关系,我这里只是做了个简单的测试:
169169
170- ![ [ Pasted image 20211109150146 .png]]
170+ ![ 15 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/15.png )
171171
172- ![ [ Pasted image 20211109150131 .png]]
172+ ![ 16 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/16.png )
173173
174174可以看到临时文件确实存在于目录下,只不过由于是临时的,所以很快自动删除了,只要使用某种技巧(` K0rz3n ` 师傅提到),就能够使得文件长时间存在于目标服务器中,但是如何利用上传的文件,也是一个问题,这里我也没深入思考其利用方式,有兴趣的朋友可以思考一番
175175
@@ -186,19 +186,19 @@ public String path(@RequestParam String language) {
186186
187187这是 SpringBoot 项目中某个控制器的部分代码片段,thymeleaf 的目录如下:
188188
189- ![ [ Pasted image 20211110112827 .png]]
189+ ![ 17 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/17.png )
190190
191191因此从代码逻辑中基本上可以判断,这实际上是一个语言界面选择的功能,如果是中文阅读习惯者,那么会令` language ` 参数为` cn ` ,如果是英文阅读习惯者,那么会令` language ` 参数为` en ` ,代码逻辑本身实际上是没有什么问题的,但是这里采用的是 thymeleaf 模板,就出现了问题。
192192
193193在springboot + thymeleaf 中,如果视图名可控,就会导致漏洞的产生。其主要原因就是在控制器中执行 return 后,Spring 会自动调度 Thymeleaf 引擎寻找并渲染模板,在寻找的过程中,会将传入的参数当成SpEL表达式执行,从而导致了远程代码执行漏洞。这里不主要分析 Thymeleaf 模板注入漏洞的原理,所以简单说下其渲染的流程:
194194
195195- createView() 根据视图名创建对应的View
196196
197- ![ [ Pasted image 20211110170330 .png]]
197+ ![ 18 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/18.png )
198198
199199- renderFragment() 根据视图名解析模板名称
200200
201- ![ [ Pasted image 20211110170416 .png]]
201+ ![ 19 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/19.png )
202202
203203所以可以跟进` renderFragment() ` 来看看如何解析模板名称的:
204204
@@ -244,7 +244,7 @@ public String path(@RequestParam String language) {
244244
245245所以我们直接令` language ` 参数的值为一个我们指定的SpEL表达式,就可以实现 RCE:
246246
247- ![ [ Pasted image 20211110211919 .png]]
247+ ![ 20 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/20.png )
248248
249249那么如果我们假设存在一个可以上传非 jsp 类型文件的漏洞,并且上传的位置可控,控制器的逻辑如下:
250250
@@ -275,7 +275,7 @@ public String test(@RequestParam String path) {
275275
276276访问即可达到PHP 中的文件包含效果:
277277
278- ![ [ Pasted image 20211110214111 .png]]
278+ ![ 21 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/21.png )
279279
280280这种情况,在实际情况下我遇到过,只不过非 jsp文件 类型的任意位置的文件上传漏洞比较少见,可能遇到这种情况的人比较少,所以也不具有代表性。
281281
@@ -289,7 +289,7 @@ public String test(@RequestParam String path) {
289289
290290所以在这里,如果存在一个模板文件中的参数可控,即:
291291
292- ![ [ Pasted image 20211110222035 .png]]
292+ ![ 22 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/22.png )
293293
294294并且控制器中的逻辑为:
295295
@@ -303,7 +303,7 @@ public String path(@RequestParam String exp, Model model) {
303303
304304同样可以实现 RCE 效果:
305305
306- ![ [ Pasted image 20211110222014 .png]]
306+ ![ 23 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/23.png )
307307
308308这里介绍的仅仅是原理是类似于文件包含的 thymeleaf 漏洞,实际上这类的漏洞有专门的名称——SSTI(模板注入漏洞)
309309
@@ -319,11 +319,11 @@ public String path(@RequestParam String exp, Model model) {
319319
320320在上文中我们提到,` createView() ` 方法的作用是根据视图名创建对应的` View ` ,实际上 在该方法中,Thymeleaf 对` redirect: ` 和` forward: ` 有特殊处理:
321321
322- ![ [ Pasted image 20211110171737 .png]]
322+ ![ 24 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/24.png )
323323
324324跟进RedirectView这个重定向类,然后可以发现:
325325
326- ![ [ Pasted image 20211110171640 .png]]
326+ ![ 25 .png] ( https://github.com/cn-panda/JavaCodeAudit/blob/master/%E3%80%9006%E3%80%91%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E9%99%85%E6%A1%88%E4%BE%8B%E4%BB%8B%E7%BB%8D/img/25.png )
327327
328328简单来说这里的逻辑会根据填写的返回值来判断是重定向(` redirect: ` )还是请求转发(` forward: ` ),然后调用原生的Servlet的重定向或者请求转发方法,从而就不会进入执行SpEL表达式的流程,也就不会产生所谓的漏洞了。
329329
@@ -345,4 +345,4 @@ jsp 的文件包含实际上不好找,我在 CVE 官网上找到的基本上
345345https://vulncat.fortify.com/zh-cn/detail?id=desc.dataflow.dotnet.dangerous_file_inclusion
346346https://xz.aliyun.com/t/3357
347347http://x2y.pw/2020/11/15/Thymeleaf-模板漏洞分析/
348- https://waylau.gitbooks.io/thymeleaf-tutorial/content/docs/standard-expression-syntax.html
348+ https://waylau.gitbooks.io/thymeleaf-tutorial/content/docs/standard-expression-syntax.html
0 commit comments