Az időzítő időtartamának megadására van hely. Ezt fogjuk kihasználni.
Nézzük meg a forráskódot.
A timer.html-ben ezt a sort láthatjuk
<img src="https://medium.com/static/loading.gif" onload="startTimer('{{ timer }}');" />
Az {{ timer }}
kifejezésben kell kihasználnunk, de ez egy startTimer('');
függvényben van elhelyezve, ami egy onload
esemény kezelője. A fő szempont, hogy a HTML-ben az eseménykezelő attribútum több visszahívási függvényt is elfogad.
Ezért be kell zárnunk a függvényt, és ott kell végrehajtanunk a figyelmeztetésünket. Vegye figyelembe, hogy az értéket nem egy parseInt
függvényen keresztül adtuk át, hanem a nyers adatokat használjuk. Tehát lezárhatjuk a függvényt egy ');
hozzáadásával, majd beilleszthetjük a alert
-unkat. Mivel inline-ként van használva, nem injektálhatjuk oda a alert();
-t, mert az tönkretenné a dolgokat. Az utasítás onload="startTimer('3'); alert();')"
lesz, és nem fog működni.
Ezért hozzá kell adnunk egy mintát, hogy a minta ne törjön meg. Adjunk hozzá alert('
és ez elég.
Szóval a payloadunk a következő lesz
3');alert('
Az időzítő indítása gombra kattintva végrehajtjuk a riasztást és ezzel befejeztük ezt a szintet.
Előrelépés a következő feladathoz.
Feladat 5 : A protokoll megtörése
A kezdőlapon nincs módunk semmit beadni. Csak egy linkünk van. Tehát kattintsunk rá.
Itt 2 helyet láthatunk, ahová bejuttathatjuk a hasznos terhelésünket. egyet magán az url-en, egyet pedig a beviteli mezőn. A beviteli mező egy olyan hely, ahová beírhatjuk az e-mail címünket, és reméljük, hogy az nem fog máshol visszatükröződni. Tehát menjünk az elsőhöz. Az url-en.
Nézzük meg az aktuális pag forráskódját, azaz a signup.html-t, és láthatjuk a sort
<a href="{{ next }}">Next >></a>
Nagyszerű hely a payload befecskendezésére. A mi payloadunk a href
attribútum értékeként lesz beállítva egy a
tagben. Ha képesek vagyunk a javascript:alert()
hozzáadására, akkor végre tudjuk hajtani a hasznos terhelésünket. Most nézzük meg, hogy mi az next
értéke. Nem találunk ilyet az oldalon. Hol keressük?
Python kód a segítségünkre. Nézzük meg a level.py-t, és látni fogjuk
if "signup" in self.request.path: self.render_template('signup.html', {'next': self.request.get('next')})
Az url-ben szereplő next
értékét fogjuk használni.
Változtassuk meg az next
értékét az url-ben confirm
-ről javascript:alert()
-re és a végleges url így fog kinézni
Now clicking on Next >> in the page will trigger our payload.
We now completed level 5. And 1 level remains.
Task 6 : Follow the 🐇
There is a path to a js file in the url.
Let’s inspect the source code. In page index.html, you can see a function includeGadget
és a függvénytestben a következő kódot láthatjuk.
var scriptEl = document.createElement('script');
Szóval külső js fájlt tudunk betölteni, de nem http
vagy https
url-ből.
Itt próbáljuk ki a data
urlokat.
Az adat urlok data:{type},content
Az #
utáni értéket tehát módosítsuk
data:application/javascript,alert()
vagy
data:text/plain,alert()
-re, és a alert
-t végre tudjuk hajtani.
Itt van egy videó a játék megoldásáról.