💉Identificación de filtros
Última actualización
Última actualización
Como hemos visto en la sección anterior, incluso si los desarrolladores intentan proteger la aplicación web contra las inyecciones, aún puede ser explotable si no se codificó de forma segura. Otro tipo de mitigación de la inyección es utilizar caracteres y palabras incluidos en la lista negra en el back-end para detectar intentos de inyección y denegar la solicitud si alguna de ellas los contenía.
Otra capa adicional es utilizar firewalls de aplicaciones web (WAF), que pueden tener un alcance más amplio y varios métodos de detección de inyecciones y prevenir otros ataques como inyecciones SQL o ataques XSS.
En esta sección veremos algunos ejemplos de cómo se pueden detectar y bloquear las inyecciones de comandos y cómo podemos identificar qué se está bloqueando.
Comencemos visitando la aplicación web del ejercicio que se encuentra al final de esta sección. Vemos la misma aplicación web Host Checker
que hemos estado explotando, pero ahora tiene algunas mitigaciones bajo la manga. Podemos ver que si probamos los operadores anteriores que probamos, como ( ;
, &&
, ||
), obtenemos el mensaje de error invalid input
:
Esto indica que algo que enviamos activó un mecanismo de seguridad que rechazó nuestra solicitud. Este mensaje de error se puede mostrar de varias maneras. En este caso, lo vemos en el campo donde se muestra el resultado, lo que significa que fue detectado y prevenido por la propia aplicación web PHP. Si el mensaje de error mostraba una página diferente, con información como nuestra IP y nuestra solicitud, esto puede indicar que fue rechazada por un WAF.
Revisemos la carga útil que enviamos:
Además de la IP (que sabemos que no está en la lista negra), enviamos:
Un carácter de punto y coma ;
Un carácter espacial
Una orden whoami
Entonces, la aplicación web detectó un carácter o un comando en la lista negra, o ambos. Entonces, veamos cómo evitar cada uno de ellos.
Una aplicación web puede tener una lista de caracteres prohibidos y, si el comando los contiene, rechazará la solicitud. El código PHP
puede ser similar al siguiente:
Si algún carácter de la cadena que enviamos coincide con un carácter de la lista negra, nuestra solicitud será rechazada. Antes de comenzar a intentar eludir el filtro, debemos intentar identificar qué carácter provocó la solicitud rechazada.
Reduzcamos nuestra solicitud a un carácter a la vez y veamos cuándo se bloquea. Sabemos que la carga útil (127.0.0.1
) funciona, así que comencemos agregando el punto y coma (127.0.0.1;
):
Aún recibimos un error invalid input
, que significa que un punto y coma está en la lista negra. Por lo tanto, veamos si todos los operadores de inyección que analizamos anteriormente están en la lista negra.
Pruebe todos los demás operadores de inyección para ver si alguno de ellos no está en la lista negra. ¿Cuál de los siguientes (nueva línea, &, |) no está en la lista negra de la aplicación web?
Probando todos los caracteres el único que no nos da error es el de nueva línea %0a