hacktricks/pentesting-web/saml-attacks/saml-basics.md

186 lines
12 KiB
Markdown
Raw Normal View History

{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
# SAML Огляд
**Мова маркування безпеки (SAML)** дозволяє використовувати постачальників ідентичності (IdP) для надсилання облікових даних авторизації постачальникам послуг (SP), що полегшує одноразовий вхід (SSO). Цей підхід спрощує управління кількома входами, дозволяючи використовувати один набір облікових даних на кількох веб-сайтах. Він використовує XML для стандартизованого зв'язку між IdP та SP, пов'язуючи аутентифікацію особи користувача з авторизацією послуг.
2024-03-29 18:49:46 +00:00
## Порівняння між SAML та OAuth
- **SAML** орієнтований на надання підприємствам більшого контролю над безпекою входу SSO.
- **OAuth** розроблений для більшої зручності використання на мобільних пристроях, використовує JSON і є спільною ініціативою таких компаній, як Google та Twitter.
2024-03-29 18:49:46 +00:00
# Потік аутентифікації SAML
**Для отримання додаткової інформації перегляньте повну статтю за посиланням [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)**. Це резюме:
2021-06-09 17:02:14 +00:00
Процес аутентифікації SAML включає кілька етапів, як показано на схемі:
2021-06-09 17:02:14 +00:00
2024-02-04 16:10:29 +00:00
![https://epi052.gitlab.io/notes-to-self/img/saml/saml-flow.jpg](https://epi052.gitlab.io/notes-to-self/img/saml/saml-flow.jpg)
2024-03-29 18:49:46 +00:00
1. **Спроба доступу до ресурсу**: Користувач намагається отримати доступ до захищеного ресурсу.
2. **Генерація запиту SAML**: SP не розпізнає користувача і генерує запит SAML.
3. **Перенаправлення до IdP**: Користувач перенаправляється до IdP, запит SAML проходить через браузер користувача.
2024-03-29 18:49:46 +00:00
4. **IdP отримує запит**: IdP отримує запит SAML.
5. **Аутентифікація в IdP**: IdP аутентифікує користувача.
6. **Перевірка користувача**: IdP перевіряє легітимність користувача для доступу до запитуваного ресурсу.
2024-03-29 18:49:46 +00:00
7. **Створення відповіді SAML**: IdP генерує відповідь SAML, що містить необхідні твердження.
8. **Перенаправлення до URL ACS SP**: Користувач перенаправляється до URL служби споживання тверджень (ACS) SP.
2024-03-29 18:49:46 +00:00
9. **Перевірка відповіді SAML**: ACS перевіряє відповідь SAML.
10. **Доступ до ресурсу надано**: Доступ до спочатку запитуваного ресурсу надано.
2021-06-09 17:02:14 +00:00
2024-03-29 18:49:46 +00:00
# Приклад запиту SAML
2021-06-09 17:02:14 +00:00
Розгляньте сценарій, коли користувач запитує доступ до захищеного ресурсу за адресою [https://shibdemo-sp1.test.edu/secure/](https://shibdemo-sp1.test.edu/secure/). SP виявляє відсутність аутентифікації та генерує запит SAML:
```
2021-06-09 17:02:14 +00:00
GET /secure/ HTTP/1.1
Host: shibdemo-sp1.test.edu
2024-02-04 16:10:29 +00:00
...
2021-06-09 17:02:14 +00:00
```
Сирийний SAML запит виглядає так:
2024-02-04 16:10:29 +00:00
```xml
2021-06-09 17:02:14 +00:00
<?xml version="1.0"?>
2024-02-04 16:10:29 +00:00
<samlp:AuthnRequest ...
2021-06-09 17:02:14 +00:00
</samlp:AuthnRequest>
```
2024-03-29 18:49:46 +00:00
Ключові елементи цього запиту включають:
- **AssertionConsumerServiceURL**: Вказує, куди IdP має надіслати SAML Response після аутентифікації.
- **Destination**: Адреса IdP, куди надсилається запит.
2024-03-29 18:49:46 +00:00
- **ProtocolBinding**: Визначає метод передачі повідомлень протоколу SAML.
- **saml:Issuer**: Ідентифікує суб'єкт, який ініціював запит.
2024-03-29 18:49:46 +00:00
Після генерації SAML Request, SP відповідає з **302 перенаправленням**, направляючи браузер до IdP з SAML Request, закодованим у заголовку **Location** HTTP-відповіді. Параметр **RelayState** підтримує інформацію про стан протягом транзакції, забезпечуючи, щоб SP розпізнав початковий запит ресурсу при отриманні SAML Response. Параметр **SAMLRequest** є стиснутою та закодованою версією сирцевого фрагмента XML, що використовує стиснення Deflate та кодування base64.
2021-06-09 17:02:14 +00:00
# Приклад SAML Response
2021-06-09 17:02:14 +00:00
Ви можете знайти [повний SAML response тут](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/). Ключові компоненти відповіді включають:
2021-06-09 17:02:14 +00:00
- **ds:Signature**: Цей розділ, XML Signature, забезпечує цілісність та автентичність видавця асерції. SAML response в прикладі містить два елементи `ds:Signature`, один для повідомлення та інший для асерції.
- **saml:Assertion**: Ця частина містить інформацію про особу користувача та, можливо, інші атрибути.
- **saml:Subject**: Вказує основний суб'єкт усіх заяв у асерції.
- **saml:StatusCode**: Відображає статус операції у відповідь на відповідний запит.
- **saml:Conditions**: Деталізує умови, такі як терміни дійсності асерції та вказаного постачальника послуг.
- **saml:AuthnStatement**: Підтверджує, що IdP аутентифікував суб'єкта асерції.
- **saml:AttributeStatement**: Містить атрибути, що описують суб'єкта асерції.
2021-06-09 17:02:14 +00:00
Після SAML Response процес включає 302 перенаправлення від IdP. Це призводить до POST-запиту до URL-адреси Assertion Consumer Service (ACS) постачальника послуг. POST-запит включає параметри `RelayState` та `SAMLResponse`. ACS відповідає за обробку та валідацію SAML Response.
2021-06-09 17:02:14 +00:00
Після отримання POST-запиту та валідації SAML Response, доступ надається до захищеного ресурсу, спочатку запитаного користувачем. Це ілюструється запитом `GET` до кінцевої точки `/secure/` та відповіддю `200 OK`, що вказує на успішний доступ до ресурсу.
2021-06-09 17:02:14 +00:00
# XML Підписи
2021-06-09 17:02:14 +00:00
XML Підписи є універсальними, здатними підписувати ціле XML-дерево або конкретні елементи в ньому. Вони можуть бути застосовані до будь-якого XML-об'єкта, а не лише до елементів Response. Нижче наведені ключові типи XML Підписів:
### Основна структура XML Підпису
XML Підпис складається з основних елементів, як показано:
2024-03-29 18:49:46 +00:00
```xml
<Signature>
<SignedInfo>
<CanonicalizationMethod />
<SignatureMethod />
<Reference>
<Transforms />
<DigestMethod />
<DigestValue />
</Reference>
...
</SignedInfo>
<SignatureValue />
<KeyInfo />
<Object />
</Signature>
```
Кожен `Reference` елемент позначає конкретний ресурс, що підписується, який можна ідентифікувати за атрибутом URI.
### Типи XML підписів
1. **Enveloped Signature**: Цей тип підпису є нащадком ресурсу, який він підписує, що означає, що підпис міститься в тій же XML структурі, що й підписаний контент.
2024-03-29 18:49:46 +00:00
Приклад:
2024-02-04 16:10:29 +00:00
```xml
2024-03-29 18:49:46 +00:00
<samlp:Response ... ID="..." ... >
...
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>
2024-03-29 18:49:46 +00:00
...
</samlp:Response>
```
У enveloped signature елемент `ds:Transform` вказує, що він обгорнутий через алгоритм `enveloped-signature`.
2022-04-28 16:01:33 +00:00
2. **Enveloping Signature**: На відміну від enveloped signatures, enveloping signatures обгортають ресурс, що підписується.
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Приклад:
```xml
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
2024-03-29 18:49:46 +00:00
<samlp:Response ... ID="..." ... >
...
</samlp:Response>
</ds:Signature>
2024-03-29 18:49:46 +00:00
```
2022-04-28 16:01:33 +00:00
3. **Detached Signature**: Цей тип відокремлений від контенту, який він підписує. Підпис і контент існують незалежно, але між ними підтримується зв'язок.
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Приклад:
```xml
<samlp:Response ... ID="..." ... >
...
</samlp:Response>
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>
2024-03-29 18:49:46 +00:00
```
2022-04-28 16:01:33 +00:00
На завершення, XML підписи забезпечують гнучкі способи захисту XML документів, кожен тип відповідає різним структурним і безпековим потребам.
2022-04-28 16:01:33 +00:00
## References
2024-03-29 18:49:46 +00:00
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}