0Pricing
Security+ Academy · Урок

SQL-инъекции и командные инъекции

Узнайте, как злоумышленники создают инъекционные полезные нагрузки, изменяющие запросы к базам данных или команды OS, и как параметризованные запросы и проверка входных данных предотвращают такие атаки.

«SQL-инъекции и командные инъекции» — бесплатный урок Security+ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Security+ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Security+ Academy содержит 4 уроков всего.

Что такое SQL Injection

SQL Injection (SQLi) возникает, когда атакующий вставляет, или «инъецирует», вредоносный код SQL в поле ввода, значение которого позднее передаётся в запрос к базе данных. Поскольку приложение напрямую объединяет пользовательский ввод с оператором SQL, база данных не может отличить легитимные данные от команд, переданных атакующим. SQLi стабильно входит в число наиболее опасных уязвимостей веб-приложений в OWASP Top 10.

Пример классической полезной нагрузки SQLi

Уязвимый запрос входа в систему может выглядеть так: SELECT * FROM users WHERE username='INPUT' AND password='INPUT'. Если атакующий укажет ' OR '1'='1 в качестве имени пользователя, запрос изменится так, что условие WHERE всегда будет истинным, полностью обходя аутентификацию. Это классическое внедрение на основе тавтологии.

-- Vulnerable query (DO NOT use in production)
SELECT * FROM users
WHERE username = '' OR '1'='1'
  AND password = 'anything';
-- Returns ALL rows — auth bypassed

Типы SQL Injection

Атаки SQL Injection бывают нескольких типов: In-band SQLi возвращает результаты непосредственно в HTTP-ответе (на основе ошибок или объединения запросов). Blind SQLi извлекает данные косвенно, используя логические ответы «истина/ложь» или намеренные временные задержки (SLEEP(5)). Out-of-band SQLi использует дополнительные каналы, например DNS-запросы, чтобы извлечь данные, когда ответы недоступны.

-- Time-based blind SQLi example
SELECT * FROM users
WHERE id = '1' AND SLEEP(5)--';
-- If response is delayed 5s, injection succeeded

Предотвращение SQLi: параметризованные запросы

Основная защита от SQL Injection — параметризованные запросы, также называемые подготовленными операторами. В параметризованном запросе структура SQL сначала компилируется, а пользовательский ввод передаётся как отдельный параметр — он не может изменить структуру запроса. Этот подход не зависит от языка программирования и гораздо надёжнее одной лишь очистки входных данных.

# Python example — parameterized query (safe)
import sqlite3
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
username = 'admin'
password = 'secret'
cursor.execute(
    'SELECT * FROM users WHERE username=? AND password=?',
    (username, password)  # parameters, never concatenated
)

Проверка входных данных как многоуровневая защита

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

Что такое внедрение команд

Command injection (внедрение команд ОС) возникает, когда приложение передаёт неочищенный пользовательский ввод системной оболочке. В отличие от SQL Injection, направленной на базы данных, внедрение команд атакует саму операционную систему и позволяет злоумышленникам выполнять произвольные команды с привилегиями процесса веб-сервера. Такая уязвимость имеет критический уровень серьёзности и часто приводит к полной компрометации системы.

Пример внедрения команд

Веб-приложение, которое отправляет запрос ping на указанный пользователем IP-адрес, может использовать: ping -c 1 INPUT. Если атакующий передаст 8.8.8.8; cat /etc/passwd, оболочка интерпретирует ; как разделитель команд и выполнит обе команды. К распространённым операторам внедрения относятся ;, &&, ||, | и подстановка команд с помощью обратных кавычек.

# Vulnerable Python (subprocess with shell=True)
import subprocess
user_ip = '8.8.8.8; cat /etc/passwd'  # attacker input
subprocess.run('ping -c 1 ' + user_ip, shell=True)

# Safe alternative — avoid shell=True, pass args as list
subprocess.run(['ping', '-c', '1', '8.8.8.8'])

Предотвращение внедрения команд

Самая безопасная защита от внедрения команд — полностью отказаться от вызова команд ОС с использованием пользовательского ввода и применять библиотечные функции, выполняющие ту же задачу. Если без вызовов оболочки не обойтись, передавайте аргументы в виде списка, а не объединённой строки, отключайте интерпретацию оболочкой, проверяйте ввод по строгому списку разрешённых значений и запускайте процессы от имени учётной записи пользователя с минимально необходимыми привилегиями.

Контекст OWASP: инъекции в списке 10 основных угроз

В списке 10 основных угроз OWASP инъекция (включающая инъекции SQL, NoSQL, OS и LDAP) указана как один из наиболее критичных рисков для безопасности приложений. OWASP рекомендует использовать многоуровневую защиту: применять безопасные API, не задействующие интерпретатор, выполнять позитивную проверку входных данных на стороне Server по списку разрешённых значений, экранировать специальные символы с использованием синтаксиса, специфичного для данного интерпретатора, а также применять средства управления SQL, такие как LIMIT, чтобы предотвратить массовое раскрытие данных.

Обнаружение: WAF и ведение журналов

межсетевой экран веб-приложения (WAF) может обнаруживать и блокировать распространённые полезные нагрузки для инъекций, проверяя HTTP-запросы на соответствие сигнатурам. Однако WAF можно обойти с помощью уловок с кодированием, и он не заменяет безопасную разработку. Надлежащее ведение журналов приложения — запись параметров запросов, кодов ответов и сообщений об ошибках — позволяет командам безопасности выявлять попытки инъекций при разборе инцидентов.

Реальные последствия атак с использованием инъекций

Атаки с использованием инъекций стали причиной некоторых крупнейших утечек данных в истории. В результате утечки данных Equifax в 2017 году из-за уязвимости веб-приложения были раскрыты сведения о 147 миллионах записей. SQL-инъекция против сети Sony PlayStation Network в 2011 году скомпрометировала 77 миллионов учётных записей. Эти инциденты показывают, что уязвимости, связанные с инъекциями, могут иметь крайне серьёзные последствия для бизнеса: успешная атака приводит к краже данных, регуляторным штрафам, ущербу репутации и юридической ответственности.

Быстрая проверка

Проверьте своё понимание концепций CompTIA Security+ (SY0-701), рассмотренных в этом уроке.

Итоги урока

В этом уроке Вы узнали, что SQL-инъекция использует неочищенные входные данные, объединённые с запросами к базе данных, инъекция команд передаёт вредоносные входные данные оболочке OS с помощью таких операторов, как ; и |, а параметризованные запросы и отказ от использования shell=True являются основными средствами защиты. Далее мы рассмотрим межсайтовый скриптинг (XSS) и атаки CSRF.

Часто задаваемые вопросы

Урок «SQL-инъекции и командные инъекции» бесплатный?

Да — полный текст урока «SQL-инъекции и командные инъекции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Security+ Academy, подпишись на CoddyKit PRO. Курс Security+ Academy содержит 4 уроков всего.

Чему я научусь в уроке «SQL-инъекции и командные инъекции»?

Узнайте, как злоумышленники создают инъекционные полезные нагрузки, изменяющие запросы к базам данных или команды OS, и как параметризованные запросы и проверка входных данных предотвращают такие ата… Ты практикуешь Security+ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Security+ Academy?

Предыдущий опыт не требуется. Security+ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «SQL-инъекции и командные инъекции»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Security+ Academy?

Да. Каждый урок Security+ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. SQL-инъекции и командные инъекции
  2. Межсайтовый скриптинг (XSS) и CSRF
  3. Нарушенная аутентификация и небезопасная десериализация
  4. Безопасный SDLC, инструменты SAST и DAST
← Назад к Security+ Academy