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.

  • 💉 Määritelmä: SQL-injektio lisää haitallisen SQL-koodin kyselyyn kelpaamattoman syöttökentän kautta.
  • 🔓 Vaikutus: Onnistunut hyökkäys voi ohittaa kirjautumiset ja lukea, muokata tai poistaa tietueita.
  • 🧪 Esimerkiksi: Aina tosi -ehto ja kommentti muuttavat kirjautumistarkistuksen ohitukseksi.
  • 🛠️ Työkalut: SQLMap ja jSQL automatisoivat injektoitavien parametrien tunnistuksen ja hyödyntämisen.
  • 🛡️ ennaltaehkäisy: Parametrisoidut kyselyt, syötteen validointi ja vähiten oikeuksia käyttävät tilit kurovat umpeen kuilua.
  • 🤖 Moderni reuna: Tekoälyllä toimivat skannerit ja palomuurit merkitsevät injektiokuvioita, joita kiinteät allekirjoitukset eivät tunnista.

SQL-injektio-opetusohjelma

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.

Kaavio siitä, miten SQL-injektio manipuloi dynaamista tietokantakyselyä

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.

Tyhjä SQL Fiddle ikkuna valmis skeemalle ja kyselylle

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.

SQL Fiddle tulos, joka näyttää palautetun yhden käyttäjätietueen

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 = 1 RAJA 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.

SQL Fiddle palauttaa tietueen injektoidun ehdon suorittamisen jälkeen

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.

Vuokaavio kirjautumislomakkeen salasanakentän syöttämisen vaiheista

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 — ]

Kirjautumislomake, jonka salasanakenttään on syötetty pistosmerkkijono

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

Erittely siitä, miten injektoitu SQL-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:

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.

Havij SQL -injektiotyökalun pääikkuna

Yllä olevaa työkalua voidaan käyttää verkkosivuston tai sovelluksen haavoittuvuuden arviointiin.

UKK

Vain sivuston omistajan kirjallisella luvalla. Sovelluksen testaaminen, jota et omista, on laitonta esimerkiksi Yhdysvaltain tietokonepetosten ja väärinkäytösten vastaisen lain nojalla. Bug-bounty-laajuus määrittelee, mikä on sallittua.

Kyllä. OWASP Top 10:2025 -listalla injektio on sijalla A05, ja testeissä injektio havaitaan edelleen lähes jokaisessa sovelluksessa. Tuhansien uusien SQL-injektio-ongelmien (CVE) myötä vuosittain se on edelleen johtava verkkoriski.

MD5 on nopea tiiviste, ei salaus, ja hyökkääjät murtavat sen nopeasti sateenkaaritaulukoilla ja näytönohjaimilla. Käytä salasanoihin sen sijaan hidasta, suolattua algoritmia, kuten bcryptiä tai Argon2:ta.

Mikä tahansa dynaamisesti rakennetun SQL:n kautta kyselyyn otettu tietokanta — MySQL, PostgreSQL, Microsoft SQL Server, Oracleja SQLiteVirhe on siinä, miten sovellus yhdistää käyttäjän syötteet kyselyiksi, ei tietokantamoottorissa.

Tekoälyllä toimivat palomuurit ja skannerit oppivat normaaleja liikennemalleja ja merkitsevät sitten poikkeavia syötteitä, kuten injektoituja ehtoja tai kommentteja, reaaliajassa. Koneoppimismallit havaitsevat hämärrettyjä hyötykuormia, jotka kiinteät allekirjoitukset eivät havaitse.

Tekoälyavustajat, kuten GitHub Copilot voivat ehdottaa parametrisoituja kyselyitä ja syötteiden validointia, mutta ne myös toistavat turvattomia kaavoja. Käsittele jokaista ehdotusta luonnoksena ja yhdistä se tietoturvaraporttiin ja tarkistukseen.

SQL-injektio kohdistuu tietokantaan syöttämällä SQL-komentoja palvelinpuolen kyselyihin. Sivustojenvälinen komentosarjahyökkäys kohdistuu muihin käyttäjiin syöttämällä komentosarjoja, jotka toimivat heidän selaimissaan. Toinen paljastaa tietoja; toinen kaappaa istuntoja.

ORM (objekti-relaatiokartoitus) rakentaa kyselyitä koodiobjekteista oletusarvoisesti parametroiduilla kyselyillä, mikä estää useimmat SQL-injektiot. Se ei ole erehtymätön – raakakyselyt ja turvattomat metodit vuotavat edelleen, joten validointi on edelleen tärkeää.

Tiivistä tämä viesti seuraavasti: