Mikä on SQL injection -hyökkäys?
SQL injection (SQLi) eli SQL-injektio tarkoittaa hyökkäystä, jossa vahingollista SQL-koodia käytetään tietokannan manipuloimiseen ja pääsyn saamiseen arkaluontoisiin tietoihin. SQL viittaa sanoihin Structured Query Language. Se on kyselykieli, joka on kehitetty relaatiotietokantojen hallintaan. Onnistuneessa SQL-injektiohyökkäyksessä hakkerit ohittavat varmennuksen, varastavat tietoa ja saavat pääkäyttäjän oikeudet järjestelmään.
Jatka lukemista, niin opit, mikä SQL injection on, onko oma sivustosi vaarassa, ja miten tällaisia hyökkäyksiä voi torjua.
Mikä on SQL?
SQL:n määritelmä
SQL on ohjelmointikieli. Tietokannanhallintajärjestelmät eli DBMS:t (Database Management System) käyttävät sitä välittämään tietopyyntöjä käyttäjältä tietokantaan.
Jos esimerkiksi syötät hakusanan hakupalkkiin verkkosivustolla, taustalla tapahtuu SQL-kysely. Tämä kysely sisältää käyttäjän syöttämän hakusanan sekä komentoja tietokannanhallintajärjestelmään (DBMS). Kysely lähetetään tietokantaan, jossa DBMS tulkitsee sen, hankkii pyydetyn tiedon ja lähettää sen takaisin käyttäjälle.
Katso alta koko prosessi:
- Asiakas tekee haun asiasanalla.
- Asiasanan sisältävä SQL-lause luodaan.
- SQL-lause lähetetään tietokantaan, jossa DBMS jäsentää eli parsii sen.
- DBMS tunnistaa koodauskomennot ja se hankkii pyydetyn tiedon.
- Pyydetty tieto “palautetaan” asiakkaalle, ja se näkyy näytöllä vastauksena hänen hakuunsa.
Mikä on SQL injection -hyökkäys?
SQL-injektio eli SQLi on hyökkäystapa, jossa käytetään SQL-koodia sivuston tietokannan manipuloimiseen. Tämän toiminnan tarkoituksena on saada pääsy tietoihin, joiden ei ole tarkoitus olla käyttäjän saatavilla. Tällaisia tietoja ovat esimerkiksi yrityksen arkaluontoiset tiedot, käyttäjälistat tai yksityiset asiakastiedot.
SQL on yksinkertainen kieli, jonka kyselyissä käytetään tunnistettavia englanninkielisiä sanoja. Jos sivustoa ei ole suojattu kunnolla, hakkeri voi injektoida omia SQL-komentojaan ja suorittaa haitallisia toimia, kuten muokata käyttäjätilejä tai vaarantaa koko tietokannan tai palvelimen.
Miten SQL-injektio toimii? SQL-injektiohyökkäyksessä verkkosivu huijataan luomaan SQL-lauseita, jotka sisältävät hakkerin komentoja. Kun tämä lause lähetetään tietokantaan ja tulkitaan, DBMS lukee syötetyt komennot toimintaan määräävinä ohjeina ja toteuttaa ohjeet. Näin hakkeri voi saada DBMS:n antamaan tietoa, jonka sivuston omistaja haluaa pitää yksityisenä.
Kuvittele esimerkiksi tilanne, jossa joku henkilö haluaa varastaa asiakkaiden käyttäjänimiä ja salasanoja verkkokaupasta. Jos sivuston suojaamisessa ei ole noudatettu parhaita käytäntöjä, hakkeri voi käyttää tiettyjä sivuston toimintoja, kuten hakua, ja syöttää satunnaisia komentoja, jotka yhdistetään hakua vastaavaan SQL-lauseeseen.
SQL-injektiohyökkäys voi koskea mitä tahansa SQL-tietokantaa, kuten Oracle, MySQL, MSSQL tai Microsoft SQL Server.
Mitä ovat SQL-käskyt?
Suurin osa tietokannassa tapahtuvista toiminnoista suoritetaan SQL-käskyillä. Niistä yleisin on SELECT-käsky, joka palauttaa tietoa, joka vastaa tiettyjä kriteerejä. SQL-kielessä on useita käskyjä (niitä kutsutaan myös SQL-komennoiksi), jotka tietokanta tunnistaa. Niitä voidaan käyttää hallitsemaan vuorovaikutusta, ohjelman toimintaa, yhteyksiä, istuntoja tai diagnostiikkaa.
Erilaisia SQL-injektiotyyppejä
SQL-injektiohyökkäykset (SQLi) luokitellaan sen mukaan, minkälaista metodia hyökkääjä käyttää saadakseen pääsyn tietokantaan.
In-band SQLi (Klassinen SQLi)
In-band SQLi on yleisin SQL-injektiotyyppi, ja se on myös yksi helpoimmista toteuttaa. Verkkorikollinen käyttää samaa kanavaa hyökkäyksen käynnistämiseen ja tulosten hankkimiseen. In-band SQLi -hyökkäyksiä on kahta laatua: virheperustainen SQLi ja union-perustainen SQLi.
Virheperustainen SQLi
Kuten nimikin kertoo, virheperustainen SQL-injektiohyökkäys saa tietokannan tuottamaan virheen, joka saattaa sisältää runsaasti tietoa sen rakenteesta. Virheen tarjoaman tiedon perusteella hyökkääjä voi muokata SQL-käskyjä tihutöitä toteuttaakseen.
Union-perustainen SQLi
Union-perustainen SQLi käyttää UNION-operaattoria yhdistääkseen useiden SELECT-käskyjen tulokset yhteen lausekkeeseen, joka palautetaan HTTP-vastauksen kanssa.
Inferential SQLi (Sokea SQLi)
Tällaisessa SQL-injektiohyökkäyksessä rikollinen ei näe suoraan vastauksia syötettyihin kyselyihin (siksi tätä mallia kutsutaan sokeaksi). Hän voi kuitenkin seurata sovelluksen toimintaa ja vaikuttaa näin sen rakenteeseen. Tätä hyökkäysmuotoa voidaan kuvata myös väsytyshyökkäykseksi.
Inferential SQLi-hyökkäyksiä on kahta tyyppiä: Sokea boolen-perustainen SQLi ja sokea aikaperustainen SQLi.
Boolen-perustainen (sisältöperustainen) sokea SQLi
Hyökkääjä lähettää useita SQL-kyselyitä, jotka aiheuttavat TRUE- tai FALSE-vastauksia.
Aikaperustainen sokea SQLi
Aikaperustainen sokea SQLi-hyökkäys tarkoittaa sitä, että hyökkääjä lähettää kyselyitä SQL-tietokantaan ja pakottaa sen odottamaan tietyn ajan ennen vastaamista. Jos verkkosivusto ei vastaa välittömästi, tästä voidaan päätellä, että siihen voidaan kohdistaa sokeita SQL-injektiohyökkäyksiä.
Out-of-band SQLi
Out-of-band SQLi-hyökkäys tarkoittaa hyökkäystä, jossa hakkerit onnistuvat hankkimaan tietoa DNS- tai HTTP-kanavien kautta.
Mikä on esimerkki SQL-injektiosta?
SQL-injektio tapahtuu usein silloin, kun käyttäjää pyydetään syöttämään tietoa, kuten käyttäjätunnus. Käyttäjä kuitenkin antaa SQL-komennon, joka saa tietokannan toimimaan halutulla tavalla.
Hyvä esimerkki tästä on UNION-komento, jota voidaan käyttää lisäämään “alikyselyitä” käyttäjän pääkyselyyn. Nämä alikyselyt voivat pakottaa tietokannan lähettämään lisätietoa aitojen hakutulosten lisäksi.
Tätä metodia käyttämällä hakkeri voi saada pääsyn taulukkoon, joka sisältää asiakkaiden sähköpostiosoitteita, käyttäjänimiä tai salasanoja. Näin alttius SQL-injektiolle voi johtaa lopulta käyttäjätilien murtamiseen, tietojen varastamiseen ja jopa sivuston hallinnon haltuun ottamiseen.
Mitä SQL-hakkeri voi varastaa?
Jos sivustoa ei ole suojattu asianmukaisesti, hakkeri voi saada haltuunsa vaikka minkälaista tietoa SQL-injektioiden avulla. Saatavilla on kaikki, mitä tietokanta sisältää.
Yksinkertaisia SQL-komentoja käyttäen hakkerit voivat pakottaa tietokannan palauttamaan listan kaikista sen taulukoista. Näin heillä on käsissään kartta, joka kertoo kaiken tietokannan sisällön, jolloin he voivat pyytää mitä tahansa haluamaansa tietoa.
SQL-injektiohyökkäysten seuraukset voivat siis olla mittavat, ja niitä on käytetty iskuissa esimerkiksi valtioita, yrityksiä ja erilaisia ryhmiä vastaan. Usein tarkoituksena on tietojen varastaminen. Kyseessä voivat olla esimerkiksi sivuston käyttäjien tiedot – SQL-iskua on käytetty muun muassa yliopistojen opiskelijoiden, opettajien ja henkilökunnan tietojen varastamiseen. Erilaisia arkaluontoisia tietoja voidaan käyttää esimerkiksi kiristämiseen: hakkeri uhkaa sivustoa ylläpitävää tahoa tietojen julkaisemisella ja vaatii rahaa vuodon estämiseksi.
Varastetut tiedot voivat olla myös esimerkiksi verkkokaupan asiakkaiden luottokorttitietoja tai palvelun käyttäjätunnuksia. Näitä tietoja voidaan esimerkiksi myydä pimeässä verkossa tai niitä voidaan käyttää erilaisten tilien kaappaamiseen ja hakkerointiin.
SQL-injektiohyökkäysten avulla voidaan myös saada pääsy verkkosivuilla ja muokata niiden sisältöä tai verkossa olevien, yleisölle näkymättömien tietokantojen sisältöä. SQL-injektiohyökkäystä voidaan käyttää myös verkkosivujen toiminnan estämiseen.
Ovatko SQL-injektiohyökkäykset laittomia?
Kyllä, SQL-injektion käyttäminen toisen omistamalla verkkosivustolla on laitonta. Kyseessä on pahantahtoisen koodin syöttäminen tietokantaan, ja tavoitteena on saada pääsy syystä tai toisesta salassa pidettävään tietoon, kuten arkaluontoiseen tietoon tai käyttäjiä tai asiakkaita koskeviin tietoihin.
Miten SQL injection -hyökkäyksiä voi estää?
Kuten yllä on käynyt ilmi, SQL-injektiohyökkäykset voivat saada aikaan mittavaa vahinkoa. Niinpä onkin tärkeää, että sivustojen ylläpitäjät huolehtivat siitä, että kyberturvallisuusstrategiassa huomioidaan myös tällaiset iskut ja varmistetaan, että mahdolliset haavoittuvuudet havaitaan ja korjataan nopeasti.
Tiedon hajaannuttaminen
Mitä keskitetympää tieto on, sitä pahempaa jälkeä SQL-isku saa aikaan. Esimerkkinä voidaan käyttää verkkokauppaa: hakkeroinnista on ikäviä seurauksia vain siinä tapauksessa, että käyttäjien yksityisiä tietoja säilytetään samassa tietokannassa kuin tuotetaulukoita. Tietojen erottelu eri tietokantoihin minimoi mahdolliset vahingot.
Parametrisoidut komennot
Yksi parhaista tavoista torjua SQL-injektiohyökkäyksiä on käyttää parametrisoituja komentoja. Riskialtis sivusto luo uuden SQL-kyselyn aina, kun joku lähettää pyynnön, jolloin hakkerit voivat injektoida omaa koodiaan.
Tätä voidaan välttää koodaamalla sivusto käyttämään etukäteen luotuja SQL-malleja, joiden arvot ovat pysyvät ja avainsanan kohdalla näkyy kysymysmerkki. DBMS voidaan koodata lukemaan kysymysmerkki tietona, jota on syötetty hakupalkkiin, mutta itse kysely on luotu jo etukäteen. Näin hakkerit eivät voi lisätä lauseeseen uusia komentoja.
Syötteen varmennus
Syötteen validoinnin eli varmennuksen tulisi olla sisäänrakennettu sivuston hallintaan ja sisältää listan hyväksyttyjä merkkejä ja sanoja. Tätä listaa voidaan päivittää aina, kun uusia haettavia kohteita lisätään tietokantaan. Jos hakkeri “etsii” haitallista koodauskomentoa, järjestelmä tarkistaa sen listaa vastaan. Jos sanaa ei löydy listalta, koodia ei käynnistetä, ja tuloksena on vain “ei tuloksia” -viesti.
SQL-injektiohyökkäyksiltä suojautuminen käyttäjän näkökulmasta
SQL injection -hyökkäyksiltä ei voi suoranaisesti suojautua erilaisten sivustojen ja palveluiden käyttäjänä, sillä niiden torjuminen on sivustojen ylläpitäjien vastuulla. Tietovuodot kuitenkin ymmärrettävästi huolestuttavat käyttäjiä: kukaan ei halua nähdä arkaluontoisia tietojaan, käyttäjätunnuksiaan tai luottokorttitietojaan nettiin vuotaneina.
Aina vuodettuja tietoja ei ole syötetty tietokantaan edes käyttäjien toimesta, vaan niiden syöttämisestä voivat vastata erilaiset järjestöt tai asiakkaille tai kansalaisille palveluita tarjoavat yritykset tai muut tahot. Tällöin tietojen suojaamiseksi ei voi suoranaisesti tehdä mitään.
Kaksi keinoa kuitenkin auttaa pitämään tiedot turvassa SQL-injektiohyökkäyksiä käyttäviltä hakkereilta:
- Ole tarkkana, minkälaisille sivustoille syötät tietojasi. Tilejä ei kannata luoda sivustoille, joiden turvallisuudesta et ole varma – jos sivusto vaikuttaa epäluotettavalta, sen suojaamiseen ei luultavasti ole juuri panostettu. Ja kun luot tilin, anna itsestäsi mahdollisimman vähän tietoa.
- Pidä ohjelmat ja sovellukset päivitettyinä. SQL-injektiohyökkäykset perustuvat haavoittuvuuksiin, ja erilaisia haavoittuvuuksia korjataan päivityksillä. Onkin tärkeää, että pidät kaikki ohjelmat ja sovellukset aina päivitettyinä, sillä näin käytössäsi on paitsi toimivin myös turvallisin versio.