Řešení alert(1) to win

Školení, která pořádám

Soutěž v hledání XSS alert(1) to win patří mezi to nejlepší, co jsem v poslední době viděl. Příklady jsou velmi těžké a ukazují hodně z toho, na co si při psaní klientského kódu dát pozor. U některých ukázek kódu jsem měl na první pohled pocit, že jsou neprůstřelné a že se příliš neliší od toho, jak bych kód napsal sám. Přesto obsahovaly závažnou chybu, která aplikaci kompromituje. Pokud máte dost času a myslíte si, že o XSS něco víte, tak doporučuji se příklady potrápit. Já jsem tím strávil několik hodin a musím přiznat, že u některých jsem se nakonec neobešel bez nápovědy. Až si nebudete vědět rady, tak se můžete podívat na řešení, které je v mnoha případech velmi poučné. Otázky se otevřou do nového okna, řešení se zobrazí na této stránce.

Jakub Vrána, Řešení problému, 14.10.2013, diskuse: 19 (nové: 0)

Diskuse

ikona Ondra:

Drobný bug - otevírání řešení nefunguje, když čtu článek z homepage (chybí skript). Také mi to nejelo v Chrome na Androidu.

Jinak díky za řešení, rád si počkám na #8, kde jsem docílil patrně nejhoršího řešení vůbec (1253 chars) opsáním příkladu z jsfuck.com :-)

ikona Jakub Vrána OpenID:

Díky za upozornění, už jsem to opravil.

Milsa:

Príde mi to také, ako keby sa bezpečný kód ani napísať nedal.

Martin R.:

U prvního úkolu je možné použít i následující a dostat se tak na 12 znaků, kterého dosáhli téměř všichni.
"+alert(1)+"

Vladimír Pilný:

nebo též na 12:
");alert(1,"

Adam:

0: s = '");alert("1'
1: s = '\\\");alert(1);//'

Marek Vavrečan:

k 15.
https://communities.coverity.com/blogs/security/…-escapers-3

ikona Marek Vavrečan:

14. je riešenie pomocou <!--<script>.. ktorý sa vo vnútri hlavného <script> vyparsuje prvé... a potom už len stačí dosadiť začiatok aby všetko sedelo ako má:
alert(1);if(a/*<!--<script>

15. rovnaký trik s <!--<script> a zvyšok je už jednoduchý:
<!--<script>#)-->/;alert(1)<!--/*

ikona Jakub Vrana OpenID:

Díky, to má pro mě opravdu velkou hodnotu, protože to skutečně odhaluje reálné chyby v aplikacích, které mohu opravit.

ikona v6ak OpenID:

Ještě jsem to pořádně nepročetl, ale vychází mi z toho, že by toto mělo být OK, pokud chci Javascript alert({$alert}):

<?php
"<script type='text/javascript'>alert(".str_replace(array("<", ">"), array("\\u003c", "\\u003e"), json_encode($alert)).");</script>"
?>

ikona Jakub Vrana OpenID:

Přibyl příklad 16, byť ještě není dokončený.

ikona v6ak OpenID:

Já dodám svoje řešení pro 8: https://gist.github.com/v6ak/a982241c220c244b3311
A pro 9 (v principu totéž, jen trochu obskurnější): https://gist.github.com/v6ak/cd3b1e0679f1e3d259e8

Trestná smradlavice:

Řešení u levelu 2, zdá se, nefunguje. Ale jde použít řešení z levelu 11.

Trestná smradlavice:

U levelu 13… nemělo by místo youWin být youWon?

ikona Jakub Vrána OpenID:

Ano, děkuji za upozornění. Opravil jsem to.

Boris:

Už je tam aj príklad 17, ale príde mi, že na novších prehliadačoch sa to nedá hacknúť. Skúšali ste to niekto?

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL: Reakce na: Boris

ikona Jakub Vrána OpenID:

Ještě to nehacknul ani autor, tak bych se o to asi ani nepokoušel.

děložní prádlo:

btw. další zdroje:
- https://vwzq.net/papers/Alert%281%29ToWin.pdf (1 až 15)
- http://www.pwntester.com/blog/2014/01/08/…-ups-part-257/ (9 až 16)

osoba prdelnatá:

- jde se někomu v tuto chvíli dostat na další levely?
- dá se říct, že Level 17 je "nedobytný" a tedy bezpečný proti XSS?
avatar © 2005-2020 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.