it-swarm-es.com

¿Cómo demostrar la inyección SQL?

Tengo líneas en mi código PHP/MySQL que se ven así:

...
$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 tuviera una tabla a los usuarios como:

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

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

11
siliconpi

Supongo que estás usando estándar PHP mysql_query función en cuyo caso algo como esto sería efectivo en su 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. Utilice una identificación 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 devuelve una sola columna del producto. En este caso, devuelve un campo concatenado de las columnas de nombre de usuario y contraseña.
  4. Limite por 1. Como su código, presumiblemente espera un único resultado de la consulta de la consulta. Alternativamente, podría usar una condición WHERE para especificar un usuario específico que desea recuperar.

Otro ejemplo sería usar group_concat esto permitiría recuperar todas las entradas de la tabla de usuario 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 SQL:

18
Mark Davidson

A tu última pregunta:

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

Generalmente, depende de cómo esté configurado el servidor SQL y de si existen algunas mitigaciones. Pero el atacante puede tener la voluntad no solo de mostrar las contraseñas de los usuarios, sino que también puede intentar:

  • leer y escribir en varios archivos;
  • escribir en la base de datos y leer de ella;
  • realizar 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 SQL. En el caso de que el atacante no pueda 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: http://bernardodamele.blogspot.com/ . Hay presentaciones y lecturas interesantes sobre lo que se puede hacer y cómo.

5
anonymous

Hay un ejemplo clásico llamado "Exploits of a Mom" ​​en xkcd que probablemente funcionaría casi literalmente en su ejemplo. La idea es publicar una cadena como la siguiente como id, de modo que su código la 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 forma, 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 potencialmente usarla para modificarla también. Esto puede incluir el secuestro de cuentas o, si su base de datos y el diseño del servidor lo permiten, realizar pedidos sin ejecutar pagos.

0
pyramids