
Полная версия
Хакинг – Угрозы, Взломы, Безопасность

Петр Ласточкин
Хакинг – Угрозы, Взломы, Безопасность
ХАКИНГ - Угрозы, Взломы, Безопасность
Оглавление
ГЛАВА 1 - SQL-инъекции
ГЛАВА 2 - XSS (межсайтовый скриптинг)
ГЛАВА 3 - CSRF (межсайтовая подделка запросов)
ГЛАВА 4 - Уязвимости в аутентификации
ГЛАВА 5 - Безопасность файловых загрузок
ГЛАВА 6 - Уязвимости в сессиях
ГЛАВА 7 - PHP-обфускация
ГЛАВА 8 - Логи и их безопасность

ГЛАВА 9 - Инъекции команд
ГЛАВА 10 - Безопасное хранение паролей
ГЛАВА 11 - Уязвимости в API
ГЛАВА 12 - Проблемы кросс-доменных запросов
ГЛАВА 13 - Проблемы с конфигурацией сервера
ГЛАВА 14 - Уязвимости в кэшировании
ГЛАВА 15 - Анализ кода на уязвимости
ГЛАВА 16 - Социальная инженерия и PHP
ГЛАВА 1 - SQL-инъекции
Введение в SQL-инъекции
1. Описание
SQL-инъекция (SQL Injection) – это тип уязвимости веб-приложений, который
позволяет злоумышленнику вставлять или "инъектировать" произвольные SQL-
запросы в запросы к базе данных. Это может привести к несанкционированному
доступу к данным, их изменению или даже удалению. SQL-инъекции возникают,
когда пользовательский ввод не обрабатывается должным образом и напрямую
используется в SQL-запросах.
История SQL-инъекций восходит к началу 90-х годов, когда веб-приложения
начали активно взаимодействовать с базами данных. С тех пор SQL-инъекции
стали одной из самых распространенных и опасных уязвимостей в веб-
приложениях. По данным OWASP (Open Web Application Security Project), SQL-
инъекции регулярно занимают верхние строчки в списках наиболее критичных
уязвимостей.
2. Пример кода
Рассмотрим простой пример уязвимого кода на PHP, который использует
пользовательский ввод для выполнения SQL-запроса:
// Получаем значение параметра 'id' из GET-запроса
$id = $_GET['id'];
// Формируем SQL-запрос

$query = "SELECT * FROM users WHERE id = $id";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
// Обработка результата
while ($row = mysqli_fetch_assoc($result)) {
echo $row['username'];
}
?>
3. Подробный разбор кода
В этом коде мы видим, что значение параметра id берется напрямую из GET-
запроса. Затем это значение вставляется в SQL-запрос без какой-либо проверки
или обработки. Это создает уязвимость, поскольку злоумышленник может
передать в параметре id произвольный SQL-код.
Например, если злоумышленник введет 1; DROP TABLE users;, то итоговый
запрос будет выглядеть так:
SELECT * FROM users WHERE id = 1; DROP TABLE users;
Этот запрос сначала извлечет данные о пользователе с id = 1, а затем удалит
всю таблицу users из базы данных.
4. Теоретический пример использования
Представим, что вы разрабатываете веб-приложение для управления
пользователями. Ваша цель – предоставить возможность пользователям
просматривать свои профили. Однако, если вы не обеспечите защиту от SQL-
инъекций, злоумышленник может воспользоваться этой уязвимостью.
Например, злоумышленник может ввести в поле URL параметр id, равный 1 OR
1=1. Это приведет к выполнению следующего запроса:
SELECT * FROM users WHERE id = 1 OR 1=1;
Этот запрос вернет всех пользователей из таблицы users, так как условие 1=1
всегда истинно. Таким образом, злоумышленник получит доступ к данным всех
пользователей, что может привести к утечке конфиденциальной информации.
Для предотвращения таких атак важно использовать методы защиты, такие как
подготовленные выражения и параметризованные запросы, которые гарантируют,













