SQL-Injektio

(MySQL) UNION-tekniikan käyttö tietojen varastamiseen

Helppo
30 min

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.

SQL Playground

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.

SQL Playground

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:

SQL Playground

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.

SQL Playground

Tärkeintä on huomata, että ORDER BY ordinaalilla joka on suurempi kuin sarakkeiden määrä aiheuttaa virheen.

SQL Playground

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.

hakatemia pro

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ä.