SQL injection je bil prvic dokumentiran v poznih 1990-ih, a se dosledno pojavlja v OWASP Top 10 in ostaja ena najbolj vplivnih ranljivosti, ki jih odkrivam med penetracijskimi testi. Nekatere ocene postavljajo SQLi za vec kot 30 % vseh kompromitacij spletnih aplikacij. Vprasanje ni, ali SQL injection obstaja -- vprasanje je, zakaj vztraja kljub desetletjem ozavescenosti. Zastarele kodne baze, napacna uporaba ORM, bliznjice razvijalcev pod casovnim pritiskom in narasajoca kompleksnost aplikacijskih skladov prispevajo k temu. SQL injection se skriva v paketnih uvozih, mehanizmih porocanja, administratorskih ploscah in integracijah tretjih oseb, ki sproti sestavljajo poizvedbe.
Kje se SQLi se vedno pojavlja
- Dinamicne klavzule ORDER BY -- Teh v vecini gonilnikov ni mogoce parametrizirati, zato razvijalci neposredno zdruzijo uporabniski vnos.
- Funkcije iskanja in filtriranja -- Kompleksni obrazci dinamicno sestavljajo klavzule WHERE, ko se stevilo pogojev spreminja.
- Zastareli shranjeni postopki -- Postopki z internim dinamicnim SQL (EXEC z zdruzevanjem) ostajajo ranljivi tudi s parametriziranimi klici.
- Surove poizvedbe ORM -- Djangov raw(), SQLAlchemyjev text() in ActiveRecordov find_by_sql() popolnoma obidejo zascite ORM.
- Funkcionalnost paketnega uvoza -- Uvoz CSV/Excel, ki dinamicno generira stavke INSERT, je pogosto spregledan.
Sodobne tehnike obvoda
- Obvod WAF -- Kodiranje URL/dvojno kodiranje, vgrajeni komentarji (
SEL/**/ECT), manipulacija velikosti crk, normalizacija Unicode in znanstvena notacija izognejo pravilom na osnovi podpisov. - Vbrizgavanje drugega reda -- Vsebina se shrani prek legitimnega vnosa in sprozi pozneje, ko druga poizvedba uporabi shranjeno vrednost brez sanitizacije. Tezko zaznati, ker sta vbrizgavanje in sprozitev loceni zahtevi.
- Vbrizgavanje parametrov JSON/XML -- Vgnezdeni objekti JSON ali sekcije XML CDATA lahko skrijejo tocke vbrizgavanja pred tradicionalnimi skenerji.
- Onesnazevanje parametrov HTTP -- Podvojeni parametri (
id=1&id=2 OR 1=1) zmedejo zaledne razclenitvalnike razlicnih ogrodij. - Vzporednice vbrizgavanja NoSQL -- Vbrizgavanje operatorjev MongoDB (
$gt,$ne,$regex) sledi isti logiki ekstrakcije proti nesanitiziranim operatorjem poizvedb.
Slepi SQL injection
- Na osnovi logicnih vrednosti -- Razlicni odzivi aplikacije za pogoje true/false pridobivajo podatke bit za bitom.
- Na casovni osnovi --
SLEEP(),WAITFOR DELAYalipg_sleep()vnesejo merljive zakasnitve ob resnicnih pogojih. - Izvenkanalno -- Ekstrakcija prek DNS z
xp_dirtree(MSSQL) aliLOAD_FILE()s potmi UNC (MySQL), ko druge metode niso prakticne.
Metodologija testiranja
- Preslikava tock vbrizgavanja -- Parametri URL, polja POST, glave HTTP (X-Forwarded-For), piskotki, telesa JSON/XML.
- Potrditev s casovnimi zamiki -- 5-sekundna zakasnitev je nezmotljiva potrditev.
- Dolocitev vrste baze --
@@version(MSSQL),version()(PostgreSQL/MySQL),banner FROM v$version(Oracle). - Pridobivanje podatkov -- Najprej UNION (najhitrejsa), nato logicna, nato casovna metoda. Najprej shema, nato obcutljivi podatki.
- Avtomatizacija s sqlmap --
--level=5 --risk=3za temeljito testiranje; vedno rocno preverite ugotovitve z Burp Suite.
Prikaz vpliva
- Pridobivanje podatkov -- Vzorcni zapisi iz obcutljivih tabel za prikaz resnosti, omejeni na minimum za dokaz.
- Obvod overitve -- Vsebine
' OR '1'='1ali razbijanje pridobljenih zgoscenih gesel skrbnikov. - Izvajanje ukazov OS --
xp_cmdshell(MSSQL),INTO OUTFILE/LOAD_FILE()(MySQL),COPY TO/FROM PROGRAM(PostgreSQL). - Eskalacija privilegijev v bazi -- Nizko privilegiran uporabnik do DBA prek
EXECUTE AS(MSSQL) ali preohlapnih dovoljenj.
Obramba v globino
- Parametrizirane poizvedbe -- Primarna obramba brez izjem za vsako interakcijo s podatkovno bazo.
- Najboljse prakse ORM -- Izkljucno uporabljajte graditelje poizvedb; parametrizirajte tudi surove poizvedbe.
- Racuni z najmanj privilegiji -- Samo SELECT/INSERT/UPDATE/DELETE na dolocenih tabelah. Nikoli ne dodelite FILE, EXECUTE ali skrbniskih privilegijev.
- WAF kot dopolnilna obramba -- Obramba v globino, vendar nikoli primarna omilitev. WAF je mogoce obiti; parametriziranih poizvedb ni.
- Validacija vnosov -- Parametri ORDER BY naj sprejemajo le dovoljene stolpce z belega seznama, nikoli surovega uporabniskega vnosa.
SQL injection je tehnicno resen z uporabo parametriziranih poizvedb. Vztraja zaradi cloveskih dejavnikov: zastarele kode, casovnega pritiska in nepopolnega razumevanja tock interakcije s podatkovno bazo. Nasa naloga kot penetracijskih testerjev je najti te vrzeli, preden jih najdejo napadalci.
Zanima vas vec o tej temi? Preberite mojo strokovno stran o Web Application Security →
Komentarji
Ni se komentarjev. Bodite prvi!
Dodaj komentar