Turvallinen koodaus ja backendin OWASP Top 10 · Oppitunti

Edistyneet SQLi- ja NoSQLi-tekniikat

Tutustukaa monimutkaisempiin SQL- ja NoSQL-injektioihin ja oppikaa edistyneitä puolustavan ohjelmoinnin malleja niiden tehokkaaseen torjumiseen.

Oppitunti 1/412 vaihetta

Edistyneet SQLi- ja NoSQLi-tekniikat on ilmainen Turvallinen koodaus ja backendin OWASP Top 10-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Turvallinen koodaus ja backendin OWASP Top 10-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Turvallinen koodaus ja backendin OWASP Top 10-kurssilla on yhteensä 4 oppituntia.

SQL-injektioiden syvällisempi tarkastelu

Olette oppineet perusmuotoisesta SQL-injektiosta (SQLi), jossa käyttäjän suora syöte muokkaa tietokantakyselyitä. Hyökkääjät käyttävät kuitenkin hienovaraisempia ja monimutkaisempia menetelmiä suojauksien ohittamiseen.

Tässä oppitunnissa tutustumme näihin ”edistyneisiin” SQLi-tekniikoihin, kuten sokeisiin ja toisen asteen injektioihin, ja siirrymme sen jälkeen tarkastelemaan NoSQL-injektiohaavoittuvuuksia. Ennen kaikkea käsittelemme, miten niiltä voidaan suojautua tehokkaasti!

Mitä on sokea SQL-injektio?

Sokea SQL-injektio (Blind SQLi) tapahtuu, kun sovellus on altis SQL-injektiolle, mutta sen HTTP-vastaukset eivät suoraan näytä SQL-kyselyn tuloksia tai virheilmoituksia.

Hyökkääjän on sen sijaan pääteltävä tietoja tarkkailemalla sovelluksen toimintaa tai vastausaikoja. Sokealla SQLi:llä on kaksi päätyyppiä:

  • Totuusarvoihin perustuva sokea SQLi: Hyökkääjä tarkkailee sivun sisällön muutoksia (esim. tietyn viestin ilmestymistä tai katoamista) injektoitujen lausekkeiden tosi- ja epätosiehtojen perusteella.
  • Aikaan perustuva sokea SQLi: Hyökkääjä päättelee tietoja tarkkailemalla palvelimen vastausajan viiveitä, jotka injektoidut tietokantafunktiot aiheuttavat.

Aikaan perustuvan sokean SQLi:n esittely

Hyökkääjät voivat käyttää suoritusta viivästyttäviä tietokantafunktioita, kuten SLEEP() (MySQL) tai PG_SLEEP() (PostgreSQL), tietojen päättelemiseen. Jos heidän injektoimansa ehto on tosi, viive syntyy; jos ehto on epätosi, viivettä ei synny.

Esimerkiksi *haavoittuvaa* kyselyä voitaisiin käyttää sen tarkistamiseen, onko salasanan ensimmäinen kirjain 'a':

SELECT * FROM users WHERE username = 'admin' AND IF(SUBSTRING(password, 1, 1) = 'a', SLEEP(5), 0);

Turvallisessa lähestymistavassa käytetään aina parametrisoituja kyselyitä, jolloin kaikkea käyttäjän syötettä käsitellään datana, ei koodina. Kokeilkaa suojatun esimerkin suorittamista:

import sqlite3
import time

