UNION-tekniikka
Erilaisista SQL-injektiotekniikoista UNION on yleensä tehokkain, silloin kun sen käyttö on mahdollista. Sen avulla voidaan yleensä saada kertaheitolla tietokannasta mitkä tahansa tiedot ulos. Toisin kuin pelkkä WHERE-lauseen muuttelu siis, UNION-tekniikka ei rajaudu niihin tietoihin joita alkuperäinen kysely yritti hakea.
Esimerkiksi, tässä on kysely joka hakee luottokortteja tietokannasta.
Kun kyselyyn lisätään UNION SELECT -lauseke, kysely saadaan palauttamaan luottokorttien lisäksi tietoja myös toisesta, tässä tapauksessa käyttäjä (users) taulusta.
Sarakkeiden määrä pitää olla sama
HUOM. Tällä sivulla oleva SQL-emulaattori toimii hieman erikoisesti, jolloin yllä oleva SQL menee läpi. Oikeaa SQL-tietokantaa vasten ajetut kyselyt yleensä vaativat, että UNION SELECT -kyselyn palauttama sarakkeiden määrä on identtinen alkuperäisen SELECT-kyselyn palauttamaan sarakkeiden määrään nähden.
Esimerkiksi tämä on väärin: koska alkuperäinsen SELECT-lausekkeen sarakkeiden määrä (id, card_number ja card_type eli kolme) on eri kuin UNION SELECT -lausekkeen palauttamat sarakkeet (email ja password eli kaksi).
SELECT id, card_number, card_type FROM credit_cards UNION SELECT email, password FROM users
Kyselyä pitäisi korjata vaikka niin, että email- ja password-sarakkeiden lisäksi palautettaisiin vielä kolmas, tyhjä (NULL) arvo:
SELECT id, card_number, card_type FROM credit_cards UNION SELECT email, password, NULL FROM users
Pääset kohta kokeilemaan tätä labrassa, jossa on ajossa oikea tietokantapalvelin.
Mistä tietää sarakkeiden määrän?
Jos koodia ei näe, sarakkeiden määrä täytyy usein päätellä. Yksi tapa on lähettää jatkuvasti lisää sarakkeita, kunnes sovellus ei enää kaadu tietokantavirheeseen.
UNION SELECT email, password FROM users
VIRHE
UNION SELECT email, password, NULL FROM users
VIRHE
UNION SELECT email, password, NULL, NULL FROM users
OK. Sarakkeiden määrä on siis neljä.
Toinen, yleensä tehokkaampi tapa on käyttää ORDER BY -lauseketta. ORDER BY voi järjestää tuloket jonkun sarakkeen mukaan, esimerkiksi luottokorttinumerot voisi järjestää korttinumeron mukaan näin:
Tämä ei vielä itsessään ole kovin hyödyllistä sarakkeiden määrän selvittämiseen, mutta ORDER BY toimii myös "ordinaalilla", toisin sanoen numerolla joka kertoo että "Kuinka monennen sarakkeen mukaan tulokset järjestetään. Saman kyselyn voi siis kirjoittaa seuraavasti, koska card_type on sarakkeista järjestyksessä toinen.
Tärkeintä on huomata, että ORDER BY ordinaalilla joka on suurempi kuin sarakkeiden määrä aiheuttaa virheen.
Voimme siis selvittää sarakkeiden määrän ORDER BY -lausekkeilla seuraavasti:
ORDER BY 1
OK
ORDER BY 2
OK
ORDER BY 3
OK
ORDER BY 4
VIRHE. Sarakkeiden määrä on siis kolme.
Sarakkeiden järjestyksellä ja tyypillä on väliä
On tärkeää muistaa, että perimmillään tässä on kyse siitä, että sovelluskoodi odottaa saavansa tietokannalta X määrän rivejä, joista esim. ensimmäinen sarake on numero, toinen tekstiä, kolmas aikaleima, jne. Ja jos tietokanta palauttaakin tyhjää, tai väärän tyyppistä dataa, tai väärän muotoista dataa, ohjelmakoodi saattaa kaatua, jolloin et välttämättä saa haluamiasi tietoja ulos sovelluksesta.
Tämä on yksi UNION-tekniikan rajoitteista. Sovellus, joka hakee suuren määrän sarakkeita ja käyttää niitä monimutkaisella tavalla, on usein hankalahko kohde UNION-tekniikalle.
On hyvä muistaa myös, että sarakkeiden järjestys määrittää sen, mikä tieto sovellus "luulee" sarakkeen olevan.
Jos alkuperäinen kysely on:
SELECT id, card_number FROM credit_cards
Ja lisäät siihen UNION -kyselyn perään:
SELECT id, card_number FROM credit_cards UNION SELECT email, password FROM users
Niin silloin sovellus luulee sähköpostia (email) kortin tunnisteeksi (id) ja salasanaa (password) kortin numeroksi (card_number). Jos sovelluskoodi ei kaadu siihen että id, jonka todennäköisesti odotetaan olevan numero, onkin sähköpostiosoite eli tekstiä, käyttäjien salasanat löytyvät korttinumeroiden kohdalta sivustolta.
Harjoitus
Kokeile alla olevaa harjoitusta. Muista aiemmin opitusta että:
- Hipsulla tai lainausmerkillä (riippuen tapauksesta) pääsee "karkaamaan" tekstistä SQL-syntaksiin
- Kahdella viivalla pystyy kommentoimaan loput (sovelluksen omasta) SQL:stä pois. Muista välilyönti kommenttiviivojen jälkeen!
- Lisäämällä WHERE admin=True voit rajoittaa palautuneet käyttäjät vain järjestelmänvalvojiin. Muuten voit joutua kokeilemaan kirjautumista eri käyttäjillä aika pitkään...
UNION-tekniikka ja käyttäjätunnusten varastaminen
Tässä labrassa pääset harjoittelemaan UNION-tekniikan käyttöä hyödyntämällä luottokorttien suodatuksessa olevaa SQL-injektiota, mutta tällä kertaa luottokorttien itsensä sijasta käyttäjätunnuksien varastamiseen.
Tavoite
Kirjaudu sisään käyttäjänä jonka admin-sarakkeen arvo on True.
Vihje
Tehtävät
Flag
Löydä lippu (flag) labraympäristöstä ja syötä se alle.
Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.
Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.