La declaración
if(now()=sysdate(),sleep(6),0)/*'XOR(if(now()=sysdate(),sleep(6),0))OR'"XOR(if(now()=sysdate(),sleep(6),0))OR"*/
básicamente intenta tres puntos de inyección diferentes a la vez.
1. El directo
if(now()=sysdate(),sleep(6),0)/*...*/
Si la entrada se interpretara directamente (sin caracteres de escape), este sql se activaría. El resto de la cadena de entrada sería comentado.
2. Las comillas simples ".."
..'XOR(if(now()=sysdate(),sleep(6),0))OR'..
Si la entrada se encapsula en la declaración con comillas simples, los caracteres al principio y al final se separarán del contexto y se interpretará el sql entre ellos.
3. Las comillas dobles ".."
.."XOR(if(now()=sysdate(),sleep(6),0))OR"*/
Igual que con las comillas simples, pero funciona para entradas encapsuladas entre comillas dobles.
El aspecto de la consulta
Si es PHP el que construye esta declaración de MySQL, podría parecerse a uno de los siguientes (según el caso que lo active):
sql = "INSERT INTO tbl_addresses (address,user) VALUES("+$_POST["address"]+",..)"
sql = "INSERT INTO tbl_addresses (address,user) VALUES('"+$_POST["address"]+"',..)"
sql = "INSERT INTO tbl_addresses (address,user) VALUES(\""+$_POST["address"]+"\",..)"
Cómo funciona
Las declaraciones son las mismas para cada caso de inyección.
Primero compara si el valor de retorno de la función "ahora" coincide con el de la función "sysdate". Si ese es el caso (y debería serlo), se llamará a la función "dormir" en un tiempo de 6 o 0 segundos, lo que provocará el retraso que observó.
Es posible explotar esto como una inyección SQL puramente ciega. Una herramienta como sqlmap te ayudará con eso, ya que tomaría mucho tiempo si lo haces a mano.
Básicamente, lo que hará (en forma simplificada), es emitir declaraciones como:
if ( nth_character_of(password) == "a" , sleep(6), 0)
Donde "nth_character_of" será una función específica de la base de datos que selecciona un carácter de una cadena y "password" será una consulta que devuelve cualquier valor que desee recuperar de la base de datos. También utilizará un método optimizado para encontrar los caracteres correctos.
Si sqlmap experimenta un retraso, sabrá que la comparación fue correcta y se repetirá.
Reduciéndolo
Puede tratar de suministrar cada uno de los tres casos de inyección por separado y ver cuál resulta en el retraso. De esta manera, la cadena de inyección se vuelve mucho más corta y fácil de modificar y comprender.
Lo que podrías probar
Si el valor se devuelve en la interfaz, como dijo en un comentario en otra respuesta, la inyección de SQL no es puramente ciega.
Es posible que tenga éxito al intentar insertar su valor directamente así:
version()/*'+version()+'"+version()+"*/
para recuperar la versión en el frontend o con su consulta en los tres lugares como:
(select password from users LIMIT 1)/*'+(select password from users LIMIT 1)+'"+(select password from users LIMIT 1)+"*/
El que tiene la consulta personalizada podría no funcionar dependiendo de la codificación que se necesita en esta aplicación específica, pero vale la pena intentarlo.