# SAML Attacks
## SAML Attacks
{% hint style="success" %}
Apprenez et pratiquez le hacking AWS :[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Apprenez et pratiquez le hacking GCP : [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
* **Rejoignez le** đŹ [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.
{% endhint %}
## Basic Information
{% content-ref url="saml-basics.md" %}
[saml-basics.md](saml-basics.md)
{% endcontent-ref %}
## Tool
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) : Un outil qui peut prendre une URL ou une liste d'URL et renvoie l'URL de consommation SAML.
## XML round-trip
Dans XML, la partie signĂ©e de l'XML est sauvegardĂ©e en mĂ©moire, puis un certain encodage/dĂ©codage est effectuĂ© et la signature est vĂ©rifiĂ©e. IdĂ©alement, cet encodage/dĂ©codage ne devrait pas changer les donnĂ©es, mais basĂ© sur ce scĂ©nario, **les donnĂ©es vĂ©rifiĂ©es et les donnĂ©es originales pourraient ne pas ĂȘtre les mĂȘmes**.
Par exemple, vérifiez le code suivant :
```ruby
require 'rexml/document'
doc = REXML::Document.new <]>
XML
puts "First child in original doc: " + doc.root.elements[1].name
doc = REXML::Document.new doc.to_s
puts "First child after round-trip: " + doc.root.elements[1].name
```
Exécuter le programme contre REXML 3.2.4 ou une version antérieure donnerait plutÎt le résultat suivant :
```
First child in original doc: Y
First child after round-trip: Z
```
Voici comment REXML a vu le document XML original du programme ci-dessus :
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (1001).png>)
Et voici comment il l'a vu aprÚs un tour de parsing et de sérialisation :
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (445).png>)
Pour plus d'informations sur la vulnérabilité et comment en abuser :
* [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/)
* [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/)
## Attaques par enveloppement de signature XML
Dans les **attaques par enveloppement de signature XML (XSW)**, les adversaires exploitent une vulnérabilité qui survient lorsque les documents XML sont traités à travers deux phases distinctes : **validation de signature** et **invocation de fonction**. Ces attaques impliquent de modifier la structure du document XML. Plus précisément, l'attaquant **injecte des éléments falsifiés** qui ne compromettent pas la validité de la signature XML. Cette manipulation vise à créer une discordance entre les éléments analysés par la **logique d'application** et ceux vérifiés par le **module de vérification de signature**. En conséquence, bien que la signature XML reste techniquement valide et passe la vérification, la logique d'application traite les **éléments frauduleux**. Par conséquent, l'attaquant contourne efficacement la **protection d'intégrité** et **l'authentification d'origine** de la signature XML, permettant l'**injection de contenu arbitraire** sans détection.
Les attaques suivantes sont basées sur [**cet article de blog**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **et** [**ce document**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Consultez-les pour plus de détails.
### XSW #1
* **Stratégie** : Un nouvel élément racine contenant la signature est ajouté.
* **Implication** : Le validateur peut ĂȘtre confus entre le "Response -> Assertion -> Subject" lĂ©gitime et le "mauvais nouveau Response -> Assertion -> Subject" de l'attaquant, entraĂźnant des problĂšmes d'intĂ©gritĂ© des donnĂ©es.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-1.svg](<../../.gitbook/assets/image (506).png>)
### XSW #2
* **Différence par rapport à XSW #1** : Utilise une signature détachée au lieu d'une signature enveloppante.
* **Implication** : La structure "malveillante", similaire à XSW #1, vise à tromper la logique métier aprÚs la vérification d'intégrité.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg](<../../.gitbook/assets/image (466).png>)
### XSW #3
* **StratĂ©gie** : Une assertion malveillante est crĂ©Ă©e au mĂȘme niveau hiĂ©rarchique que l'assertion originale.
* **Implication** : Vise à tromper la logique métier pour qu'elle utilise les données malveillantes.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-3.svg](<../../.gitbook/assets/image (120).png>)
### XSW #4
* **Différence par rapport à XSW #3** : L'assertion originale devient un enfant de l'assertion dupliquée (malveillante).
* **Implication** : Semblable Ă XSW #3 mais modifie la structure XML de maniĂšre plus agressive.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-4.svg](<../../.gitbook/assets/image (551).png>)
### XSW #5
* **Aspect unique** : Ni la signature ni l'assertion originale ne respectent les configurations standard (enveloppées/enveloppantes/détachées).
* **Implication** : L'assertion copiée enveloppe la signature, modifiant la structure de document attendue.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg](<../../.gitbook/assets/image (1030).png>)
### XSW #6
* **Stratégie** : Insertion à un emplacement similaire à XSW #4 et #5, mais avec une variation.
* **Implication** : L'assertion copiée enveloppe la signature, qui enveloppe ensuite l'assertion originale, créant une structure trompeuse imbriquée.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-6.svg](<../../.gitbook/assets/image (169).png>)
### XSW #7
* **Stratégie** : Un élément Extensions est inséré avec l'assertion copiée comme enfant.
* **Implication** : Cela exploite le schéma moins restrictif de l'élément Extensions pour contourner les contre-mesures de validation de schéma, en particulier dans des bibliothÚques comme OpenSAML.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg](<../../.gitbook/assets/image (971).png>)
### XSW #8
* **Différence par rapport à XSW #7** : Utilise un autre élément XML moins restrictif pour une variante de l'attaque.
* **Implication** : L'assertion originale devient un enfant de l'élément moins restrictif, inversant la structure utilisée dans XSW #7.
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-8.svg](<../../.gitbook/assets/image (541).png>)
### Outil
Vous pouvez utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour analyser la requĂȘte, appliquer toute attaque XSW de votre choix et la lancer.
## XXE
Si vous ne savez pas quel type d'attaques sont les XXE, veuillez lire la page suivante :
{% content-ref url="../xxe-xee-xml-external-entity.md" %}
[xxe-xee-xml-external-entity.md](../xxe-xee-xml-external-entity.md)
{% endcontent-ref %}
Les rĂ©ponses SAML sont des **documents XML dĂ©compressĂ©s et encodĂ©s en base64** et peuvent ĂȘtre susceptibles aux attaques d'entitĂ© externe XML (XXE). En manipulant la structure XML de la rĂ©ponse SAML, les attaquants peuvent tenter d'exploiter les vulnĂ©rabilitĂ©s XXE. Voici comment une telle attaque peut ĂȘtre visualisĂ©e :
```xml
]>
...
...
...
[...]
```
## Outils
Vous pouvez Ă©galement utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour gĂ©nĂ©rer le POC Ă partir d'une requĂȘte SAML afin de tester d'Ă©ventuelles vulnĂ©rabilitĂ©s XXE et vulnĂ©rabilitĂ©s SAML.
Vérifiez également cette conférence : [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
## XSLT via SAML
Pour plus d'informations sur XSLT, allez Ă :
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
{% endcontent-ref %}
Les Transformations de Langage de Feuille de Style Extensible (XSLT) peuvent ĂȘtre utilisĂ©es pour transformer des documents XML en divers formats comme HTML, JSON ou PDF. Il est crucial de noter que **les transformations XSLT sont effectuĂ©es avant la vĂ©rification de la signature numĂ©rique**. Cela signifie qu'une attaque peut rĂ©ussir mĂȘme sans une signature valide ; une signature auto-signĂ©e ou invalide suffit pour procĂ©der.
Ici, vous pouvez trouver un **POC** pour vérifier ce type de vulnérabilités, sur la page hacktricks mentionnée au début de cette section, vous pouvez trouver des payloads.
```xml
...
...
```
### Outil
Vous pouvez Ă©galement utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour gĂ©nĂ©rer le POC Ă partir d'une requĂȘte SAML afin de tester d'Ă©ventuelles vulnĂ©rabilitĂ©s XSLT.
Vérifiez également cette conférence : [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
## Exclusion de la signature XML
L'**Exclusion de la signature XML** observe le comportement des implémentations SAML lorsque l'élément Signature est absent. Si cet élément est manquant, **la validation de la signature peut ne pas se produire**, rendant le systÚme vulnérable. Il est possible de tester cela en modifiant les contenus qui sont généralement vérifiés par la signature.
![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../.gitbook/assets/image (457).png>)
### Outil
Vous pouvez également utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Interceptez la réponse SAML et cliquez sur `Remove Signatures`. Ce faisant, **tous** les éléments Signature sont supprimés.
Avec les signatures supprimĂ©es, laissez la requĂȘte se poursuivre vers la cible. Si la signature n'est pas requise par le Service
## Falsification de certificat
## Falsification de certificat
La falsification de certificat est une technique pour tester si un **Fournisseur de services (SP) vérifie correctement qu'un message SAML est signé** par un fournisseur d'identité (IdP) de confiance. Cela implique d'utiliser un \***certificat auto-signé** pour signer la réponse ou l'assertion SAML, ce qui aide à évaluer le processus de validation de confiance entre le SP et l'IdP.
### Comment réaliser la falsification de certificat
Les étapes suivantes décrivent le processus en utilisant l'extension Burp [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) :
1. Interceptez la réponse SAML.
2. Si la réponse contient une signature, envoyez le certificat à SAML Raider Certs en utilisant le bouton `Send Certificate to SAML Raider Certs`.
3. Dans l'onglet Certificats de SAML Raider, sélectionnez le certificat importé et cliquez sur `Save and Self-Sign` pour créer un clone auto-signé du certificat original.
4. Retournez Ă la requĂȘte interceptĂ©e dans le Proxy de Burp. SĂ©lectionnez le nouveau certificat auto-signĂ© dans le menu dĂ©roulant de la signature XML.
5. Supprimez toutes les signatures existantes avec le bouton `Remove Signatures`.
6. Signez le message ou l'assertion avec le nouveau certificat en utilisant le bouton **`(Re-)Sign Message`** ou **`(Re-)Sign Assertion`**, selon le cas.
7. Transmettez le message signé. Une authentification réussie indique que le SP accepte les messages signés par votre certificat auto-signé, révélant d'éventuelles vulnérabilités dans le processus de validation des messages SAML.
## Confusion du destinataire de jeton / Confusion de cible de fournisseur de services
La confusion du destinataire de jeton et la confusion de cible de fournisseur de services impliquent de vĂ©rifier si le **Fournisseur de services valide correctement le destinataire prĂ©vu d'une rĂ©ponse**. En essence, un Fournisseur de services devrait rejeter une rĂ©ponse d'authentification si elle Ă©tait destinĂ©e Ă un autre fournisseur. L'Ă©lĂ©ment critique ici est le champ **Recipient**, trouvĂ© dans l'Ă©lĂ©ment **SubjectConfirmationData** d'une rĂ©ponse SAML. Ce champ spĂ©cifie une URL indiquant oĂč l'assertion doit ĂȘtre envoyĂ©e. Si le destinataire rĂ©el ne correspond pas au Fournisseur de services prĂ©vu, l'assertion doit ĂȘtre considĂ©rĂ©e comme invalide.
#### **Comment cela fonctionne**
Pour qu'une attaque de confusion de destinataire de jeton SAML (SAML-TRC) soit rĂ©alisable, certaines conditions doivent ĂȘtre remplies. Tout d'abord, il doit y avoir un compte valide sur un Fournisseur de services (appelĂ© SP-LĂ©gitime). DeuxiĂšmement, le Fournisseur de services ciblĂ© (SP-Cible) doit accepter des jetons du mĂȘme fournisseur d'identitĂ© qui sert SP-LĂ©gitime.
Le processus d'attaque est simple dans ces conditions. Une session authentique est initiĂ©e avec SP-LĂ©gitime via le fournisseur d'identitĂ© partagĂ©. La rĂ©ponse SAML du fournisseur d'identitĂ© Ă SP-LĂ©gitime est interceptĂ©e. Cette rĂ©ponse SAML interceptĂ©e, initialement destinĂ©e Ă SP-LĂ©gitime, est ensuite redirigĂ©e vers SP-Cible. Le succĂšs de cette attaque est mesurĂ© par l'acceptation de l'assertion par SP-Cible, accordant l'accĂšs aux ressources sous le mĂȘme nom de compte utilisĂ© pour SP-LĂ©gitime.
```python
# Example to simulate interception and redirection of SAML Response
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
"""
Simulate the interception of a SAML Response intended for SP-Legit and its redirection to SP-Target.
Args:
- saml_response: The SAML Response intercepted (in string format).
- sp_target_url: The URL of the SP-Target to which the SAML Response is redirected.
Returns:
- status: Success or failure message.
"""
# This is a simplified representation. In a real scenario, additional steps for handling the SAML Response would be required.
try:
# Code to send the SAML Response to SP-Target would go here
return "SAML Response successfully redirected to SP-Target."
except Exception as e:
return f"Failed to redirect SAML Response: {e}"
```
## XSS dans la fonctionnalité de déconnexion
La recherche originale peut ĂȘtre consultĂ©e via [ce lien](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/).
Au cours du processus de brute forcing de répertoire, une page de déconnexion a été découverte à :
```
https://carbon-prototype.uberinternal.com:443/oidauth/logout
```
Lors de l'accĂšs Ă ce lien, une redirection s'est produite vers :
```
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
```
Cela a révélé que le paramÚtre `base` accepte une URL. En tenant compte de cela, l'idée est née de substituer l'URL par `javascript:alert(123);` dans une tentative d'initier une attaque XSS (Cross-Site Scripting).
### Exploitation de masse
[Ă partir de cette recherche](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/):
L'outil [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) a Ă©tĂ© utilisĂ© pour analyser les sous-domaines de `uberinternal.com` pour les domaines utilisant la mĂȘme bibliothĂšque. Par la suite, un script a Ă©tĂ© dĂ©veloppĂ© pour cibler la page `oidauth/prompt`. Ce script teste pour XSS (Cross-Site Scripting) en saisissant des donnĂ©es et en vĂ©rifiant si elles sont reflĂ©tĂ©es dans la sortie. Dans les cas oĂč l'entrĂ©e est effectivement reflĂ©tĂ©e, le script signale la page comme vulnĂ©rable.
```python
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from colorama import init ,Fore, Back, Style
init()
with open("/home/fady/uberSAMLOIDAUTH") as urlList:
for url in urlList:
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
request = requests.get(url2, allow_redirects=True,verify=False)
doesit = Fore.RED + "no"
if ("Fady" in request.content):
doesit = Fore.GREEN + "yes"
print(Fore.WHITE + url2)
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
```
## Références
* [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/)
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\\
* [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
* [https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/)
{% hint style="success" %}
Apprenez et pratiquez le hacking AWS :[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Apprenez et pratiquez le hacking GCP : [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Soutenir HackTricks
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **Rejoignez le** đŹ [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.
{% endhint %}