Siguiendo la linea de entradas de Hacking desde 0 y utilizando la máquina DVWA, en esta entrada vamos a ver como realizar un XSS reflejado en nivel alto. Si no estás al tanto de lo que son los ataques XSS, te recomiendo que te pases por aquí y leas algo sobre ello.
Vamos al nivel alto directamente porque creo que ya se ha hablado bastante en este blog sobre los ataques XSS, así que he decidido saltarme los dos niveles anteriores.
Al seleccionar "XSS reflected" nos aparece una caja en la que nos pide que pongamos nuestro nombre. Vamos a ello y vemos el comportamiento de la aplicación.
Vamos a hacer una prueba para ver si la web podría ser vulnerable. Le pasamos
<h1>que pasa kakers!</h1>
Obteniendo como resultado
Ya sabemos que la etiqueta <h1> (que amplia el tamaño de la letra) funciona. Vamos a ver que ocurre con el mítico
<script>alert('xss')</script>
Que sería la primera inyección a probar.
Como era de suponer, no funciona. Obviamente está filtrando algo, pero ¿qué? Si mirásemos el código a través del botón "view code", lo veríamos rápidamente, pero perdería la gracia y no aprenderíamos a pensar. Así que démosle al coco un poco.
Si nos fijamos, en la primera y segunda imagen, nos saluda devolviendo el nombre que hemos puesto en la caja, pero en la tercera imagen, se puede ver que deja el espacio que pertenece al nombre (en este caso <script>) en blanco, lo cual nos indica que el filtro es sobre esa cadena.
Bueno, ¿y ahora que hacemos? podemos probar a sustituir el
<script>alert('xss')</script>
por
<script>alert('xss)</script>
Lo único que hacemos es cambiar los "<>" a "HTML entities" que representan a esos caracteres.
Hemos vuelto a fallar. En este caso él mismo convierte los "<>" en "<>". Es decir, nos hace la conversión inversa.
Bien, es el momento de ir un paso más allá y jugar con los parámetros. Uno de los payloads que suelo usar y que suelen tragarse las webs (obviamente si tienen un buen filtrado no se lo van a tragar, pero si es cierto que bastantes se lo comen) es
<img src=/ onerror=alert(1)>
Lo que le decimos es que muestre una imagen que no hay, y que, en caso de error, nos saque un "alert". Veamos que ocurre.
Et voilà, ahí lo tenemos. Esta vez si que hemos conseguido hacer saltar el "alert". Otras veces, la aplicación también filtra la palabra "alert" y nos quedamos con un par de narices. Hablando hace un par de años con mi amigo German Sanchez (@enelpc) me dijo que usando "prompt" en lugar de "alert" las web se lo comían, y que razón tenía.
Espero que os haya dado alguna idea para, sobre todo pensar, no quedarnos estancados en lo que ya conocemos, si no ir más allá.
Roberto García (@1GbDeInfo)