freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

代码审计 | RuoYi4.6.2Thymeleaf模板注入详解
2024-12-13 22:16:52
所属地 北京

1.序言

这篇文章通过对若依系统v4.6.2版本Thymeleaf模板注入的分析,学习SSTI漏洞的形成以及修复。

之前有过对若依系统v4.6.0版本漏洞的分析,所以环境搭建,注入点判断,利用方法等信息可参考文章

审计若依系统v4.6.0 https://www.freebuf.com/articles/system/416395.html,这里不再赘述。

2.利用

抓包

改包,放入paylaod

注入成功

3分析

首先,在注入点CacheController.java文件的39行进行断点,可以看到return返回了一个视图名称(fragment可控且未经过滤)

接下来我们分析fragment参数的值如何被执行

invokeForRequest方法中,开始处理用户的请求

@Nullable
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);
if (this.logger.isTraceEnabled()) {
this.logger.trace("Arguments: " + Arrays.toString(args));
}
return this.doInvoke(args);
}

随后在invokeAndHandle方法中,通过invokeForRequest函数,根据用户提供的url,调用相关的controller,并将其返回值,作为待查找的模板文件名,通过Thymeleaf模板引擎去查找,并返回给用户

public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
Object returnValue = this.invokeForRequest(webRequest, mavContainer, providedArgs);
this.setResponseStatus(webRequest);
if (returnValue == null) {
if (this.isRequestNotModified(webRequest) ||this.getResponseStatus() != null ||mavContainer.isRequestHandled()) {
this.disableContentCachingIfNecessary(webRequest);
mavContainer.setRequestHandled(true);
return;
}
} else if (StringUtils.hasText(this.getResponseStatusReason())) {
mavContainer.setRequestHandled(true);
return;
}

mavContainer.setRequestHandled(false);
Assert.state(this.returnValueHandlers != null, "No return value handlers");

try {
this.returnValueHandlers.handleReturnValue(returnValue,         this.getReturnValueType(returnValue), mavContainer, webRequest);
} catch (Exception var6) {
if (this.logger.isTraceEnabled()) {
this.logger.trace(this.formatErrorForReturnValue(returnValue), var6);
}
throw var6;
}
}

在函数中,调用handleReturnValue函数去处理返回结果。最终在handleReturnValue方法中,将controller返回值作为视图名称。代码如下:

public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
HandlerMethodReturnValueHandler handler = this.selectHandler(returnValue, returnType);
if (handler == null) {
throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());
} else {
handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
}

最终在processDispatchResult方法中,调用Thymeleaf模板引擎的表达式解析。将上一步设置的视图名称为解析为模板名称,并加载模板,返回给用户。

处理请求结果,可能包括视图渲染等后续操作

关键代码:

protected void renderFragment(Set<String> markupSelectorsToRender, Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {  
String templateName;  
Set<String> markupSelectors, processMarkupSelectors;  
ServletContext servletContext = getServletContext();  
String viewTemplateName = getTemplateName();  
ISpringTemplateEngine viewTemplateEngine = getTemplateEngine();
...
if (!viewTemplateName.contains("::")) {
templateName = viewTemplateName;
markupSelectors = null;
} else {
IStandardExpressionParser parser = StandardExpressions.getExpressionParser(configuration);

FragmentExpression fragmentExpression;
try {
fragmentExpression = (FragmentExpression)parser.parseExpression(context, "~{" + viewTemplateName + "}");
} catch (TemplateProcessingException var25) {
throw new IllegalArgumentException("Invalid template name specification: '" + viewTemplateName + "'");
}

...

4 漏洞修复

在RuoYi4.7.2版本中升级了Thymeleaf修复RCE

但是,目前Thymeleaf 3.0.12 版本,Thymeleaf3.0.14版本都已经有了绕过方式

https://cloud.tencent.com/developer/article/2204466

https://cn-sec.com/archives/3118198.html

5 总结

若依系统v4.6.2版本使用了Thymeleaf 2.0,在查找模板中,引用了用户输入的内容,且没有过滤,形成了利用链,导致了漏洞的产生。

参考文章:

https://www.freebuf.com/articles/web/248877.html

# 渗透测试 # web安全 # 系统安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录