На этом уроке мы сделаем бекап базы данных, затем продемонстрируем «взлом» страницы посредством SQL-инъекции, покажем, как от этого защититься и потом восстановим базу данных.
Дата отправки отчёта:
30 октября 2018 г.
Задание выполнено: за
4 час. 48 мин.
Чему научился:
mysqldump -u root -p STORY > c:\safe\story418.sql - бекап БД drop table story; - удалить таблицу story mysql -u root -p story < c:\csharp\story3.sql - восстановить таблицу story из файла бэкапа
Начали крушить. В адресной строке вызова истории по номеру после цифры номера истории добавив следующее '; DELETE FROM story; SELECT 'a грохнули все записи таблицы story
В адресной строке вызова истории по номеру после цифры номера истории добавив следующее '; DROP TABLE story; SELECT 'a грохнули саму таблицу story Добавили метод адэдэслешс во имя экранирования апострофов, "восстановили" первый раз ЗАТЕРЕВ бэкап (боязно было), но был второй файл - он спас. Бэкап - наше всё. Инъекция - зло.
'1' заменяется на '1'; DELETE FROM story; SELECT 'a'
То есть промеж апострофов была единичка - номер истории(ОНА ЖЕ ПАРОВОЗ), а становится целый поезд (ВАГОНЫ ИНЪЕКЦИИ). И чтобы диспетчер этот эшелон пропустил в тыл врага в конце цепляется вагончик с как бы здоровым запросом СЕЛЕКТ а В третьей строке этого комментария крайние апострофы указаны для чистоты понимания и сличения с первой строкой, где единица в тех же апострофах, как она видится в коде. Но, поскольку, в адресной строке браузера, куда тычется противный злоумышленник с гаечным ключом отворачивающий гаечку для рыбалки, как у Чехова, крайние апострофы не пишутся (они видны лишь в коде), то гадить надо так после номера истории (единицы в нашем случае): 1'; DELETE FROM story; SELECT 'a
Научился: Интересно, что у меня при таком же, как в уроке, запросе, в ответ просто приходит ошибка, а не история по номеру в начале "инъекции". Видимо, какая-то разница в реализации MySQL и MSSQL.
Конечно, если н епредусмотреть защиту от SQL-инъекций, то возможности для злоумышленника поистине безграничны :) Интересно почитать на эту тему, потому что подозреваю, что одной такой предосторожности, как в уроке, явно недостаточно.
Научился: Сделалал бекап базы данных двумя способами
Написал в адресной строке браузера SQL-инъекцию
Убедился, что она сработала: записи из таблицы удалены
Добавил в модель MySQL функцию addslashes()
Проверил, что SQL-инъекция не проходит
Восстановил базу данных из бекапа
Трудности: все понятно, интересная тема.
В какую сторону нужно копать, чтобы разобраться с одинарными ковычками и слешами в представлении SQL запроса в коде?