SQL-injektion opetusohjelma: Kuinka oppia esimerkin avulla
Mikä on SQL-injektio?
SQL-injektio on hyökkäys, joka myrkyttää dynaamiset SQL-lauseet kommentoidakseen tiettyjä lauseen osia tai liittääkseen ehdon, joka on aina tosi. Se hyödyntää huonosti suunniteltujen verkkosovellusten suunnitteluvirheitä hyödyntääkseen SQL-lauseita haitallisen SQL-koodin suorittamiseen.
Data on yksi tietojärjestelmien tärkeimmistä komponenteista. Organisaatio käyttää tietokantapohjaisia verkkosovelluksia saadakseen tietoja asiakkailta. SQL on lyhenne sanoista Structured Query Language. Sitä käytetään tietokannan tietojen hakemiseen ja käsittelemiseen.
Kuinka SQL-injektiohyökkäys toimii?
SQL-injektion avulla suoritettavien hyökkäysten tyypit vaihtelevat tietokantakoneen tyypin mukaan. Hyökkäys toimii dynaamisilla SQL-käskyillä. Dynaaminen lauseke on lause, joka luodaan ajon aikana käyttämällä parametreja salasanaa verkkolomakkeesta tai URI-kyselymerkkijonosta.
Esimerkki SQL-injektiosta
Tarkastellaanpa yksinkertaista verkkosovellusta kirjautumislomakkeella. HTML-lomakkeen koodi näkyy alla.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
TÄSSÄ,
- Yllä oleva lomake hyväksyy sähköpostiosoitteen ja salasanan ja lähettää ne sitten osoitteeseen a PHP tiedosto nimeltä index.php.
- Siinä on mahdollisuus tallentaa kirjautumisistunto evästeeseen. Olemme päätelleet tämän remember_me-valintaruudusta. Se käyttää post-metodia tietojen lähettämiseen. Tämä tarkoittaa, että arvoja ei näytetä URL.
Oletetaan, että käyttäjätunnuksen tarkistamisen taustaohjelma on seuraava
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
TÄSSÄ,
- Yllä oleva lauseke käyttää arvoja
$_POST[]suoraan desinfioimatta niitä. - Salasana on salattu MD5-algoritmilla.
Havainnollistamme SQL-injektiohyökkäystä sqlfiddle-komennolla. Avaa URL http://sqlfiddle.com/ selaimessasi. Saat seuraavan ikkunan.
Huomautus: sinun on kirjoitettava SQL-käskyt
Vaihe 1) Kirjoita tämä koodi vasempaan ruutuun
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(45) NULL,
`password` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
insert into users (email,password) values ('m@m.com',md5('abc'));
Vaihe 2) Napsauta Build Schema
Vaihe 3) Kirjoita tämä koodi oikeaan ruutuun
select * from users;
Vaihe 4) Napsauta Suorita SQL. Näet seuraavan tuloksen
Oletetaan, että käyttäjätarvikkeet admin@admin.sys ja 1234 salasanana. Tietokantaa vastaan suoritettava lauseke olisi
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Yllä olevaa koodia voidaan hyödyntää kommentoimalla salasanaosa ja liittämällä ehto, joka on aina totta. Oletetaan, että hyökkääjä antaa seuraavan syötteen sähköpostiosoitekenttään.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx salasanalle.
Luotu dynaaminen lause on seuraava.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
TÄSSÄ,
- xxx@xxx.xxx päättyy yhteen lainaukseen, joka täydentää merkkijonolainauksen
OR 1 = 1RAJA 1 on ehto, joka on aina tosi ja rajoittaa palautetut tulokset vain yhteen tietueeseen.- — ' AND … on SQL-kommentti, joka eliminoi salasanaosan.
Kopioi yllä oleva SQL-lause ja liitä se SQL FiddleSuorita SQL-tekstiruutu alla olevan kuvan mukaisesti
Hakkerointitoiminta: SQL-injektointi verkkosovellukseen
Meillä on yksinkertainen verkkosovellus osoitteessa http://www.techpanda.org/ joka on alttiina SQL Injection -hyökkäyksille vain esittelytarkoituksessa. Yllä oleva HTML-lomakekoodi on otettu kirjautumissivulta. Sovellus tarjoaa perusturvallisuuden, kuten sähköpostikentän puhdistamisen. Tämä tarkoittaa, että yllä olevaa koodiamme ei voida käyttää sisäänkirjautumisen ohittamiseen.
Tämän kiertämiseksi voimme sen sijaan hyödyntää salasanakenttää. Alla oleva kaavio näyttää vaiheet, jotka sinun on noudatettava
Oletetaan, että hyökkääjä antaa seuraavan syötteen
- Vaihe 1: Kirjoita sähköpostiosoitteeksi xxx@xxx.xxx
- Vaihe 2: Kirjoita xxx') TAI 1 = 1 — ]
- Napsauta Lähetä-painiketta
- Sinut ohjataan kojelautaan
Luotu SQL-käsky on seuraava
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Alla oleva kaavio havainnollistaa, että lausunto on luotu.
TÄSSÄ,
- Lauseke olettaa älykkäästi, että md5-salausta käytetään
- Täyttää lainausmerkin ja sulkusulun
- Liittää väitteeseen ehdon, joka on aina totta
Yleensä onnistunut SQL-injektiohyökkäys yrittää useilla eri tekniikoilla, kuten yllä esitellyillä, suorittaa onnistuneen hyökkäyksen.
Muut SQL-injektiohyökkäystyypit
SQL-injektiot voivat aiheuttaa enemmän haittaa kuin vain kirjautumisalgoritmien ohittaminen. Jotkut hyökkäyksistä sisältävät
- Tietojen poistaminen
- Päivitetään tietoja
- Lisätään tietoja
- Suorittaa komentoja palvelimella, jotka voivat ladata ja asentaa haittaohjelmia, kuten troijalaisia
- Arvokkaiden tietojen, kuten luottokorttitietojen, sähköpostin ja salasanojen, vienti hyökkääjän etäpalvelimelle
- Käyttäjän kirjautumistietojen saaminen jne
- Evästeisiin perustuva SQL-injektio
- Virhepohjainen SQL-injektio
- Sokea SQL-injektio
Yllä oleva luettelo ei ole tyhjentävä; se vain antaa sinulle käsityksen siitä, mitä SQL Injection on
Automaatiotyökalut SQL-injektiolle
Yllä olevassa esimerkissä käytimme manuaalisia hyökkäystekniikoita, jotka perustuivat laajaan SQL-tietoumme. On olemassa automaattisia työkaluja, joiden avulla voit suorittaa hyökkäykset tehokkaammin ja mahdollisimman lyhyessä ajassa. Näitä työkaluja ovat mm
- SQLMap - http://sqlmap.org/
- JSQL-injektio - https://tools.kali.org/vulnerability-analysis/jsql
Kuinka estää SQL-injektiohyökkäykset
Organisaatio voi suojautuakseen SQL Injection -hyökkäyksiltä seuraavan käytännön mukaisesti.
- Käyttäjän syötteeseen ei pitäisi koskaan luottaa – Se on aina puhdistettava ennen kuin sitä käytetään dynaamisissa SQL-käskyissä.
- Tallennetut menettelyt - nämä voivat kapseloida SQL-käskyt ja käsitellä kaikkia syötteitä parametreina.
- Valmistetut lausunnot - valmistetut käskyt toimimaan luomalla ensin SQL-käsky ja käsittelemällä sitten kaikkia lähetettyjä käyttäjätietoja parametreina. Tällä ei ole vaikutusta SQL-käskyn syntaksiin.
- Säännölliset lausekkeet - niiden avulla voidaan havaita mahdollinen haitallinen koodi ja poistaa se ennen SQL-käskyjen suorittamista.
- Tietokantayhteyden käyttäjien käyttöoikeudet – vain tarpeelliset käyttöoikeudet tulee antaa tileille, joihin käytetään muodosta yhteys tietokantaan. Tämä voi auttaa vähentämään SQL-käskyjen suorituskykyä palvelimella.
- Virheilmoitukset - nämä eivät saa paljastaa arkaluonteisia tietoja ja missä tarkalleen virhe tapahtui. Yksinkertaiset mukautetut virheilmoitukset, kuten "Anteeksi, meillä on teknisiä virheitä. Tekniseen tiimiin on otettu yhteyttä. Yritä myöhemmin uudelleen" voidaan käyttää virheen aiheuttaneiden SQL-lauseiden näyttämisen sijaan.
Hakkerointi: Käytä Havij-ohjelmaa SQL-injektioon
Tässä käytännön tilanteessa aiomme käyttää Havij Advanced SQL Injection -ohjelmaa verkkosivuston haavoittuvuuksien varalta.
Huomautus: sinun virustorjuntaohjelma voi merkitä sen luonteensa vuoksi. Lisää se poissulkemisluetteloon tai keskeytä virustorjuntaohjelmisto.
Alla olevassa kuvassa näkyy Havijin pääikkuna
Yllä olevaa työkalua voidaan käyttää verkkosivuston/sovelluksen haavoittuvuuden arvioimiseen.
Yhteenveto
- SQL Injection on hyökkäystyyppi, joka käyttää hyväkseen huonoja SQL-käskyjä
- SQL-injektiota voidaan käyttää sisäänkirjautumisalgoritmien ohittamiseen, tietojen hakemiseen, lisäämiseen sekä päivittämiseen ja poistamiseen.
- SQL-injektiotyökaluihin kuuluvat SQLMap, SQLPingja SQLSmack jne.
- Hyvä suojauskäytäntö SQL-lausetta kirjoitettaessa voi auttaa vähentämään SQL-injektiohyökkäyksiä.








