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

Полная версия

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

Язык: Русский
Год издания: 2025
Добавлена:
Настройки чтения
Размер шрифта
Высота строк
Поля
На страницу:
1 из 7

Петр Ласточкин

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


ХАКИНГ - Угрозы, Взломы, Безопасность

Оглавление

ГЛАВА 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-

На страницу:
1 из 7