XUT_ / COURSES / PENETRATION TESTER

Filter Evasion Techniques - continued

No-Quote SQL Injection

Las técnicas de inyección SQL sin comilla se usan cuando la aplicación filtra las comillas dobles y simples.

  • Usar Valores Numéricos: Un acercamiento es usar valores numéricos u otros tipos de datos que no requieran comillas. Por ejemplo, en vez de inyectar ' OR '1'='1, un atacante podría usar OR 1=1. Esta técnica puede bypassear filtros específicos de comillas.
  • Usar Comentarios SQL: Otro método involucra usar comentarios SQL para terminar el resto de la query. Por ejemplo, el input admin'-- puede transformarse en admin--, donde -- significa el inicio del comentario SQL. Esto puede ayudar a sobrepasar filtros y evitar errores de sintaxis.
  • Usar la Función CONCAT(): Los atacantes pueden usar funciones SQL como CONCAT() para construir strings sin comillas. Por ejemplo CONCAT(0x61, 0x64, 0x6d, 0x69, 0x6e) construye la string admin. La función CNCAT() y métodos similares permiten a los atacantes construir strings sin usar comillas directamente.

No Spaces Allowed

Cuando los espacios no están permitidos o están filtradoos, se pueden usar varias técnicas para bypassear esta restricción.

  • Comentar para Reemplazar Espacios: Un método común es usar comentarios SQL /**/ para reemplazar a los espaccios. Por ejemplo, en lugar de poner SELECT * FROM users WHERE name = 'admin', un atacante podría poner SELECT/**/*FROM/**/users/**/WHERE/**/name/**/='admin'. Los comentarios pueden reemplazar a los espacios en la query.
  • Tabular o Hacer Nueva Línea: Otro acercamiento es usar el tabulador \t o la nueva línea \n como sustitutos del espacio. Algunos filtros pueden permitir estos caracteres permitiendo al atacante construir una query como SELECT\t*\tFROM\tusers\tWHERE\tname\t=\t'admin'.
  • Caracteres Alternos: Otro método efectivo es usar caracteres URL encodeados representando diferentes tipos de espacio blanco como %09 (tabulación horizontal), %0A (line feed), %0C (form feed), %0D (carriege return) o %A0 (non-breaking space). Estos caracteres pueden reemplazar los espacios.

Ejemplo Práctico

En este escenario tenemos un endpoint, http://10.82.133.85/space/search_users.php?username=? que devuelve los detalles del usuario basados en el nombre de usuario proporcionado. El desarrollador ha implementado filtros para bloquear palabras clave de las inyecciones SQL comunes como OR, AND y espacios (%20).

Aquí está el filtro PHP añadido por el desarrollador:

php
$special_chars = array(" ", "AND", "and" ,"or", "OR" , "UNION", "SELECT");
$username = str_replace($special_chars, '', $username);
$sql = "SELECT * FROM user WHERE username = '$username'";

Si usamos nuestro payload estándar 1%27%20||%201=1%20--+, podemos ver que el URL encoding no está funcionando.

Filter Evasion Techniques - continued

La query SQL muestra que los espacios son omitidos por el código. Para sobrepasar estas protecciones podemos usar los caracteres URLencodeados que representan diferentes tipos de espacios o cortes de línea como %09, %0A.

El payload original 1' OR 1=1 -- puede ser modificado para usar caracteres de nueva línea en vez de espacios, resultando en el payload 1'%0A||%0A1=1%0A--%27+. Este payload construye la misma condición lógica que 1' OR 1=1 -- pero usa caracteres de nueva línea para sobrepasar el filtro de espacios.

El parser SQL interpreta los caracteres de línea nueva como espacios, transformando el payload en 1' OR 1=1 --. Por esto, la query será interpretada de SELECT * FROM users WHERE username = '$username' a SELECT * FROM users WHERE username = '1' OR 1=1 --.

Ahora si accedemos al endpoint a través de un payload actualizado, podemos ver todos los detalles.

Filter Evasion Techniques - continued

Para resumir, es importante entender que no hay una técnica simple que garantice un bypass al lidiar con filtros o Firewalls de Aplicaciones Web (WAFs) diseñados para prevenir los ataque de inyecciones SQL. Sin embargo, aquí hay algunos consejos y trucos que puedes usar para circunvalar estas protecciones. Esta tabla muestra varias técnicas que pueden ser empleadas para sobrepasar filrtos y WAFs.

EscenarioDescripciónEjemplo
Palabras clave como SELECT están prohibidasLas palabras clave SQL pueden ser sobrepasadas cambiando las mayúsculas/minúscular o añadiendo comentarios inline.SElEcT * FrOm users or SE//LECT * FROM//users
Los espacios están prohibidosUsar caracteres de espacio alternativos o comentarios para reemplazar espacios puede sobrepasar filtros.SELECT%0A*%0AFROM%0Ausers or SELECT//*//FROM/**/users
Operadores lógicos como OR o AND están prohibidosUsar operadores lógicos alternativos o concatenación puede sobrepasar estos filtros.username = 'admin' && password = 'password' or username = 'admin'//|//1=1 --
Palabras clave comunes como UNION o SELECT están prohibidasUsar representaciones equivalentes como hexadecimal o encodeado Unicode para sobrepasar filtros.SElEcT * FROM users WHERE username = CHAR(0x61,0x64,0x6D,0x69,0x6E)
Palabras clave específicas como OR, AND, SELECT, UNION están prohibidasUsar técnicas de ofuscación para disfrazar palabras clave SQL combinando caracteres con funciones de string o comentarios.SElECT * FROM users WHERE username = CONCAT('a','d','m','i','n') or SElEcT//username//FROM/**/users

En entornos reales, las queries que aplicas y la visibilidad de las palabras clave filtradas no son directamente posibles. Como pentester, es importante entender que la inyección SQL habitualmente incluye un acercamiento de prueba y error requiriendo perseverancia. Cada entorno puede tener filtros y protecciones únicas haciendo necesario adaptarse e intentar diferentes técnicas para encontrar un vector de inyección exitoso.