代码审计 | RuoYi4.6.2Thymeleaf模板注入详解

2024-12-28 78 0

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


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

应急响应沟通准备与技术梳理(Windows篇)
API安全 | GraphQL API漏洞一览
BUUCTF | reverse wp(一)
Linux基线加固:Linux基线检查及安全加固手工实操
揭秘Gamaredon APT的精准攻击:针对乌克兰调查局的网络钓鱼与多阶段攻击
特定版本Vaadin组件反序列化漏洞

发布评论