Inyección de SQL con raw MD5 hashes

sqlinjection

Acabo de leer en este post, sobre esta nueva técnica, al menos nueva para mi, sobre la inyección de código SQL usando raw MD5 hashes.

Normalmente la autentificación (más común y sencilla) de un usuario en una aplicación web, suele lanzar una query de este tipo:

SELECT usuario FROM usuarios WHERE password = (hash del password)

Es decir, una vez hayamos introducido los credenciales, lo que realmente comparamos con “password” es su hash, porque tu no guardas los passwords en texto plano, ¡a qué no! (Nota, hoy en día el uso de MD5 no se aconseja).

Sigamos. Hasta aquí todo normal, pero la cosa está y si miras el título del post pongo raw MD5 hash, es que en PHP existe una función llamada md5, la cual recibe un segundo parámetro el cual es capaz de cambiar el hash del primer argumento a modo raw. Me explico, cuando tu llamas a dicha función con sólo el primer parámetro, ésta te devuelve una cadena hexadecimal con el hash correspondiente. Dicha cadena hexadecimal, como su nombre indica sólo contiene dígitos hexadecimales, es decir, 0-9 y A-F.

Cuando llamamos a la función md5 (PHP) con el segundo parámetro como TRUE, ésta nos devuelve el hash en raw, y aquí es donde está la chicha, que la cadena de retorno puede contener caracteres que en SQL son especiales, como por ejemplo: ‘, |, =, etc.

La cosa ahora es encontrar un valor que pasado a dicha función nos devuelva una serie de caracteres que cuando sean pasado a la sentencia SQL provoquen una inyección de código.

Eso es precisamente lo que los autores del post que referencio más arriba han hecho. Después de un tiempo de cálculo, han dado con un valor que al ser pasado a la función md5, ésta devuelve una cadena que potencialmente provocaría una inyección de SQL.

valor: 129581926211651571912466741651878684928
hex:     06da5430449f8f6f23dfc1276f722738
raw:     ?T0D??o#??'or'8.N=?

Échale un vistazo a la entrada original porque la idea sin duda es muy interesante.