что пользовательский ввод не будет интерпретироваться как часть SQL-запроса.
Типы SQL-инъекций
1. Описание
SQL-инъекции можно классифицировать на несколько типов в зависимости от их
сложности и механизма действия. Основные типы SQL-инъекций включают:
Простые SQL-инъекции: Это базовые инъекции, которые используют
простые запросы для получения данных из базы.
Углубленные (или сложные) SQL-инъекции: Эти инъекции используют
более сложные техники, такие как подзапросы и объединения, чтобы извлечь
или модифицировать данные.
Бланковые SQL-инъекции: Эти инъекции не возвращают видимых данных,
но могут использоваться для выполнения команд или изменения данных в
базе.
Уязвимости на основе времени (Time-based): Эти инъекции используют
задержки в ответах базы данных для определения наличия уязвимостей.
2. Пример кода
Простой SQL-инъекция
// Получаем значение параметра 'username' из GET-запроса
$username = $_GET['username'];
// Формируем SQL-запрос
$query = "SELECT * FROM users WHERE username = '$username'";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
// Обработка результата
while ($row = mysqli_fetch_assoc($result)) {
echo $row['email'];
}
?>
Углубленная SQL-инъекция
// Получаем значение параметра 'id' из GET-запроса






$id = $_GET['id'];
// Формируем SQL-запрос
$query = "SELECT username, (SELECT COUNT(*) FROM orders WHERE user_id
= $id) as order_count FROM users WHERE id = $id";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
?>
Бланковая SQL-инъекция
// Получаем значение параметра 'id' из GET-запроса
$id = $_GET['id'];
// Формируем SQL-запрос
$query = "UPDATE users SET is_active = 0 WHERE id = $id";
// Выполняем запрос к базе данных
mysqli_query($connection, $query);
?>
Уязвимость на основе времени
// Получаем значение параметра 'id' из GET-запроса
$id = $_GET['id'];
// Формируем SQL-запрос
$query = "SELECT * FROM users WHERE id = $id AND IF((SELECT COUNT(*)
FROM users WHERE id = $id) = 1, SLEEP(5), 0)";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
?>
3. Подробный разбор кода
Простая SQL-инъекция: В этом примере злоумышленник может передать в
параметре username значение admin' –, что приведет к выполнению
запроса, который игнорирует все, что после –, и вернет данные о
пользователе с именем admin.








Углубленная SQL-инъекция: Здесь злоумышленник может передать в
параметре id значение 1 UNION SELECT username, password FROM users -
–, что позволит ему извлечь имена пользователей и пароли из таблицы
users.
Бланковая SQL-инъекция: В этом случае злоумышленник может передать
значение 1; DROP TABLE users; в параметре id, что приведет к
выполнению двух запросов – обновлению пользователя и удалению таблицы.
Уязвимость на основе времени: Злоумышленник может использовать
задержку для проверки существования пользователя. Например, передав 1
OR IF((SELECT COUNT(*) FROM users WHERE id = 1) = 1, SLEEP(5), 0), он
сможет определить, существует ли пользователь с id = 1, по времени
ответа.
4. Теоретический пример использования
Простая SQL-инъекция: Злоумышленник может использовать простую SQL-
инъекцию для получения списка всех пользователей, если веб-приложение
позволяет вводить имя пользователя. Он может ввести admin' OR '1'='1,
чтобы получить доступ к данным всех пользователей.
Углубленная SQL-инъекция: В случае углубленной SQL-инъекции
злоумышленник может использовать подзапросы для получения данных из
нескольких таблиц. Например, он может использовать 1 UNION SELECT
username, password FROM users для извлечения паролей.
Бланковая SQL-инъекция: Злоумышленник может использовать бланковую
инъекцию для выполнения несанкционированных действий, таких как
отключение учетной записи пользователя, передав значение 1; UPDATE users
SET is_active = 0 WHERE id = 1 .
Уязвимость на основе времени: Злоумышленник может использовать
временные задержки для проверки наличия учетных записей. Например, если
он передаст 1 OR IF((SELECT COUNT(*) FROM users WHERE username =
'admin') > 0, SLEEP(5), 0), он сможет определить, существует ли учетная
запись с именем admin, по времени ответа сервера.
Эти примеры демонстрируют, как различные типы SQL-инъекций могут быть
использованы злоумышленниками для атаки на веб-приложения и получения
несанкционированного доступа к данным.
Механизмы SQL-инъекций
1. Описание
























