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%, что мое исправление выполнит эту работу. Любые блестящие предложения?

Спасибо

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

так

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