referencia:
- Inyección de plantilla Spring Boot Thymeleaf para el desarrollo de seguridad de Java
- https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/
- https://github.com/veracode-research/spring-view-manipulation
La escena es cuando el nombre de la vista es controlable por el usuario,
La prueba real encontró que está relacionada con la versión de Spring boot, que está relacionada con la versión predeterminada de Thymeleaf.
bota de primavera: 1.5.1.RELEASE spring-boot-starter-thymeleaf: 2.1.5
spring boot: 2.0.0.RELEASE spring-boot-starter-thymeleaf: 3.0.9
spring boot: 2.2.0.RELEASE spring-boot- arrancador-hoja de tomillo: 3.0.11
La versión 3.x de thymeleaf solo se ve afectada.
El thymeleaf-spring5 de renderFragment 3.x versión es así:
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 + "'");
}
Y 2.x thymeleaf-spring4 es así
Configuration configuration = viewTemplateEngine.getConfiguration();
ProcessingContext processingContext = new ProcessingContext(context);
templateCharacterEncoding = getStandardDialectPrefix(configuration);
StandardFragment fragment = StandardFragmentProcessor.computeStandardFragmentSpec(configuration, processingContext, viewTemplateName, templateCharacterEncoding, "fragment");
if (fragment == null) {
throw new IllegalArgumentException("Invalid template name specification: '" + viewTemplateName + "'");
}