Пример внедрения PHP/MySQL

Это продолжение этого вопроса: Являются ли надстройки PHP уязвимыми для sql инъекционная атака? (спасибо всем, кто ответил там).

Тот же сценарий, но у меня есть этот код (на другой странице):

             $ID = $_GET['id'];
             $sql = "SELECT * FROM blog WHERE id='$ID'";
             $result = mysql_query($sql);

Это должно быть достаточно легко использовать, верно?

Если я правильно помню, я НЕ МОГУ запустить второй запрос внутри mysql_query(), но я должен иметь возможность делать какие-то другие вредоносные действия, верно? Хотелось бы иметь возможность вставить пользователя в таблицу администратора или изменить пароль или что-то еще, но я предполагаю, что не смогу ничего сделать, кроме как коснуться таблицы блога. Это правильно? Любые предложения о том, как я могу поиграть и что-то настроить, чтобы доказать, что есть проблемы?


person k10    schedule 01.12.2011    source источник
comment
Пожалуйста, избегайте посторонних ссылок на другие вопросы.   -  person jsalonen    schedule 01.12.2011
comment
@Marco — mysql_query() отправляет уникальный запрос (множественные запросы не поддерживаются) (источник: php.net/manual/en/function.mysql-query.php)   -  person Steve Rukuts    schedule 01.12.2011
comment
Несколько (93!) интересных слайдов на тему Advanced SQL Injection на Slideshare.   -  person Cylindric    schedule 01.12.2011
comment
этот вопрос пахнет. у нас нет доказательств того, что это на самом деле аудит безопасности (выполняется кем-то, кто вообще не имеет представления о безопасности)   -  person Your Common Sense    schedule 01.12.2011
comment
@col - именно поэтому я и спрашиваю вас, ребята. Я еще не проводил аудит безопасности, хотя занимался веб-разработкой, и у меня есть клиент, который попросил меня обновить его сайт с учетом лучших практик. их просьба заключалась в том, чтобы я показал им уязвимость. Я провел кучу исследований в Google, но не смог найти ничего, что могло бы подтвердить мою точку зрения. Вы, ребята, дали мне достаточно, чтобы сделать то, что мне нужно было сделать, и я ценю это.   -  person k10    schedule 01.12.2011


Ответы (2)


Он называется UNION и позволяет извлекать данные из дополнительных таблиц с помощью второго запроса.

Я предполагаю, что что-то вроде 1' UNION ALL SELECT username title, password body FROM users WHERE '1'='1 сработает. (извлекает из таблицы users и сопоставляет значения имени пользователя и пароля с их blog «эквивалентами»).

person Tom van der Woerdt    schedule 01.12.2011
comment
СОЮЗ определенно помог. Я не был уверен в конструкции в этом сценарии, но я ценю толчок в правильном направлении. - person k10; 01.12.2011

Я не думаю, что кто-то подумает, что вы пытаетесь кого-то взломать — это законный вопрос.

Вы не можете запустить второй запрос здесь, но вы можете сделать что-то вредоносное. Например, если запрос был запросом аутентификации, например:

SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password';

Вы можете легко войти в систему с помощью ' OR 1 = 1 и получить доступ к веб-сайту.

Кроме того, если бы запрос был запросом DELETE или UPDATE, вы, вероятно, могли бы манипулировать им, чтобы он выполнялся без предложения WHERE.

person Steve Rukuts    schedule 01.12.2011
comment
На самом деле, вы можете запустить второй запрос. - person Tom van der Woerdt; 01.12.2011
comment
mysql_query() отправляет уникальный запрос (множественные запросы не поддерживаются) (источник: php .net/manual/en/function.mysql-query.php). Если это не так, простите меня за то, что я придерживаюсь того, что написано в руководстве по PHP. - person Steve Rukuts; 01.12.2011
comment
Вы можете использовать UNION - это вещь SQL, которая позволяет вам выполнять несколько запросов. - person Tom van der Woerdt; 01.12.2011
comment
Ах, я не знал, что вы посчитали это вторым запросом. Я говорил о классической атаке SQL-инъекцией, которую большинство библиотек сейчас делают избыточной, когда вы входите на сайт с '; DROP TABLE users; -- - person Steve Rukuts; 01.12.2011