前言
最近在做一个代码审计项目,听同事说以前这个项目被挖过java模板注入RCE漏洞。突然发现以前没接触过java模板注入这个漏洞类型,因此做一个总结。本文不关注漏洞产生原理,只关注怎么用。
容易出现java模板注入的三方组件
FreeMarker
测试代码:
1 | package com.freemarker; |
发现${1+1}为2说明ftl解析成功,当我们将templateContent设置为指定值的时候可以达成命令执行。
POC如下:
1 | poc1: |
简单解析一下以上的poc,拿下面的这个举例
1 | <#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")} |
一直debug会发现,最终会调用到freemarker.template.utility.Execute类的exec方法,而入参则为[“calc.exe”]
写在<#assign value=”freemarker.template.utility.Execute”?new()>中的value有一个限制,即需要实现freemarker.template.TemplateModel,否则无法被实例化,如下图所示:
而当主动设置configuration.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);时,命令以上三个poc的均失效
可使用<#include>标签进行文件读取,不过此文件读取不能跨越根目录
1 | <#include "1.txt"> 1.txt与src同目录 |
Thymeleaf
Themeleaf看https://github.com/veracode-research/spring-view-manipulation即可,作者这里不做重复劳动了,截个演示图:
Velocity
hellovelocity.vm 命令执行并回显poc
1 | #set($x='')## |
测试代码 (hellovelocity.vm放在编译好的.class的根目录)
1 | package com.velocity; |
总结
之后代码审计之前可以先搜一下有无以上这些命令注入的jar包,如果有的话首先考虑能不能根据此进行利用。
以上三个项目的源码都放到github上了,整合为了一个项目,需要的可以下载下来进行测试: