Я работаю над сайтом, который был взломан через 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; -- %'";