Server-side template injection (SSTI)

Detect -> Identify -> Exploit

Detect

Fuzzing the template by using special characters commonly used in template expressions.

${{<%[%'"}}%\

Plaintext context

Injecting mathematical operations, such as ${7*7}. If the output is 49, it was evaluated server-side.

E.g.

http://website.com/?param=${7*7}

Code context

Try to append an html <tag>. Output will probably be blank.

E.g.

http://website.com/?param=data.name<tag>

Next, try to break out of the statement.

E.g.

-> "Blank output": wrong template syntax, or not vulnerable. -> Rendered correctly including <tag>: vulnerable.

Exploit

ERB RCE (Ruby)

Tornado RCE (Python)

FreeMarker RCE (Java)

Handlebars RCE (Node/JS)

See http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html.

Django Templates (Python)

See also:

Last updated