Ř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: 17 (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?

ikona Jakub Vrána OpenID:

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

Vložit příspěvek

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:

avatar © 2005-2016 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.