SQL Injection através do mysql_query

Estou trabalhando em um site que foi cortado através da Injeção de SQL (à primeira vista, apenas as inputs de db estão corrompidas com scripts entre sites), a vulnerabilidade potencial que encontrei depois de olhar para o código é que há muita chamada mysql_query cujas inputs são não escapou de todo.

O bom velho:

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

No entanto, não consigo encontrar como podemos fazer algo legal com essa vulnerabilidade de injeção (por legal, quero dizer algo como INSERT ou UPDATE). Eu tentei construir uma declaração como essa:

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

Sem sucesso. Eu acho que o INSERT não tem nada para fazer aqui.

Estou escapando de todas as inputs do usuário no código agora, mas eu realmente não recebi como os hackers penetraram neste site, então não estou 100% seguro de que minha correção fará o trabalho. Alguma sugestão shiny?

obrigado

Dependendo da versão do mysql que você está usando e da configuração da conexão, mysql_query pode permitir mais de uma declaração .

Você deve ver como a conexão está sendo criada e para qualquer uso de mysql_set_server_option .

Como mysql_query não está suportando várias consultas, então, qualquer injeção que esteja fazendo como '; DROP TABLE mytable; -- '; DROP TABLE mytable; -- '; DROP TABLE mytable; -- não será bem sucedido.

No entanto, o atacante pode combinar com outra instrução de seleção para selecionar a outra informação, como informação de senha.

Possível cenário 1
Senhas fracas / hash permitirão que um invasor selecione a senha do administrador.
Seria sensato mudar todas as senhas dos administradores.

Agora, faz algum tempo que fez qualquer php, mas, em geral, a maioria das libs de access a dados tem algum tipo de sql parametrizado para reduzir o risco. Um google rápido veio com isso para o php: http://php.net/manual/en/pdo.prepared-statements.php

O outro cartaz já descreveu como fazer uma injeção sql para não entrar nisso.

Tenho certeza de que um hacker poderia modificar a consulta com facilidade. Mesmo que mysql_query () não ofereça suporte a várias consultas, existem maneiras em torno disso. você poderia usar apenas uma instrução mysql IF adicionada no final e, claro, que irá executar uma consulta completamente nova.

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

assim

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