SQL-инъекции работают за счет манипуляции пользовательским вводом, который
не обрабатывается должным образом перед использованием в SQL-запросах.
Злоумышленники могут вставлять произвольные SQL-коды, чтобы изменить
логику выполнения запросов, извлекать, изменять или удалять данные из базы
данных. Основные механизмы SQL-инъекций включают использование
подзапросов и объединений, а также инъекции через параметры URL и формы.
2. Пример кода
1. Простой SQL-запрос с уязвимостью
// Получаем значение параметра 'username' из GET-запроса
$username = $_GET['username'];
// Формируем SQL-запрос
$query = "SELECT * FROM users WHERE username = '$username'";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
?>
2. Использование подзапросов
// Получаем значение параметра 'id' из GET-запроса
$id = $_GET['id'];
// Формируем SQL-запрос с подзапросом
$query = "SELECT username FROM users WHERE id = $id AND EXISTS
(SELECT * FROM orders WHERE user_id = $id)";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
?>
3. Инъекция через параметры URL
// Получаем значение параметра 'id' из GET-запроса
$id = $_GET['id'];
// Формируем SQL-запрос
$query = "SELECT * FROM products WHERE id = $id";



// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
?>
3. Подробный разбор кода
Простой SQL-запрос с уязвимостью: В этом коде значение параметра
username берется напрямую из GET-запроса и вставляется в SQL-запрос.
Злоумышленник может передать admin' –, что приведет к выполнению
запроса, который игнорирует все, что после –, и вернет данные о
пользователе с именем admin.
Использование подзапросов: В этом примере злоумышленник может
передать в параметре id значение 1 OR (SELECT COUNT(*) FROM users) >
0. Это приведет к выполнению запроса, который всегда будет истинным, и
вернет данные о пользователях, даже если id не существует.
Инъекция через параметры URL: В этом примере злоумышленник может
передать в параметре id значение 1; DROP TABLE products;. Это приведет
к выполнению двух запросов: первый извлечет данные о продукте с id = 1, а
второй удалит таблицу products.
4. Теоретический пример использования
Простой SQL-запрос с уязвимостью: Злоумышленник может использовать
этот механизм для получения данных о пользователе, введя в URL ?
username=admin' OR '1'='1. Это приведет к тому, что запрос вернет данные
о всех пользователях, так как условие всегда истинно.
Использование подзапросов: Злоумышленник может использовать
подзапросы для получения дополнительных данных. Например, он может
передать 1 UNION SELECT username, password FROM users, что позволит ему
извлечь имена пользователей и пароли из таблицы users.
Инъекция через параметры URL: Злоумышленник может использовать этот
механизм для выполнения несанкционированных действий, таких как
удаление таблиц или изменение данных. Например, передав 1; DELETE FROM
users;, он может удалить всех пользователей из базы данных.
Эти примеры показывают, как различные механизмы SQL-инъекций могут быть
использованы для атаки на веб-приложения и получения несанкционированного
доступа к данным. Правильная обработка пользовательского ввода и
использование подготовленных выражений могут помочь предотвратить такие
атаки.

























Примеры SQL-инъекций
1. Описание
Примеры SQL-инъекций помогают понять, как злоумышленники могут
использовать уязвимости в веб-приложениях для доступа к данным или их
изменения. В этом разделе мы рассмотрим несколько примеров кода,
демонстрирующих уязвимости, а также проанализируем реальные случаи атак,
чтобы подчеркнуть важность защиты от SQL-инъекций.
2. Пример кода
Пример 1: Уязвимый код на PHP
// Получаем значение параметра 'email' из GET-запроса
$email = $_GET['email'];
// Формируем SQL-запрос
$query = "SELECT * FROM users WHERE email = '$email'";
// Выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
// Обработка результата
if (mysqli_num_rows($result) > 0) {
echo "Пользователь найден!";
} else {
echo "Пользователь не найден.";
}
?>
Пример 2: Уязвимый код с использованием подзапросов
// Получаем значение параметра 'id' из GET-запроса
$id = $_GET['id'];
// Формируем SQL-запрос
$query = "SELECT username FROM users WHERE id = $id AND (SELECT
COUNT(*) FROM orders WHERE user_id = $id) > 0";
// Выполняем запрос к базе данных


$result = mysqli_query($connection, $query);
?>
3. Подробный разбор кода
Пример 1: В этом коде значение параметра email берется напрямую из GET-