SQL-Injektio

(MySQL) INSERT-lausekkeiden injektoiminen

Helppo
30 min

Olemme tähän mennessä tutustuneet kahteen eri SQL-injektiohaavoittuvuuteen, joista toinen oli SELECT-lauseke kirjautumisruudussa ja toinen SELECT-lauseke luottokorttisivulla. Haavoittuvuus saattaa kuitenkin olla minkä tahansa tyyppisessä SQL-kyselyssä, ja tässä moduulissa tutustummekin injektioon joka sijaitsee INSERT-lausekkeessa.

Mikä on INSERT-lauseke?

Kun SELECT-lausekkeella haetaan dataa, INSERT-lausekkeella lisätään dataa tietokantaan.

INSERT-lausekkeen muoto on yksinkertainen:

INSERT INTO <taulun nimi> (sarakkeiden nimet) VALUES (sarakkeiden arvot)

Sanotaan esimerkiksi, että meillä on verkkopankkisovellus, joka merkitsee tapahtuneen tilisiirron tietokantaansa. Tällöin sovellus voisi kirjoittaa transaction-nimiseen tauluun sarakkeet määrä, vastaanottajan IBAN, lähettäjän IBAN, viitenumero ja viesti, ja antaa sitten arvot seuraavanlaisesti:

INSERT INTO transaction (amount, recipient_iban, sender_iban, reference, message) VALUES (25, 'SD31RAYV75830132022610', 'AQ07SXPO99612579131812', '123', 'test')

Tai vaihtoehtoisesti, jos sovellus haluaisi lisätä tietokantaan kaksi riviä kerrallaan, se voitaisiin tehdä seuraavanlaisesti:

INSERT INTO transaction (amount, recipient_iban, sender_iban, reference, message) VALUES (25, 'SD31RAYV75830132022610', 'AQ07SXPO99612579131812', '123', 'test'),(100, 'SD31RAYV75830132022610', 'AQ07SXPO99612579131812', '124', 'test 2')

Injektio INSERT-lausekkeessa

Jos sovelluksessa on injektio, sanotaan vaikka, viitenumerokentässä, voisimme esimerkiksi:

  • Karata hipsulla ulos viitenumero tekstistä.
  • Lisätä viestin ('test') itse.
  • Lisätä VALUES loppusulun itse.
  • Kommentoida loput kyselystä ulos.

', 'test')--

Tällöin sovellus saadaan ajamaan täsmälleen sama kysely kun se olisi normaalistikin ajanut, sillä erotuksella, että nyt me kontrolloimme osaa SQL:stä. Voimme korvata tekstin 'test' jollain muulla, esimerkiksi tietokannan versiolla:

',@@version)--

Tällöin sovellus ajaa seuraavanlaisen kyselyn ja sovellukseen pitäisi tulla näkyviin tilisiirto, jossa viestikentässä näkyykin tietokannan versio.

INSERT INTO transaction (amount, recipient_iban, sender_iban, reference, message) VALUES (25, 'SD31RAYV75830132022610', 'AQ07SXPO99612579131812', '123', @@version)-- ', 'test')

Alikyselyt eli subqueryt

Nyt meidän tarvitsee vain tietokannan version sijasta hakea sovelluksesta jotain hyödyllisempää, kuten esimerkiksi admin-käyttäjän sähköpostiosoite ja salasana. Tämä voidaan tässä tapauksessa tehdä alikyselyllä, joka tarkoittaa kyselyn sisälle upotettua kyselyä.

Laittamalla @@version tilalle alikyselyn, joka palauttaa sähköpostiosoitteen ja salasanan käyttäjältä, jonka admin-sarakkeen arvo on True, pääset tämän harjoituksen läpi.

SQL Playground

Alikyselyn tulosten rajaus yhteen LIMIT -lausekkeen avulla

Huomaa LIMIT-lausekkeen käyttö. LIMIT rajoittaa alikyselyn hakutulokset yhteen. Muuten SQL-kysely kaatuisi, jos käyttäjiä, joiden admin-sarakkeen arvo on True, olisikin useampi.

Mitä jos injektio onkin INSERT -lausekkeen viimeisessä osassa?

Jos injektio on VALUES -arvojen viimeisessä osassa, eli tässä tapauksessa viestikentässä, ei tietenkään ole seuraavaa kenttää, mihin hyökkäys voidaan tehdä. Tällöin ratkaisu on esimerkiksi lisätä VALUES perään kokonaan uusi sarja arvoja, jolloin kysely tekisi tietokantaan yhden harmittoman rivin, ja toisen rivin johon voit vapaasti injektoida mitä haluat.

VALUES(ensimmäiset arvot),(seuraavat arvot)

MySQLi INSERT Injektio

Tässä labrassa pääset harjoittelemaan INSERT-lausekkeeseen injektointia lisäämällä alikyselyllä haluamasi tiedot yhteen VALUES-lausekkeen arvoista. Opit myös käyttämään LIMIT-lauseketta rajoittamaan alikyselyn palauttamien rivien määrää.

Tavoite

Kirjaudu admin-käyttäjänä.

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