2012-01-29 13 views
10

Estoy trabajando en un sitio que ha sido pirateado a través de SQL Injection (a primera vista, solo las entradas de db están dañadas con scripts entre sitios) la vulnerabilidad potencial que encontré después de mirar el código es que hay una mucha llamada mysql_query cuyas entradas no se escapan en absoluto.SQL Injection a través de mysql_query

El buen viejo:

$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'"; /*HACK HERE*/ 
mysql_query($query, $connection); 

Sin embargo no puedo encontrar cómo podemos hacer algo frío desde que la vulnerabilidad de inyección (por frío me refiero a algo como un INSERT o un UPDATE). Intenté construir una declaración como esta:

SELECT * FROM mytable where name LIKE '%' AND WHERE id IN (INSERT INTO secondtable (id,description) VALUES (15, 'Fifteenth description');--%' 

Ningún éxito. Supongo que el INSERT no tiene nada que hacer aquí.

Estoy escapando de todas las entradas de usuario en el código en este momento, pero realmente no entiendo cómo han penetrado los hackers en este sitio, entonces no estoy 100% seguro de que mi solución hará el trabajo. ¿Alguna sugerencia brillante?

Gracias

+1

Supongo que este sitio no es el lugar correcto para preguntar cómo hacerlo :) – Mike

+0

Asegúrese de que 'nombre' cuando concatena con las cadenas base formas sql válido. – EBarr

+0

Un atacante podría fácilmente 'UNIR'/'UNIÓN' a otra tabla y obtener credenciales de inicio de sesión de administrador. Luego, con privilegios elevados, podría hacer más cosas malvadas, p. cargando un shell PHP para ejecutar comandos arbitrarios en el servidor – knittl

Respuesta

-3
$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'"; 

$_GET['name']="'; DROP TABLE mytable; -- "; 

por lo

$query = "SELECT * FROM mytable where name LIKE '%'; DROP TABLE mytable; -- %'"; 
+0

¿Alguna más explicación de por qué esto está mal? –

+1

sí, mira los comentarios a continuación xbonez 'respuesta – joni

+0

mysql_query solo toma una consulta, pero gracias – AsTeR

0

ahora, ha sido un tiempo desde que lo hizo cualquier php, pero en general la mayoría de librerías de acceso a datos tienen algún tipo de SQL parametrizada para reducir el riesgo. Un Google rápido se le ocurrió esto para php: http://php.net/manual/en/pdo.prepared-statements.php

El otro cartel ya describió cómo hacer una inyección sql, así que no entraré en eso.

+0

"entonces no estoy 100% seguro de que mi solución hará el trabajo. ¿Alguna sugerencia brillante?" - Sugerí una solución alternativa – Daniel

+0

esta solución de la misma naturaleza con una solución utilizada. pero el operador preguntó por la naturaleza diferente. simplemente no entiendo la pregunta –

+0

IMO es una gran diferencia entre una solución de fabricación casera frente a una probada lib – Daniel

1

Posible escenario 1
Contraseñas/hash débiles permitirán a un atacante seleccionar la contraseña del administrador.
Sería conveniente cambiar todas las contraseñas de los administradores.

+0

¿No hay forma de hacer un INSERT directo o ACTUALIZAR? – AsTeR

+2

por lo que yo sé - no. –

2

Porque mysql_query no es compatible con varias consultas, por lo que cualquier inyección que está haciendo como '; DROP TABLE mytable; -- no tendrá éxito.

Sin embargo, el atacante puede combinarse con otra instrucción de selección para seleccionar la otra información, como la información de contraseña.

0

Estoy bastante seguro de que un hacker podría modificar la consulta fácilmente. Incluso si mysql_query() no es compatible con múltiples consultas, hay formas de evitarlo. solo podría usar una instrucción mysql IF agregada hasta el final, y por supuesto que ejecutará una consulta completamente nueva.

+0

gracias por su esfuerzo. La pregunta era "¿Cuáles son las formas?", No "¿hay alguna manera?". –

Cuestiones relacionadas