SQL-injektion opetusohjelma: Opi esimerkin avulla
⚡ Älykäs yhteenveto
SQL-injektio on hyökkäys, joka myrkyttää dynaamisia SQL-lauseita ohittaakseen todennuksen tai paljastaakseen tietoja hyödyntämällä verkkosovelluksia, jotka rakentavat kyselyitä puhdistamattomasta käyttäjän syötteestä. Tämä sivu näyttää, miten hyökkäys toimii ja miten se estetään.

Mikä on SQL-injektio?
SQL-injektio on hyökkäys, joka myrkyttää dynaamisia SQL-lauseita kommentoimalla tiettyjä osia lausekkeesta pois tai lisäämällä ehdon, joka on aina tosi. Se hyödyntää huonosti suunniteltujen verkkosovellusten suunnitteluvirheitä SQL-lauseiden hyödyntämiseksi haitallisen SQL-koodin suorittamiseksi.
Data on yksi tietojärjestelmien tärkeimmistä osista. Organisaatiot käyttävät tietokantoihin perustuvia verkkosovelluksia tiedon hankkimiseen asiakkailta. SQL on lyhenne sanoista Strukturoitu kyselykieliSitä käytetään tietojen hakemiseen ja käsittelyyn tietokannassa.
Miten SQL-injektiohyökkäys toimii?
SQL-injektiolla suoritettavien hyökkäysten tyypit vaihtelevat tietokantamoottorin tyypin mukaan. Hyökkäys toimii dynaamisten SQL-lausekkeiden kanssa. Dynaaminen lauseke on lauseke, joka luodaan suorituksen aikana käyttämällä verkkolomakkeesta tai URI-kyselymerkkijonosta välitettyjä parametreja.
Esimerkki SQL-injektiosta
Tarkastellaan yksinkertaista verkkosovellusta, jossa on kirjautumislomake. HTML-lomakkeen koodi on esitetty 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 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ä taustajärjestelmän käyttäjätunnuksen tarkistuslauseke on seuraava.
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
TÄSSÄ,
- Yllä oleva lauseke käyttää $_POST[]-taulukon arvoja suoraan puhdistamatta niitä.
- Salasana tiivistetään MD5-algoritmilla.
Havainnollistamme SQL-injektiohyökkäystä käyttämällä SQL Fiddle. Avaa URL http://sqlfiddle.com/ selaimessasi. Saat seuraavan ikkunan.
Huomaa: sinun on kirjoitettava SQL-lausekkeet.
Vaihe 1) Syötä 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) Valitse Rakenna rakenne.
Vaihe 3) Syötä tämä koodi oikeanpuoleiseen ruutuun.
select * from users;
Vaihe 4) Napsauta Suorita SQL. Näet seuraavan tuloksen.
Oletetaan, että käyttäjä antaa osoitteen admin@admin.sys ja salasanan 1234. 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 pois ja lisäämällä ehto, joka on aina tosi. 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 lainausmerkkiin, joka täydentää merkkijonon "quote".
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-lauseke ja liitä se SQL Fiddle Suorita SQL-tekstiruutu alla olevan kuvan mukaisesti.
Hakkerointitoiminta: SQL-injektointi verkkosovellukseen
Meillä on yksinkertainen verkkosovellus osoitteessa http://www.techpanda.org/ joka on altis SQL-injektiohyökkäyksille, ainoastaan esittelytarkoituksiin. Yllä oleva HTML-lomakekoodi on otettu kirjautumissivulta. Sovellus tarjoaa perustietoturvaa, kuten sähköpostikentän puhdistamisen. Tämä tarkoittaa, että yllä olevaa koodiamme ei voida käyttää kirjautumisen ohittamiseen.
Tämän kiertämiseksi hyödynnämme salasanakenttää. Alla oleva kaavio näyttää seuraavat vaiheet.
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-lauseke on seuraavanlainen.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Alla oleva kaavio havainnollistaa, miten lauseke luodaan.
TÄSSÄ,
- Lauseke olettaa älykkäästi, että käytetään md5-salausta.
- Täydentää lainausmerkin ja sulkevan hakasulkeen.
- Liittää lauseeseen ehdon, joka on aina tosi.
Yleisesti ottaen onnistunut hyökkäys yhdistää useita tekniikoita, kuten yllä on esitetty.
Muut SQL-injektiohyökkäystyypit
SQL-injektiot voivat tehdä enemmän haittaa kuin vain ohittaa kirjautumisalgoritmit. Joitakin hyökkäyksiä ovat:
- 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ätietojen hankkiminen yms.
- Evästeisiin perustuva SQL-injektio
- Virhepohjainen SQL-injektio
- Sokea SQL-injektio
Yllä oleva luettelo ei ole täydellinen; se antaa vain kuvan siitä, mitä SQL-injektiolla voi tehdä.
Automaatiotyökalut SQL-injektiolle
Yllä olevassa esimerkissä käytimme manuaalisia hyökkäystekniikoita, jotka perustuivat laajaan SQL-osaamiseemme. On olemassa automatisoituja työkaluja, jotka voivat auttaa sinua suorittamaan hyökkäykset tehokkaammin ja mahdollisimman lyhyessä ajassa. Näitä työkaluja ovat:
- SQLMap - http://sqlmap.org/
- jSQL-injektio – https://www.kali.org/tools/jsql/
SQL-injektiohyökkäysten estäminen
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-lausekkeissa.
- Tallennetut menettelyt – nämä voivat kapseloida SQL-lausekkeet ja käsitellä kaikkea syötettä parametreina.
- Valmistellut lausunnot – Valmistellut lauseet toimivat luomalla ensin SQL-lausekkeen ja käsittelemällä sitten kaikkia lähetettyjä käyttäjätietoja parametreina. Tällä ei ole vaikutusta SQL-lausekkeen syntaksiin.
- Säännölliset lausekkeet – näitä voidaan käyttää mahdollisesti haitallisen koodin havaitsemiseen ja poistamiseen ennen SQL-lauseiden suorittamista.
- Tietokantayhteyden käyttäjän käyttöoikeudet – tileille, joita käytetään vain välttämättömien käyttöoikeuksien myöntämiseen muodosta yhteys tietokantaan. Tämä voi auttaa vähentämään SQL-käskyjen suorituskykyä palvelimella.
- Virheilmoitukset – näiden ei tulisi paljastaa arkaluonteisia tietoja tai sitä, missä virhe tarkalleen ottaen tapahtui. Virheen aiheuttaneiden SQL-lauseiden näyttämisen sijaan voidaan käyttää yksinkertaisia mukautettuja virheilmoituksia, kuten ”Pahoittelut, meillä on teknisiä virheitä. Tekniseen tiimiin on otettu yhteyttä. Yritä myöhemmin uudelleen”.
Hakkerointi: Käytä Havij-ohjelmaa SQL-injektioon
Tässä käytännön skenaariossa käytämme Havij Advanced SQL Injection -ohjelmaa verkkosivuston haavoittuvuuksien skannaamiseen.
Huomautus: Havij on vanhentunut ja huonokuntoinen. Windows työkalu — Yllä oleva SQLMap on nykyinen avoimen lähdekoodin standardi.
Huomautus: virustorjuntaohjelmasi saattaa merkitä sen luonteensa vuoksi. Sinun tulisi lisätä se poissulkemisluetteloon tai keskeyttää se. virustorjuntaohjelma.
Alla oleva kuva näyttää Havijin pääikkunan.
Yllä olevaa työkalua voidaan käyttää verkkosivuston tai sovelluksen haavoittuvuuden arviointiin.








