Nazaj na blog

SQL Injection v 2025: Se vedno nevarno, se vedno pogosto

October 09, 2024 3 min branja
SQL Injection v 2025: Se vedno nevarno, se vedno pogosto
Nazadnje posodobljeno:

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 DELAY ali pg_sleep() vnesejo merljive zakasnitve ob resnicnih pogojih.
  • Izvenkanalno -- Ekstrakcija prek DNS z xp_dirtree (MSSQL) ali LOAD_FILE() s potmi UNC (MySQL), ko druge metode niso prakticne.

Metodologija testiranja

  1. Preslikava tock vbrizgavanja -- Parametri URL, polja POST, glave HTTP (X-Forwarded-For), piskotki, telesa JSON/XML.
  2. Potrditev s casovnimi zamiki -- 5-sekundna zakasnitev je nezmotljiva potrditev.
  3. Dolocitev vrste baze -- @@version (MSSQL), version() (PostgreSQL/MySQL), banner FROM v$version (Oracle).
  4. Pridobivanje podatkov -- Najprej UNION (najhitrejsa), nato logicna, nato casovna metoda. Najprej shema, nato obcutljivi podatki.
  5. Avtomatizacija s sqlmap -- --level=5 --risk=3 za 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'='1 ali 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.

Vid Grosek

Vid Grosek

Etični heker & Penetracijski tester

Pomagam slovenskim podjetjem odkriti varnostne ranljivosti, preden jih odkrijejo napadalci. Vec kot 5 let izkusenj s penetracijskim testiranjem.

Vse objave

Komentarji

Ni se komentarjev. Bodite prvi!

Dodaj komentar

Vam je bil clanek vsec?

Prijavite se na newsletter za mesecne varnostne vpoglede.

Prijavite se