Top 3 chyby webových aplikací: od výčtu uživatelů až po SQL injekce
Výčet uživatelů (User Enumeration)
Tato zranitelnost vzniká, když server poskytuje různé odpovědi na dotazy s existujícími a neexistujícími přihlašovacími jmény. Hackeři analyzují odpovědi a provádějí zaměřené brute-force útoky s jistým úspěchem.
Příznaky zranitelnosti:
- Různé textové zprávy: "Uživatel nenalezen" vs. "Špatné heslo".
- Časové rozdíly: 50 ms pro registrovaného uživatele proti 2000 ms pro neexistujícího.
Po identifikaci platných přihlašovacích jmen útočník získává přístup k účtu a rozšiřuje oblast testování s vyššími oprávněními.
Meziwebový skriptování (XSS)
XSS umožňuje vkládat JavaScript do stránek, které zobrazují uživatelé. Prohlížeč spouští skript jako legitimní kód. Klasický reflected XSS je nejčastěji reprodukovatelný.
Následky:
- Krádež cookies a relačních tokenů s odesláním na externí server.
- Zachycení relace: provedení akcí v názoru oběti (změna hesla, transakce).
- Phishing prostřednictvím podvržení uživatelského rozhraní.
- Šíření malware prostřednictvím přesměrování.
SQL injekce
Útočník upravuje SQL dotazy prostřednictvím uživatelského vstupu. Příklad: zadání 'admin' -- obejde ověření hesla a ignoruje část dotazu za komentářem.
Typické dotazy jako SELECT * FROM users WHERE login='input' AND password='input' se stávají zranitelnými bez ochrany.
Rizika:
- Dumps dat: přihlašovací jména, hesla, platební informace.
- Úprava dat: změna zůstatků, přidání správců.
- Smazání tabulek.
- Eskalace na RCE prostřednictvím DBMS.
Metody odstranění
Pro výčet uživatelů jednotně formátujte odpovědi na všech fázích autentizace: přihlášení, registrace, obnova hesla. Zajistěte konstantní čas odezvy pomocí paddingu nebo limitování rychlosti.
XSS odstraňte sanitací na výstupu. Ekvivalejte:
- V HTML:
<→<,>→>. - V atribucích:
"→". - V JS: escape řetězců.
Použijte knihovny jako DOMPurify pro bezpečné HTML s povolením určitých tagů (tučné, kurzíva v komentářích).
SQL vyžaduje použití připravených příkazů nebo ORM. Příklad v PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE login = ? AND password = ?");
$stmt->execute([$login, $password]);
Parametry jsou zpracovány ovladačem, což vylučuje provedení vstupu jako kódu. Pro dynamické dotazy použijte escape prostřednictvím mysqli_real_escape_string nebo ekvivalentu.
Co je důležité
- Výčet uživatelů je nejčastější bezpečnostní mezera, detekovatelná podle času a zpráv.
- XSS se řeší kódováním výstupu; ověření vstupu nestačí.
- SQL injekce se řeší parametrizací; nikdy nekombinujte řetězce v dotazech.
- Pravidelný pentest odhalí řetězce útoků: výčet → XSS → SQL injekce.
Pentest imituje reálné útoky a poskytuje detailní zprávu s PoC, riziky a opatřeními. Bez něj zůstávají systémy slepé vůči evolučním hrozbám.
— Editorial Team
Zatím žádné komentáře.