
El Cross-Site Scripting (XSS) es una de las vulnerabilidades más comunes en aplicaciones web. Básicamente, un XSS ocurre cuando una aplicación web no filtra correctamente las entradas del usuario, lo que permite la inyección de código malicioso. Este código, generalmente JavaScript, se ejecuta en el navegador de otro usuario, comprometiendo su seguridad.
En esta ocasíón vamos a analizar el XSS reflejado (Reflected XSS), que ocurre cuando una aplicación web procesa y devuelve datos proporcionados por el usuario en la respuesta sin una validación o escape adecuados, permitiendo que el código malicioso se ejecute en el navegador de la víctima.
Veamos algunos ejemplos que no ayudarán a entender que es XSS Reflected. Para ello vamos a usar DVWA de OWASP que podemos instalar en nuestro sistema muy fácilmente con docker.
https://hub.docker.com/r/vulnerables/web-dvwa
Si clicamos en DVWA Security, veremos los niveles de dificultad que podemos seleccionar:

Estos son Low, Medium, High e Impossible.
Vamos a probar nuestras inyecciones con XSS (Reflected).
Low.
Si revisamos el código, comprobamos que no se realiza filtrado alguno.
<?php
header (
"X-XSS-Protection: 0"
);
// Is there any input?
if(
array_key_exists
(
"name"
,
$_GET
) &&
$_GET
[
'name'
] !=
NULL
) {
// Feedback for end user
echo
'<pre>Hello '
.
$_GET
[
'name'
] .
'</pre>'
;
}?>
Entonces, tan sencillo como insertar <script>alert(‘XSS’)</script> en el campo de texto, porque el navegador interpretará la etiqueta <script>


Medium
En este caso tenemos una función ‘replace’ que nos impide usar la etiqueta ‘<script>’.
<?php
header (
"X-XSS-Protection: 0"
);
// Is there any input?
if(
array_key_exists
(
"name"
,
$_GET
) &&
$_GET
[
'name'
] !=
NULL
) {
// Get input
$name
=
str_replace
(
'<script>'
,
''
,
$_GET
[
'name'
] );
// Feedback for end user
echo
"<pre>Hello
${
name
}
</pre>"
;
}?>
La solución será no usar la etiqueta ‘<script>’, podemos usar por ejemplo <svg/onload=alert(‘xss’)>


High
En High la cosa se complica, porque aquí el filtrado es más exhaustivo:
<?php
header (
"X-XSS-Protection: 0"
);
// Is there any input?
if(
array_key_exists
(
"name"
,
$_GET
) &&
$_GET
[
'name'
] !=
NULL
) {
// Get input
$name
=
preg_replace
(
'/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i'
,
''
,
$_GET
[
'name'
] );
// Feedback for end user
echo
"<pre>Hello
${
name
}
</pre>"
;
}?>
Pero aún podemos encontrar una solución, por ejemplo, usando la etiqueta ‘<img>’ de esta forma: <img src=x onerror=alert(‘XSS’)>


Llegados a este punto, es fácil darse cuenta que con una sentencia como la que sigue podríamos conseguir inyectar el código independientemente de su filtrado.
<svg/onload=alert('XSS')><img src=x onerror=alert('XSS')>


Este tipo de ataque de apariencia simple se usa comunmente en campañas de phishing y robo de credenciales, enviando enlaces maliciosos a víctimas desprevenidas a través de correos electrónicos, redes sociales o chats. Cuando la víctima accede al enlace, el código malicioso se ejecuta en su navegador, permitiendo al atacante robar cookies de sesión o redirigirlo a sitios falsos.
Deja una respuesta