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
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...
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...