Про пентест и кибербезопасность

Kali Linux, SQL injections, XSS, JavaScript and etc

Обучение JS / XSS (скоро)

XSS, или межсайтовый скриптинг, — это тип атаки на веб-приложения, при которой злоумышленники встраивают злонамеренные скрипты в контент, отображаемый другим пользователям. Это может произойти, когда приложение принимает пользовательский ввод и возвращает его без должной проверки или очистки, что позволяет скриптам выполняться в браузере другого пользователя. Эти скрипты могут читать данные сессии, украсть личные данные, или даже перехватить контроль над аккаунтом пользователя. Существуют различные типы XSS-атак, включая отраженные, сохраненные и DOM-основанные XSS.


Написано на

От

SQL-инъекции: полное руководство с примерами и методами защиты

SQL-инъекции — это одна из самых опасных и распространенных уязвимостей в веб-приложениях. Они позволяют злоумышленникам вмешиваться в запросы к базе данных, что может привести к утечке данных, повреждению информации или даже полному захвату системы. В этой статье мы разберем, что такое SQL-инъекции, как они работают, и как защитить ваше приложение от этой угрозы.


Что такое SQL-инъекция?

SQL-инъекция — это техника атаки, при которой злоумышленник внедряет вредоносный SQL-код в запросы к базе данных. Это происходит, если приложение некорректно обрабатывает пользовательский ввод, позволяя злоумышленнику изменить логику SQL-запроса.

Пример уязвимого кода:

Представьте, что у вас есть форма входа, которая проверяет логин и пароль следующим образом:

SELECT * FROM users WHERE username = 'пользовательский_ввод' AND password = 'пользовательский_ввод';

Если пользователь введет admin' -- в поле логина, запрос превратится в:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'пользовательский_ввод';

Комментарий -- игнорирует остальную часть запроса, и злоумышленник получает доступ к учетной записи администратора.


Типы SQL-инъекций

1. Классическая SQL-инъекция

Злоумышленник изменяет логику запроса, добавляя вредоносный SQL-код. Например:

SELECT * FROM users WHERE id = 1; DROP TABLE users; --

Этот запрос удалит таблицу users.

2. Слепая SQL-инъекция

Злоумышленник не видит результат запроса, но может определить его по поведению приложения. Например:

SELECT * FROM users WHERE id = 1 AND (SELECT COUNT(*) FROM users) > 10;

Если приложение ведет себя по-разному в зависимости от результата, злоумышленник может извлечь данные.

3. Инъекция на основе времени

Злоумышленник использует задержки для определения результата запроса. Например:

SELECT * FROM users WHERE id = 1 AND IF(1=1, SLEEP(5), 0);

Если приложение задерживает ответ на 5 секунд, злоумышленник понимает, что условие истинно.

4. Инъекция в хранимых процедурах

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


Примеры SQL-инъекций

Пример 1: Обход аутентификации

Уязвимый код:

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password';";

Атака:

  • Введите admin' -- в поле логина.
  • Запрос превратится в:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'пользовательский_ввод';

Результат: доступ к учетной записи администратора.

Пример 2: Извлечение данных

Уязвимый код:

$id = $_GET['id'];
$query = "SELECT * FROM products WHERE id = $id;";

Атака:

  • Введите 1 UNION SELECT username, password FROM users --.
  • Запрос превратится в:

SELECT * FROM products WHERE id = 1 UNION SELECT username, password FROM users --';

Результат: злоумышленник получает логины и пароли пользователей.

Пример 3: Удаление данных

Уязвимый код:

$id = $_GET['id'];
$query = "DELETE FROM products WHERE id = $id;";

Атака:

  • Введите 1; DROP TABLE users; --.
  • Запрос превратится в:

DELETE FROM products WHERE id = 1; DROP TABLE users; --';

Результат: таблица users удалена.


Как защититься от SQL-инъекций?

1. Используйте подготовленные выражения (Prepared Statements)

Подготовленные выражения отделяют код от данных, что предотвращает внедрение SQL-кода. Пример на Python с использованием psycopg2:

import psycopg2

conn = psycopg2.connect("dbname=test user=postgres password=secret")
cursor = conn.cursor()
query = "SELECT * FROM users WHERE username = %s AND password = %s;"
cursor.execute(query, (username, password))

2. Используйте ORM

ORM (Object-Relational Mapping) автоматически экранирует пользовательский ввод. Пример на Django:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=100)

User.objects.filter(username=username, password=password)

3. Валидация и санитизация ввода

Проверяйте и очищайте пользовательский ввод. Например, используйте регулярные выражения для удаления опасных символов.

4. Ограничение прав доступа

Используйте учетные записи с минимальными правами для доступа к базе данных. Например, если приложению не нужно удалять данные, не давайте ему права на DELETE.

5. Используйте Web Application Firewall (WAF)

WAF может блокировать подозрительные запросы, включая попытки SQL-инъекций.

6. Регулярное тестирование

Проводите регулярное тестирование на уязвимости, используя инструменты вроде SQLMap или Burp Suite.


Инструменты для тестирования на SQL-инъекции

1. SQLMap

SQLMap — это мощный инструмент для автоматического поиска и эксплуатации SQL-инъекций. Пример использования:

sqlmap -u "http://example.com/page?id=1" --dbs

2. Burp Suite

Burp Suite позволяет анализировать запросы и ответы, а также тестировать на уязвимости, включая SQL-инъекции.

3. OWASP ZAP

ZAP — это open-source инструмент для тестирования безопасности веб-приложений.


Заключение

SQL-инъекции остаются одной из самых опасных уязвимостей в веб-приложениях. Однако, следуя лучшим практикам, таким как использование подготовленных выражений, ORM и регулярное тестирование, вы можете значительно снизить риск атак. Помните, что безопасность — это не разовое мероприятие, а постоянный процесс.