Los Caballeros

"Sobre seguridad, programación, modding, frikismo, etc... "

PHP: Que no hacer con los regex

Twitter icon Twitter icon
El cómo maneja PHP los regex tiene sus detalles... por ejemplo, no es lo mismo:

if(preg_match("/^[\w\d]+$/",$_GET['xian'])){
[...]
}

Que:

if(!preg_match("/[^\w\d]/",$_GET['xian'])){
[...]
}

Por ejemplo:

GET /echo.php?xian=00a%0a

El primero hace match... pero el segundo no... ¿Por qué? el LF se toma cómo el fin de la linea ($) por el contrario en el segundo regex no se especifica ese carácter por lo que se abarca todo :D...

Por otro lado...
if(!preg_match("/[^\d\w\s]/",$_GET['xian'])){
[...]
}

y
if(preg_match("/^[\d\w\s]+$/",$_GET['xian'])){
[...]
}


Inyectando: /echo.php?xian=00a%0a0a%0axianur0%20was%20here

Ambos hacen match (tomen en cuenta que \s no es solo espacios ;) )...

Con esto podemos inyectar CRLF's entre otras cosas...

y hay mil y un bypass a esto ;)

Saludos!