Skip to content

Commit 1bab3c4

Browse files
authored
Update 【Java 代码审计入门-06】文件包含漏洞原理与实际案例介绍.md
1 parent 0620d87 commit 1bab3c4

1 file changed

Lines changed: 26 additions & 26 deletions

File tree

‎【06】文件包含漏洞原理与实际案例介绍/【Java 代码审计入门-06】文件包含漏洞原理与实际案例介绍.md‎

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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 官网上找到的基本上
345345
https://vulncat.fortify.com/zh-cn/detail?id=desc.dataflow.dotnet.dangerous_file_inclusion
346346
https://xz.aliyun.com/t/3357
347347
http://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

Comments
 (0)