SQL-инъекция

Beginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы узнаете о SQL-инъекции, технике, которую используют атакующие для эксплойта уязвимостей в веб-приложениях, взаимодействующих с базами данных. Атаки SQL-инъекцией могут дать несанкционированный доступ к конфиденциальным данным, позволить манипулировать данными и даже полностью взломать систему.

Цель этого лабораторного занятия - получить практический опыт работы с SQL-инъекцией, эксплуатируя уязвимости в уязвимом веб-приложении. Вы научитесь определять потенциальные уязвимости SQL-инъекции, создавать вредоносные SQL-запросы и извлекать конфиденциальную информацию из базы данных. Кроме того, вы узнаете о механизмах защиты и лучших практиках для предотвращения атак SQL-инъекцией.


Skills Graph

Настройка лабораторной среды

На этом шаге вы настроите лабораторную среду, которая включает в себя уязвимое веб-приложение и сервер базы данных.

  1. Откройте терминал и перейдите в каталог /home/labex/project.

    cd /home/labex/project
  2. В каталоге project есть два файла Python: app.py и setup_db.py. Файл app.py содержит исходный код уязвимого веб-приложения, а файл setup_db.py содержит код для настройки базы данных.

  3. Запустите скрипт setup_db.py для создания базы данных и заполнения ее примером данных.

    python3 setup_db.py
  4. Запустите сервер веб-приложения.

    python3 app.py

Вы должны увидеть сообщение, которое указывает, что сервер запущен по адресу http://localhost:5000.

Определение уязвимостей SQL-инъекции

На этом шаге вы научитесь определять потенциальные уязвимости SQL-инъекции в веб-приложении.

  1. Откройте веб-браузер и перейдите по адресу http://localhost:5000.
    Главная страница веб-приложения
  2. Найдите поля ввода, в которых пользовательские данные отправляются на сервер, например, поисковые поля.
  3. Попробуйте ввести специальные символы или ключевые слова SQL (например, ', ", --, ;) в поля ввода и наблюдайте за поведением приложения.
  4. Если приложение выводит сообщения об ошибках или ведет себя неожиданно, это может указывать на потенциальную уязвимость SQL-инъекции.
    Тест ввода в поисковое поле
    Когда вы вводите одинарную кавычку (') в поисковое поле и нажимаете кнопку "Search", приложение просто выводит No results found без какого-либо сообщения об ошибке. Это поведение предполагает, что приложение может быть уязвимым к SQL-инъекции.

Эксплуатация уязвимостей SQL-инъекции

На этом шаге вы научитесь эксплуатировать выявленные уязвимости SQL-инъекции для извлечения конфиденциальной информации из базы данных.

  1. Найдите уязвимое поле ввода или параметр, определенные на предыдущем шаге.

  2. Попробуйте вставить различные полезные нагрузки (payloads) SQL-инъекции в поле ввода или параметр.

  3. Попытайтесь извлечь конфиденциальную информацию из базы данных с использованием полезных нагрузок SQL-инъекции. Например, вы можете использовать следующую полезную нагрузку для извлечения данных из базы данных:

    ' UNION SELECT username, password FROM users --

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

  4. Следите за реакцией приложения и ищите любую конфиденциальную информацию, которая отображается, или ошибки, которые могут раскрыть информацию о структуре или содержимом базы данных.

Предотвращение уязвимостей SQL-инъекции

На этом шаге вы узнаете о механизмах защиты и лучших практиках для предотвращения уязвимостей SQL-инъекции.

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

  2. Реализуйте методы валидации и очистки ввода, такие как:

    • Параметризованные запросы или подготовленные выражения (parameterized queries or prepared statements)
    • Валидация и очистка ввода (например, удаление или экранирование специальных символов)
    • Принцип наименьших привилегий для учетных записей базы данных
  3. Обновите код приложения, чтобы использовать параметризованные запросы или подготовленные выражения при выполнении запросов к базе данных с использованием пользовательского ввода.
    Измените файл 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()
  4. После внесения вышеуказанных изменений сохраните файл и перезапустите сервер веб-приложения.

    Используйте ctrl+c, чтобы остановить сервер, а затем запустите его снова с помощью:

    python3 app.py
  5. Протестируйте обновленное приложение, чтобы убедиться, что атаки SQL-инъекцией больше невозможны.

Итоги

В этой лабораторной работе вы узнали о SQL-инъекции, методе, используемом атакающими для эксплоитации уязвимостей в веб-приложениях, взаимодействующих с базами данных. Вы настроили уязвимое веб-приложение и сервер базы данных, обнаружили потенциальные уязвимости SQL-инъекции и эксплуатировали их для извлечения конфиденциальной информации из базы данных. Кроме того, вы узнали о механизмах защиты и лучших практиках для предотвращения атак SQL-инъекцией, таких как валидация ввода, очистка и использование параметризованных запросов или подготовленных выражений.

В результате этого практического опыта вы получили более глубокое понимание атак SQL-инъекцией и способов их предотвращения в веб-приложениях. Вы также поняли важность безопасных практик программирования и возможные последствия неправильной очистки пользовательского ввода при взаимодействии с базами данных.