Введение
В этом лабораторном занятии вы узнаете о SQL-инъекции, технике, которую используют атакующие для эксплойта уязвимостей в веб-приложениях, взаимодействующих с базами данных. Атаки SQL-инъекцией могут дать несанкционированный доступ к конфиденциальным данным, позволить манипулировать данными и даже полностью взломать систему.
Цель этого лабораторного занятия - получить практический опыт работы с SQL-инъекцией, эксплуатируя уязвимости в уязвимом веб-приложении. Вы научитесь определять потенциальные уязвимости SQL-инъекции, создавать вредоносные SQL-запросы и извлекать конфиденциальную информацию из базы данных. Кроме того, вы узнаете о механизмах защиты и лучших практиках для предотвращения атак SQL-инъекцией.
Настройка лабораторной среды
На этом шаге вы настроите лабораторную среду, которая включает в себя уязвимое веб-приложение и сервер базы данных.
Откройте терминал и перейдите в каталог
/home/labex/project.cd /home/labex/projectВ каталоге
projectесть два файла Python:app.pyиsetup_db.py. Файлapp.pyсодержит исходный код уязвимого веб-приложения, а файлsetup_db.pyсодержит код для настройки базы данных.Запустите скрипт
setup_db.pyдля создания базы данных и заполнения ее примером данных.python3 setup_db.pyЗапустите сервер веб-приложения.
python3 app.py
Вы должны увидеть сообщение, которое указывает, что сервер запущен по адресу http://localhost:5000.
Определение уязвимостей SQL - инъекции
На этом шаге вы научитесь определять потенциальные уязвимости SQL-инъекции в веб-приложении.
- Откройте веб-браузер и перейдите по адресу
http://localhost:5000.
- Найдите поля ввода, в которых пользовательские данные отправляются на сервер, например, поисковые поля.
- Попробуйте ввести специальные символы или ключевые слова SQL (например,
',",--,;) в поля ввода и наблюдайте за поведением приложения. - Если приложение выводит сообщения об ошибках или ведет себя неожиданно, это может указывать на потенциальную уязвимость SQL-инъекции.
Когда вы вводите одинарную кавычку (') в поисковое поле и нажимаете кнопку "Search", приложение просто выводитNo results foundбез какого-либо сообщения об ошибке. Это поведение предполагает, что приложение может быть уязвимым к SQL-инъекции.
Эксплуатация уязвимостей SQL-инъекции
На этом шаге вы научитесь эксплуатировать выявленные уязвимости SQL-инъекции для извлечения конфиденциальной информации из базы данных.
Найдите уязвимое поле ввода или параметр, определенные на предыдущем шаге.
Попробуйте вставить различные полезные нагрузки (payloads) SQL-инъекции в поле ввода или параметр.
Попытайтесь извлечь конфиденциальную информацию из базы данных с использованием полезных нагрузок SQL-инъекции. Например, вы можете использовать следующую полезную нагрузку для извлечения данных из базы данных:
' UNION SELECT username, password FROM users --Вышеуказанная полезная нагрузка может быть использована для получения имен пользователей и паролей из таблицы
usersв базе данных.Следите за реакцией приложения и ищите любую конфиденциальную информацию, которая отображается, или ошибки, которые могут раскрыть информацию о структуре или содержимом базы данных.
Снижение риска уязвимостей SQL-инъекции
На этом шаге вы узнаете о механизмах защиты и лучших практиках для предотвращения уязвимостей SQL-инъекции.
Просмотрите исходный код уязвимого веб-приложения и определите области, где пользовательский ввод используется в запросах к базе данных без соответствующей очистки.
Реализуйте методы валидации и очистки ввода, такие как:
- Параметризованные запросы или подготовленные выражения (parameterized queries or prepared statements)
- Валидация и очистка ввода (например, удаление или экранирование специальных символов)
- Принцип наименьших привилегий для учетных записей базы данных
Обновите код приложения, чтобы использовать параметризованные запросы или подготовленные выражения при выполнении запросов к базе данных с использованием пользовательского ввода. Измените файл
app.pyс:sql_query = "SELECT username, password FROM users WHERE username LIKE '%{}%' OR '{}'".format(query, query) cur.execute(sql_query)на:
sql_query = "SELECT username, password FROM users WHERE username LIKE?" cur.execute(sql_query, ('%' + query + '%',))И переместите
results = cur.fetchall()под строкуlogging.info(f"Search query: {query}").logging.info(f"Search query: {query}") results = cur.fetchall()После внесения вышеуказанных изменений сохраните файл и перезапустите сервер веб-приложения.
Используйте
ctrl+c, чтобы остановить сервер, а затем запустите его снова с помощью:python3 app.pyПротестируйте обновленное приложение, чтобы убедиться, что атаки SQL-инъекцией больше невозможны.
Резюме
В этой лабораторной работе вы узнали о SQL-инъекции, методе, используемом атакающими для эксплоитации уязвимостей в веб-приложениях, взаимодействующих с базами данных. Вы настроили уязвимое веб-приложение и сервер базы данных, обнаружили потенциальные уязвимости SQL-инъекции и эксплуатировали их для извлечения конфиденциальной информации из базы данных. Кроме того, вы узнали о механизмах защиты и лучших практиках для предотвращения атак SQL-инъекцией, таких как валидация ввода, очистка и использование параметризованных запросов или подготовленных выражений.
В результате этого практического опыта вы получили более глубокое понимание атак SQL-инъекцией и способов их предотвращения в веб-приложениях. Вы также поняли важность безопасных практик программирования и возможные последствия неправильной очистки пользовательского ввода при взаимодействии с базами данных.