Как выполнить атаку SQL-инъекцией на этот код?

На локальном сервере xampp, который я настроил для разработки, у меня есть такая таблица:

CREATE TABLE `entries`
(

`id` int(10) UNSIGNED NOT NULL,

`title` varchar(100) NOT NULL,

`entry` text NOT NULL,

`date_entered` datetime NOT NULL

)

Чтобы узнать, как защитить свои запросы от SQL-инъекций, я хочу вызвать их (я намеренно не использую подготовленные операторы). У меня есть запрос, чтобы вставить запись в этой таблице, например, так:

$sql = 'insert into entries ( title , entry , date_entered ) '
    . 'values("'
    . $postTitle
    . '","'
    . $postEntry
    . '","'
    . $dateEntered
    . '")';

Это работает (он вставляет записи в таблицу), но мне не удалось вызвать SQL-инъекцию против него. Вот что я пытался вставить в $postEntry поле:

;drop table entries;
;drop table entries;'
';drop table entries;'
`;drop table entries;'
q';drop table entries;
q","e");drop table entries; --'
q","e");drop table entries;--

Для последнего значения SQL-запрос стал:

insert into entries ( title , entry , date_entered ) values("r","q","e");drop table entries;--","2016-08-18 10:35:36")

Все еще таблица записей в целости и сохранности!

Я изменил строку SQL, чтобы использовать одинарные кавычки, например:

$sql = 'insert into entries ( title , entry , date_entered ) '
    . ' values(\''
    . $postTitle
    . '\',\''
    . $postEntry
    . '\',\''
    . $dateEntered
    . '\')';

Потом попробовал:

q','2016-5-5');drop table entries; --'

Но все равно не повезло! Как я должен произвести атаку SQL-инъекции тогда? примечание: предложенный дубликат не является дубликатом и даже не является ответом. весь смысл этого вопроса в том, чтобы продемонстрировать expoite, чтобы убедиться, что меры безопасности работают.

3 ответа

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

Так, например, вы можете охватить таблицу, добавив массу дополнительных материалов из одного поста. Вам нужно будет поработать над этим, но вы можете попробовать установить $postEntry так:

poo'),'2016-5-6'),('poo','poooo','2016-5-5'),('poo','poooo

Идея состоит в том, что начало строки $postEntry сначала правильно завершает исходный запрос, затем добавляет дополнительные значения и затем заканчивается в точке, в которой исходный запрос собирался заключить одну кавычку вокруг значения $postEntry. Вам нужно было бы установить $postEntry, чтобы это было именно то, что я набрал.. Я думаю..:)

Я не собирался больше добавлять к своему ответу, поскольку я не хотел, чтобы вы думали, что я хакер:| но я думаю, чтобы помочь вам понять, как хакер может злоупотребить вашим кодом, я могу показать вам другой путь.

Например, скажем, я хотел больше узнать о системе и о том, как (потенциально) я могу раскрыть пароли, данные карты и т. Д., И мы предполагаем, что я уже нашел слабое место, подобное тому, которое вы создали.

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

В результате я могу в значительной степени использовать поле postEntry в качестве вывода для отображения результата любых запросов SQL, манипулируя значением postTitle.

ПРИМЕЧАНИЕ: я, возможно, пропустил одну цитату или что-то еще, потому что я просто набираю это на лету, основываясь на том, что, как я знаю, может сработать, поэтому вам придется немного поэкспериментировать с теорией. Я почти уверен, что мой пример кода можно скопировать и вставить.

Шаг 1). Раскройте список таблиц, доступных для запроса. Установите $postTitle (не entry) следующим образом:

poo',SELECT GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEME.TABLES),'2016-5-5'),'poo

После отправки этого сообщения (и при условии, что вы переходите на страницу с моим сообщением) основная область сообщений должна содержать разделенный запятыми список таблиц из базы данных.

Шаг 2). Очистка Скопируйте список и немедленно удалите мой пост, чтобы уменьшить статус оповещения для всех, кто смотрит.

Шаг 3). Получить имена столбцов таблицы Используйте точно такой же метод для создания оператора SELECT, который выбирает все имена COLUMN из определенной таблицы, имена которой я теперь знаю. Я получаю сообщение, которое содержит отдельный список столбцов для этой таблицы.

Шаг 4). Убери снова

Шаг 5). Вы, вероятно, можете видеть, куда это движется сейчас. Теперь я могу в значительной степени выбрать любые данные из любой таблицы, запустив оператор SELECT и просмотрев вывод в моем сообщении.

Mysql не позволяет использовать несколько операторов в одном запросе. Вот почему операторы Drop игнорируются.

использование mysqli_multi_query() для нескольких запросов.

Вы все еще можете использовать другие инъекции здесь.

Попробуйте использовать

http://sqlmap.org/

чтобы проверить уязвимость вашего кода.

Другие вопросы по тегам