Vaikka olisit seurannut vain löyhästi hakkeriryhmien Anonymous ja LulzSec tapahtumia, olet todennäköisesti kuullut hakkeroivista verkkosivustoista ja palveluista, kuten surullisen kuuluisista Sonyn hakkeroista. Oletko koskaan miettinyt, miten he tekevät sen?
Nämä ryhmät käyttävät useita työkaluja ja tekniikoita, ja vaikka emme yritä antaa sinulle käsikirjaa tehdäksesi tämän itse, on hyödyllistä ymmärtää, mitä tapahtuu. Kaksi hyökkäyksistä, joita kuulet heistä jatkuvasti, ovat ”(Distributed) Denial of Service” (DDoS) ja “SQL Injections” (SQLI). Näin ne toimivat.
Kuva xkcd
Palvelunestohyökkäys
Mikä se on?
Palvelunestohyökkäys (joskus kutsutaan hajautetuksi palvelunestoksi tai DDoS) -hyökkäys tapahtuu, kun järjestelmä, tässä tapauksessa verkkopalvelin, vastaanottaa niin monta pyyntöä kerralla, että palvelinresurssit ovat ylikuormitettuja, järjestelmä yksinkertaisesti lukkiutuu ja sammuu. Onnistuneen DDoS-hyökkäyksen tavoite ja tulos on, että kohdepalvelimen verkkosivustot eivät ole käytettävissä laillisille liikennepyynnöille.
Kuinka se toimii?
DDoS-hyökkäyksen logistiikka voidaan parhaiten selittää esimerkillä.
Kuvittele, että miljoona ihmistä (hyökkääjät) tulee yhteen tavoitteen kanssa haitata Company X: n liiketoimintaa ottamalla pois puhelinkeskuksensa. Hyökkääjät koordinoivat toimintaansa niin, että tiistaina klo 9 he soittavat kaikki yrityksen X puhelinnumeroon. Todennäköisesti yrityksen X puhelinjärjestelmä ei pysty käsittelemään miljoonaa puhetta kerralla, joten hyökkääjät sitovat kaikki saapuvat linjat. Tuloksena on, että lailliset asiakaspuhelut (eli ne, jotka eivät ole hyökkääjiä) eivät pääse läpi, koska puhelinjärjestelmä on sidottu hyökkääjien puhelujen käsittelyyn. Yritys X on siis pohjimmiltaan menettämässä liiketoimintaansa, koska lailliset pyynnöt eivät kykene pääsemään läpi.
DDoS-hyökkäys verkkopalvelimelle toimii täsmälleen samalla tavalla. Koska käytännössä ei ole mitään tapaa tietää, mikä liikenne on peräisin laillisista pyynnöistä vs. hyökkääjistä, ennen kuin verkkopalvelin käsittelee pyyntöä, tämän tyyppinen hyökkäys on tyypillisesti erittäin tehokas.
Hyökkäyksen toteuttaminen
Koska DDoS-hyökkäys on "raakaa voimaa", sinulla on oltava paljon tietokoneita, jotka kaikki ovat koordinoituja hyökkäykseen samanaikaisesti. Palataksemme puhelukeskusesimerkkiin tämä edellyttäisi, että kaikki hyökkääjät molemmat tietävät soittavansa kello 9.00 ja todella soittavan tuolloin. Vaikka tämä periaate varmasti toimii verkkopalvelimen hyökkäyksessä, siitä tulee huomattavasti helpompaa, kun zombietietokoneita käytetään todellisten miehitettyjen tietokoneiden sijaan.
Kuten luultavasti tiedät, on olemassa useita haittaohjelmien ja troijalaisten muunnelmia, jotka järjestelmässä ollessasi ovat lepotilassa ja toisinaan “soittavat kotiin” ohjeiden saamiseksi. Yksi näistä ohjeista voi olla esimerkiksi lähettää toistuvia pyyntöjä Yrityksen X Web-palvelimelle kello 9.00. Joten yhdellä päivityksellä vastaavan haittaohjelman kotipaikkaan yksi hyökkääjä voi välittömästi koordinoida satoja tuhansia vaarantuneita tietokoneita suorittaakseen massiivisen DDoS-hyökkäyksen.
Zombietietokoneiden käytön kauneus ei ole vain sen tehokkuus, vaan myös nimettömyys, koska hyökkääjän ei todellakaan tarvitse käyttää tietokonettaan lainkaan hyökkäyksen toteuttamiseen.
SQL Injection Attack
Mikä se on?
"SQL-injektio" (SQLI) -hyökkäys on hyväksikäyttö, joka hyödyntää huonoja verkkokehitystekniikoita ja tyypillisesti viallisen tietokannan suojauksen kanssa. Onnistuneen hyökkäyksen tulos voi vaihdella käyttäjätunnuksen tekemisestä vastaavan tietokannan tai palvelimen täydelliseen kompromissiin. Toisin kuin DDoS-hyökkäys, SQLI-hyökkäys on täysin ja helposti estettävissä, jos verkkosovellus on ohjelmoitu asianmukaisesti.
Hyökkäyksen toteuttaminen
Aina kun kirjaudut verkkosivustolle ja annat käyttäjänimesi ja salasanasi, verkkosovellus voi suorittaa seuraavanlaisen kyselyn testatakseen kirjautumistietosi:
VALITSE Käyttäjätunnus käyttäjistä, Missä Käyttäjätunnus = 'käyttäjänimi' ja salasana = 'ohittaa';
Huomaa: SQL-kyselyn merkkijonon arvot on liitettävä lainausmerkeihin, minkä vuoksi ne näkyvät käyttäjän syöttämien arvojen ympärillä.
Joten syötetyn käyttäjänimen (käyttäjäni) ja salasanan (mypass) yhdistelmän on vastattava Käyttäjät-taulukon merkintää, jotta UserID voidaan palauttaa. Jos vastaavuutta ei löydy, UserID-tunnusta ei palauteta, joten kirjautumistiedot ovat virheelliset. Vaikka tietty toteutus voi olla erilainen, mekaniikka on melko vakio.
Joten nyt tarkastellaan mallin todennuskyselyä, jolla voimme korvata käyttäjän verkkolomakkeelle antamat arvot:
VALITSE Käyttäjätunnus käyttäjistä, Missä Käyttäjätunnus = '[user]' JA Salasana = '[pass]'
Ensi silmäyksellä tämä saattaa tuntua suoraviivaiselta ja loogiselta askeleelta käyttäjien helpolle validoinnille, mutta jos tälle mallille suoritetaan yksinkertainen käyttäjän syöttämien arvojen korvaaminen, se on altis SQLI-hyökkäykselle.
Oletetaan esimerkiksi, että käyttäjänimi-kenttään syötetään ”myuser’–” ja salasanaan ”väärä pääsy”. Käyttämällä yksinkertaista korvaamista mallikyselyssä saisimme tämän:
VALITSE Käyttäjätunnus käyttäjiltä, Missä UserName = 'myuser' - 'AND Password =' wrongpass '
Avain tähän lausuntoon on kahden viivan sisällyttäminen
(--)
. Tämä on SQL-käskyjen aloituskomentotunnus, joten kaikki kahden viivan (mukaan lukien) jälkeen näkyvät ohitetaan. Pohjimmiltaan yllä oleva kysely suoritetaan tietokannassa seuraavasti:
VALITSE Käyttäjätunnus käyttäjiltä, Missä Käyttäjätunnus = 'käyttäjänimi'
Räikeä puute tässä on salasanan tarkistuksen puuttuminen. Sisällyttämällä kaksi viivaa osaksi käyttäjäkenttää ohitimme täysin salasanan tarkistusehdon ja pystyimme kirjautumaan sisään "omana käyttäjänä" tuntematta vastaavaa salasanaa. Tämä kyselyn manipulointi tahattomien tulosten tuottamiseksi on SQL-injektiohyökkäys.
Mitä vahinkoja voidaan tehdä?
SQL-injektiohyökkäys johtuu huolimattomasta ja vastuuttomasta sovelluskoodauksesta, ja se on täysin estettävissä (katamme hetken kuluttua), mutta mahdollisen vahingon laajuus riippuu tietokannan asetuksista. Jotta verkkosovellus voi kommunikoida backend-tietokannan kanssa, sovelluksen on toimitettava sisäänkirjautuminen tietokantaan (huomaa, että tämä eroaa käyttäjän kirjautumisesta itse verkkosivustoon). Riippuen siitä, mitä käyttöoikeuksia verkkosovellus vaatii, tämä vastaava tietokantatili voi vaatia mitä tahansa, lukemis- / kirjoitusoikeuksista olemassa olevissa taulukoissa vain täydelliseen tietokantakäyttöön. Jos tämä ei ole selvää nyt, muutaman esimerkin pitäisi auttaa antamaan selkeyttä.
Yllä olevan esimerkin perusteella voit nähdä, että kirjoittamalla esimerkiksi
"sinun käyttäjän" - "," järjestelmänvalvojan "-"
tai mikä tahansa muu käyttäjänimi, voimme heti kirjautua sivustolle kyseisenä käyttäjänä tietämättä salasanaa. Kun olemme järjestelmässä, emme tiedä, ettemme itse ole kyseinen käyttäjä, joten meillä on täysi pääsy kyseiseen tiliin. Tietokannan käyttöoikeudet eivät tarjoa tälle turvaverkkoa, koska tyypillisesti verkkosivustolla on oltava ainakin luku- / kirjoitusoikeus vastaavaan tietokantaansa.
Oletetaan, että verkkosivustolla on täysi hallinta tietokannastaan, joka antaa mahdollisuuden poistaa tietueita, lisätä / poistaa taulukoita, lisätä uusia suojaustilejä jne. On tärkeää huomata, että jotkut verkkosovellukset saattavat tarvita tällaista lupaa, joten se ei ole automaattisesti huono asia, että täysi hallinta myönnetään.
Joten havainnollistaaksemme vahinkoa, joka tässä tilanteessa voi tapahtua, käytämme yllä olevassa sarjakuvassa olevaa esimerkkiä syöttämällä käyttäjänimen kenttään seuraavat:
"Robert"; DROP TABLE -käyttäjät; - ".
Yksinkertaisen korvaamisen jälkeen todennuskyselystä tulee:
VALITSE UserID FROM -käyttäjistä WHERE UserName = 'Robert'; PUDOTUSTAULUKKO Käyttäjät; - 'AND Password =' väärä pääsy '
Huomautus: puolipistettä SQL-kyselyssä käytetään tietyn lauseen lopun ja uuden lauseen alun merkitsemiseen.
Mikä suoritetaan tietokannassa seuraavasti:
Valitse käyttäjätunnus käyttäjiltä WHERE UserName = 'Robert'DROP TABLE -käyttäjät
Joten aivan kuten, olemme käyttäneet SQLI-hyökkäystä koko Käyttäjät-taulukon poistamiseen.
Tietenkin paljon pahempaa voidaan tehdä, koska hyökkääjä voi sallituista SQL-oikeuksista riippuen muuttaa arvoja, kaataa taulukot (tai koko tietokannan) tekstitiedostoksi, luoda uusia kirjautumistilejä tai jopa kaapata koko tietokannan asennuksen.
SQL-injektiohyökkäyksen estäminen
Kuten mainitsimme useita kertoja aiemmin, SQL-injektiohyökkäys on helposti estettävissä. Yksi verkkokehityksen kardinaalisäännöistä on, että et koskaan luota sokeasti käyttäjän panokseen kuten teimme, kun teimme yksinkertaisen korvaamisen yllä olevassa mallikyselyssä.
SQLI-hyökkäys voidaan helposti estää niin sanotulla syötteiden desinfioinnilla (tai pakenemisella). Sanitize-prosessi on oikeastaan varsin triviaalia, koska kaikki, mitä se olennaisesti tekee, on käsitellä kaikki inline-lainausmerkit (‘) asianmukaisesti siten, että niitä ei voida käyttää merkkijonon ennenaikaiseen lopettamiseen SQL-käskyn sisällä.
Esimerkiksi, jos haluat etsiä "O'neil" -tietokannasta, et voi käyttää yksinkertaista korvaamista, koska O-numeron jälkeen oleva yksi lainaus aiheuttaisi merkkijonon ennenaikaisen loppumisen. Sen sijaan desinfioit sen käyttämällä vastaavan tietokannan pakomerkkiä. Oletetaan, että sisäisen yksittäisen lainauksen pakomerkki on jokaisen lainauksen edessä \ -merkki. Joten "O'neal" desinfioitaisiin nimellä "O \ 'neil".
Tämä yksinkertainen puhtaanapito estää melkein SQLI-hyökkäyksen. Havainnollistetaan seuraavaksi edelliset esimerkit ja tarkastellaan tuloksena olevia kyselyjä, kun käyttäjän syötteet puhdistetaan.
myuser '-
/
väärä pääsy
:
VALITSE Käyttäjätunnus käyttäjiltä, Missä Käyttäjätunnus = 'käyttäjänimi \' - 'JA Salasana =' väärä pääsy '
Koska yksittäinen lainaus käyttäjän käyttäjän jälkeen on poistettu (eli sitä pidetään osana kohde-arvoa), tietokanta etsii kirjaimellisesti käyttäjän
"myuser" - ".
Lisäksi, koska väliviivat sisältyvät merkkijonon arvoon eivätkä itse SQL-käskyyn, niitä pidetään osana kohde-arvoa sen sijaan, että niitä tulkittaisiin SQL-kommentteina.
Robert '; DROP TABLE -käyttäjät; -
/
väärä pääsy
:
VALITSE Käyttäjätunnus käyttäjistä WHERE UserName = 'Robert \' PUDOTUSTAULUKKO Käyttäjät; - 'AND Password =' väärä pääsy '
Pakenemalla yksinkertainen lainaus Robertin jälkeen, sekä puolipiste että viivat sisältyvät UserName-hakusarjaan, joten tietokanta etsii kirjaimellisesti
"Robert"; DROP TABLE -käyttäjät; - "
taulukon poistamisen suorittamisen sijaan.
Yhteenvetona
Vaikka verkkohyökkäykset kehittyvät ja kehittyvät kehittyneemmiksi tai keskittyvät toiseen lähtökohtaan, on tärkeää muistaa suojautua kokeiltuilta ja todellisilta hyökkäyksiltä, jotka ovat olleet inspiraationa useille vapaasti saatavilla oleville hakkerityökaluille, jotka on suunniteltu hyödyntämään niitä.
Tietyntyyppisiä hyökkäyksiä, kuten DDoS, ei voida helposti välttää, kun taas toiset, kuten SQLI, voivat. Tämän tyyppisten hyökkäysten aiheuttamat vahingot voivat kuitenkin vaihdella haitasta katastrofaaliseen toteutetuista varotoimista riippuen.