¿Cómo demostrar la inyección de SQL?

11

Tengo líneas en mi código PHP / MySQL que tienen este aspecto:

...
$sqlquery = "SELECT price FROM products WHERE 1=1 AND id=".$_POST['id'];
...
... query is executed
...
echo $price;

Como prueba / demostración, ¿cómo puedo subvertir esto para mostrar algo como la contraseña de un usuario si tengo una tabla como la de los usuarios?

id | username | password
------------------------
 1 |  abcde   | qwerty

Alternativamente, ¿qué más puedo hacer para que el sistema muestre?

    
pregunta siliconpi 01.03.2011 - 15:21
fuente

3 respuestas

18

Supongo que estás usando la función PHP mysql_query estándar, en cuyo caso algo como esto sería efectivo en tu ejemplo.

SELECT price FROM products WHERE 1=1 AND id=
999999999999999999999999 
UNION ALL 
(SELECT CONCAT(username, ' ', password) FROM user) limit 0, 1;

Explicación

  1. Use un ID de un producto que no va a existir.
  2. UNION con tabla de usuarios.
  3. SELECCIONE una sola columna en la tabla de usuarios para devolver, ya que solo está devolviendo una sola columna del producto. En este caso, devolver un campo concatenado de las columnas de nombre de usuario y contraseña.
  4. Limite por 1. Como su código presumiblemente espera solo un resultado de la consulta. Como alternativa, puede utilizar una condición DÓNDE para especificar un usuario específico que desea recuperar.

Otro ejemplo sería utilizar group_concat , lo que permitiría recuperar todas las entradas de la tabla de usuarios en una sola consulta. Inspirado en la respuesta a otra pregunta aquí .

SELECT price FROM products WHERE 1=1 AND id=-1 
UNION ALL 
(SELECT CONCAT(GROUP_CONCAT(username), '\n', GROUP_CONCAT(password)) FROM user);

Recursos adicionales que cubren los ataques de inyección de SQL:

respondido por el Mark Davidson 01.03.2011 - 16:12
fuente
5

A tu última pregunta:

  

Alternativamente, ¿qué más puedo hacer para que el sistema muestre?

En general, depende de cómo se configura el servidor SQL y de si hay algunas mitigaciones presentes. Pero el atacante puede no solo mostrar las contraseñas de los usuarios, sino que también puede intentar:

  • lee y escribe en varios archivos;
  • escribe en la base de datos y lee de ella;
  • hacer DoS y otras acciones dañinas;

Cada operación depende de varios factores, como, cómo dije: la presencia de factores de mitigación, permisos de archivos, configuración del sistema, etc.

Por cierto, para el atacante no es necesario mostrar el resultado de la solicitud de SQL. En el caso en que el atacante no puede ver la respuesta, hace que el proceso de extracción de información sea más lento y difícil, pero no imposible.

Si está interesado, le sugiero que lea el blog de Bernardo Damele, el creador de sqlmap: enlace . Hay presentaciones y lecturas interesantes sobre lo que se puede hacer y cómo.

    
respondido por el anonymous 02.03.2011 - 17:52
fuente
0

Hay un ejemplo clásico llamado "Exploits of a Mom" en xkcd que probablemente funcionaría casi literalmente en tu ejemplo. La idea es publicar una cadena como la siguiente como id, de modo que su código lo lea como $ _POST ['id']:

  

-1; SELECCIONAR * DE los usuarios;

Suponiendo que cuando pasa su consulta a la base de datos se separa en varias declaraciones en el punto y coma, este es el resultado que ve su base de datos:

  

SELECCIONE el precio DE LOS productos DONDE 1 = 1 Y id = -1;

     

SELECCIONAR * DE los usuarios;

Su atacante ha logrado enumerar toda la base de datos de usuarios. De esta manera, se pueden ejecutar comandos de base de datos arbitrarios.

Como su código probablemente procesa el resultado de la consulta y muestra algunos de los resultados en una página web, un atacante podría eliminar cosas, falsificar datos o incluso espiar información de su base de datos, y posiblemente utilizarla para modificarla también. Esto puede incluir el secuestro de cuentas o, si su base de datos y el diseño de su servidor lo permiten, realizar pedidos sin ejecutar pagos.

    
respondido por el pyramids 04.07.2013 - 18:00
fuente

Lea otras preguntas en las etiquetas