def get_user_data_secure(username):
    conn = sqlite3.connect(':memory:')
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY,
            username TEXT NOT NULL,
            password TEXT NOT NULL
        )
    ''')
    cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", ('admin', 'securepassword'))
    conn.commit()

    # Secure query using parameterized statement
    query = "SELECT username FROM users WHERE username = ?"
    start_time = time.time()
    cursor.execute(query, (username,))
    result = cursor.fetchone()
    end_time = time.time()

    print(f"Query for '{username}' took {end_time - start_time:.4f} seconds.")
    if result:
        print(f"Found user: {result[0]}")
    else:
        print("User not found or query failed.")

    conn.close()

if __name__ == "__main__":
    print("--- Secure Query Example ---")
    get_user_data_secure("admin")
    get_user_data_secure("nonexistent")

Suojautuminen sokealta SQLi:ltä

Paras suoja sokeaa SQLi:tä vastaan on sama kuin tavallista SQLi:tä vastaan: parametrisoidut kyselyt tai valmistellut lauseet. Näillä menetelmillä SQL-koodi erotetaan tiukasti käyttäjän syötteestä.

Kun kaikkea käyttäjän toimittamaa dataa käsitellään literaaliarvoina, hyökkääjän on mahdotonta syöttää haitallisia komentoja riippumatta siitä, näkyykö tuloste vai ei.

  • Validoikaa ja puhdistakaa käyttäjän syöte aina huolellisesti.
  • Käyttäkää Web Application Firewallia (WAF) haitallisten pyyntöjen suodattamiseen.
  • Seuratkaa tietokannan käyttökuvioita poikkeamien ja epätavallisen pitkien kyselyaikojen varalta.

Toisen asteen SQL-injektio

Toisen asteen SQL-injektio tapahtuu, kun haitallinen syöte tallennetaan ensin tietokantaan (tai muuhun pysyvään tallennustilaan) ja haetaan myöhemmin käytettäväksi toisessa kyselyssä ilman asianmukaista uudelleensanitointia.

Tätä injektiotyyppiä on usein vaikeampi havaita alustavissa testeissä, koska ensimmäinen vuorovaikutus syötteen kanssa saattaa vaikuttaa harmittomalta. Haavoittuvuus ilmenee vasta, kun tallennettua dataa käytetään toisessa yhteydessä tai myöhemmin.

Ajatelkaa sitä viivästettynä pommina – sytytyslanka sytytetään nyt, mutta räjähdys tapahtuu myöhemmin!

Toisen asteen SQLi-skenaario

Ajatellaan tilannetta, jossa käyttäjä rekisteröityy käyttäjänimellä 'admin'--. Kun käyttäjänimi tallennetaan alun perin, sitä saatetaan käsitellä turvallisesti.

Myöhemmin ylläpitopaneeli kuitenkin hakee käyttäjän tiedot kyselyllä, joka muodostetaan yhdistämällä tallennettu käyttäjänimi:

SELECT email FROM users WHERE username = ' . $username_from_db . ';

Jos $username_from_db (joka sisältää nyt arvon 'admin'--) ei saa uudelleensanitointia ennen käyttöä tässä toisessa kyselyssä, kommentti (--) voi katkaista kyselyn. Tämä saattaa antaa hyökkääjälle mahdollisuuden ohittaa ehtoja tai paljastaa arkaluonteisia tietoja, koska kyselystä tulee käytännössä SELECT email FROM users WHERE username = 'admin'.

Johdatus NoSQL-injektioon

NoSQL-tietokannat, kuten MongoDB, Cassandra ja Redis, eivät käytä perinteistä SQL-kyselykieltä. Ne ovat kuitenkin edelleen alttiita injektiohyökkäyksille, jos käyttäjän syötettä ei käsitellä oikein.

Hyökkääjät muokkaavat NoSQL-kyselyissä käytettäviä tietorakenteita (esim. JSON, BSON, XML) seuraavia tarkoituksia varten:

  • Todennuksen ohittaminen ja luvattoman pääsyn hankkiminen.
  • Luvattomien tietojen käyttäminen tai muuttaminen.
  • Palvelunestohyökkäysten toteuttaminen muodostamalla monimutkaisia kyselyitä.

Tekniikat riippuvat suuresti NoSQL-tietokannan tyypistä ja sen omasta kyselykielestä tai API:sta.

MongoDB-operaattori-injektio

Yleinen NoSQL-injektiotekniikka MongoDB:ssä perustuu kyselyoperaattorien manipulointiin. MongoDB-kyselyissä käytetään usein JSON:n kaltaisia objekteja, joissa on erityisiä operaattoreita (esim. $eq yhtäsuuruudelle, $gt suuremmalle kuin ja $ne erisuuruudelle).

Jos taustajärjestelmä muodostaa MongoDB-kyselyn suoraan käyttäjän syötteestä ilman validointia, hyökkääjä voi injektoida näitä operaattoreita. Esimerkiksi {"password": {"$ne": null}}-arvon syöttäminen salasanakenttään voi ohittaa todennuksen hyväksymällä minkä tahansa muun kuin null-arvoisen salasanan tietyn salasanan sijaan.

Näin hyökkääjä voi löytää tietueita, jotka vastaavat muita ehtoja kuin täsmällistä yhtäsuuruutta.

NoSQLi-esimerkki (MongoDB)

Ajatellaan kirjautumistoimintoa, joka vastaanottaa käyttäjänimen ja salasanan. Jos salasanaa käytetään suoraan MongoDB-kyselyssä ilman puhdistusta, hyökkääjä voi ohittaa tarkistuksen.

Tässä on *simuloitu* turvallinen Python-esimerkki, joka näyttää, miten asianmukainen käsittely estää injektion, vaikka hyökkääjä yrittäisi välittää muotoillun merkkijonon, kuten '{" $ne": None}'.

def simulate_mongodb_login(username, password):
    # Simulate a collection in memory
    users_db = [
        {"username": "admin", "password": "secure_password123"},
        {"username": "guest", "password": "guestpass"}
    ]

    print(f"Attempting login for '{username}' with password '{password}'")

    # --- VULNERABLE CONCEPT --- 
    # If 'password' was parsed as a JSON object directly into the query:
    # Attacker input: password = {"$ne": None}
    # This would become: {"username": "admin", "password": {"$ne": None}}
    # which means "password not equal to None" and matches any non-null password.

    # --- SECURE APPROACH --- 
    # Always treat user input as a literal string unless explicitly parsed and validated.
    # This ensures 'password' is treated as a literal string, preventing operator injection.
    for user in users_db:
        if user["username"] == username and user["password"] == password:
            print(f"Login SUCCESS for {username} (secure). ")
            return True
    print(f"Login FAILED for {username} (secure).")
    return False

if __name__ == "__main__":
    print("--- NoSQLi Secure Login Example ---")
    simulate_mongodb_login("admin", "secure_password123") # Correct password
    simulate_mongodb_login("admin", "wrong_password")     # Incorrect password
    # Simulate attempted bypass with a crafted password string:
    simulate_mongodb_login("admin", '{"$ne": None}') # Still fails due to secure handling

NoSQL-injektioiden estäminen

Ensisijainen suoja NoSQL-injektiota vastaan on perusteellinen syötteiden validointi ja puhdistus. Koska NoSQL-tietokannoissa on erilaisia kyselykieliä, täsmälliset suojaukset voivat vaihdella, mutta keskeiset periaatteet ovat seuraavat:

  • Sallittujen arvojen luettelo: Salli vain ennalta tunnetut turvalliset merkit, rakenteet tai tietyt tietotyypit. Hylkää kaikki, mikä ei vastaa niitä.
  • Vahva tyypitys: Varmista, että odotetut luvut ovat lukuja, merkkijonot merkkijonoja ja totuusarvot totuusarvoja.
  • Ajurin API:t: Käytä kyselyiden muodostamiseen aina NoSQL-tietokanta-ajurin sisäänrakennettuja API-rajapintoja. Ne on suunniteltu estämään injektiot käsittelemällä käyttäjän syötettä datana, ei koodina.
  • Vältä yhdistämistä: Älä koskaan yhdistä käyttäjän syötettä suoraan kyselymerkkijonoihin tai JSON-rakenteisiin ilman asianmukaista suojausta tai parametrisointia.
  • Vähimpien oikeuksien periaate: Tietokantakäyttäjillä tulee olla vain vähimmäisoikeudet, joita tarvitaan.

Pikatarkistus: injektiotyypit

Testaa ymmärryksesi edistyneistä injektiotekniikoista.

Kertaus ja seuraavat vaiheet

Olemme tarkastelleet edistyneitä SQL- ja NoSQL-injektiotekniikoita, jotka ulottuvat yksinkertaista suoraa manipulointia pidemmälle:

  • Sokea SQL-injektio (sekä aikaperusteinen että totuusarvoperusteinen) päättelee tietoja ilman tietokannan suoraa tulostetta.
  • Toisen asteen SQL-injektio tarkoittaa haitallisen syötteen tallentamista niin, että se suoritetaan myöhemmässä, erillisessä kyselyssä.
  • NoSQL-injektio kohdistuu NoSQL-kyselyrakenteisiin (esimerkiksi MongoDB-operaattoreihin) ja manipuloi tietokannan toimintoja.

Parhaita suojauksia ovat edelleen vankka syötteiden validointi, SQL:ssä käytettävät parametrisoidut kyselyt ja NoSQL:ssä käytettävät turvalliset ajurin API:t. Olettakaa aina, että kaikki syöte on haitallista, ja validoikaa kaikki!

Aloita maksutta

Opi Turvallinen koodaus ja backendin OWASP Top 10 tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Edistyneet SQLi- ja NoSQLi-tekniikat” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Turvallinen koodaus ja backendin OWASP Top 10-oppimispolun 3 oppituntia, myös oppitunnin “Edistyneet SQLi- ja NoSQLi-tekniikat”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Turvallinen koodaus ja backendin OWASP Top 10-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Edistyneet SQLi- ja NoSQLi-tekniikat”?

Tutustukaa monimutkaisempiin SQL- ja NoSQL-injektioihin ja oppikaa edistyneitä puolustavan ohjelmoinnin malleja niiden tehokkaaseen torjumiseen. Harjoittelet Turvallinen koodaus ja backendin OWASP Top 10-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Turvallinen koodaus ja backendin OWASP Top 10-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Turvallinen koodaus ja backendin OWASP Top 10-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Edistyneet SQLi- ja NoSQLi-tekniikat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Turvallinen koodaus ja backendin OWASP Top 10-oppitunnilla?

Kyllä. Jokainen Turvallinen koodaus ja backendin OWASP Top 10-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Edistyneet SQLi- ja NoSQLi-tekniikat
  2. Kattavat syötteiden validointistrategiat
  3. Content Security Policy (CSP) taustajärjestelmälle
  4. Komento- ja LDAP-injektioiden estäminen
← Takaisin: Turvallinen koodaus ja backendin OWASP Top 10