SQL-инъекция через mysql_query

Я работаю над сайтом, который был взломан через SQL Injection (на первый взгляд только записи в db повреждены межсайтовыми скриптами) потенциальная уязвимость, которую я обнаружил после просмотра кода, заключается в том, что существует много вызовов mysql_query, входы которых не сбежал вообще.

Старый добрый:

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

Тем не менее я не могу найти, как мы можем сделать что-то классное из этой уязвимости инъекций (прохладно, я имею в виду что-то вроде INSERT или UPDATE). Я попытался создать заявление вроде этого:

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

Нет успеха. Я думаю, что INSERT здесь нечего делать.

Я избегаю всех входных данных пользователя в коде прямо сейчас, но я действительно не понимаю, как хакеры проникли на этот сайт, тогда я не уверен на 100%, что мое исправление выполнит эту работу. Какие-нибудь блестящие предложения?

благодаря

В зависимости от версии mysql, которую вы используете, и настройки соединения, mysql_query может допускать более одного оператора .

Вы должны посмотреть, как создается соединение, и для любого использования mysql_set_server_option .

Потому что mysql_query не поддерживает несколько запросов, поэтому любая инъекция, которая работает как '; DROP TABLE mytable; -- '; DROP TABLE mytable; -- '; DROP TABLE mytable; -- не будет успешным.

Однако злоумышленник может комбинировать с другим утверждением select, чтобы выбрать другую информацию, такую ​​как информация о пароле.

Возможный сценарий 1
Слабые пароли / хеширование позволят злоумышленнику выбрать пароль администратора.
Было бы разумно изменить все пароли администраторов.

Теперь прошло какое-то время с тех пор, как php, но в целом большинство библиотек доступа к данным имеют своего рода параметризованный sql для снижения риска. Быстрый google придумал это для php: http://php.net/manual/en/pdo.prepared-statements.php

Другой плакат уже описал, как сделать SQL-инъекцию, поэтому я не буду вдаваться в это.

Я уверен, что хакер сможет легко изменить запрос. Даже если mysql_query () не поддерживает несколько запросов, есть способы обойти это. вы могли бы просто использовать оператор mysql IF, добавленный к концу, и, конечно, он выполнит совершенно новый запрос.

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

так

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