SQL-Injektio

(MySQL) Filttereiden ohittaminen

Vaikea
45 min

Mitä jos merkkiä X ei saa käyttää?

Haavoittuvuuden löydyttyä törmää usein erilaisiin haasteisiin haavoittuvuuden hyväksikäytössä. Tästä syystä hakkerilta vaaditaan kekseliäisyyttä!

Kommentista välilyönti

Otetaan esimerkiksi välilyönnit. Miten SQL-injektiohaavoittuvuutta voi hyväksikäyttää, jos sovelluksen haavoittuva parametri ei ota lainkaan vastaan välilyöntejä?

Yksi ratkaisu on kommentit! Miten hyödyllisiä kommentit ovatkaan. Eikö olisi hauskaa jos kommentit, information_scheman lukemisen, ja muut toiminnot, joista on hyötyä lähinnä hyökkääjille, olisivat oletusarvoisesti pois päältä, tai ne saisi ainakin kytkettyä pois päältä? Mutta, pysytään aiheessa...

Eli kommentit, joilla voi kätevästi katkaista SQL:n kun on injektoinut siihen jotain sekaan, toimivat myös kätevinä välilyönninkorvikkeina. SQL nimittäin tulkitsee /**/ -sekvenssin (tyhjä monirivinen kommentti) välilyöntinä.

Heksana muut merkit

Entäs sitten, jos haluaisi käyttää virhepohjaista injektiotekniikkaa, mutta < -merkki, hipsut sekä lainausmerkit on estetty? Miten saat XML-käsittelijän kaatumaan kuten aiemmissa moduuleissa, jossa teit sen näin: CONCAT("<", ...)?

Yksi vaihtoehto on käyttää CONCAT-funktiota kuten ennenkin, mutta "<" sijaan antaa < -merkki heksana.

Eli CONCAT("<", ...) sijaan tehdään CONCAT(0x3c, ...). Ei <, ' tai " merkkejä!

Miksi 0x3c?

0xJOTAIN tarkoittaa heksadesimaalia. Heksadesimaali tarkoittaa vain arvoa, joka esitetään numerona jonka kantaluku on 16. Olet varmaankin tottunut kymmejärjestelmään, jonka kantaluku on 10. Olet varmaankin kuullut myös binäärijärjestelmästä, jonka kantaluku on 2. Kantaluku tarkoittaa vain, että montako sormea on, jolla laskea. Saman arvon voi aina ilmaista missä tahansa muodossa.

Kymmenjärjestelmässä on kymmenen merkkiä: 0, 1, 2, 3, 4, 5, 6, 7, 8 ja 9. Numeron 8 jälkeen tulee 9, 9 jälkeen tulee 10, ja 10 jälkeen tulee 11.

Yhdeksänjärjestelmässä on yhdeksän merkkiä: 0, 1, 2, 3, 4, 5, 6, 7 ja 8. Numeron 7 jälkeen tulee 8, 8 jälkeen tulee 10, ja 10 jälkeen tulee 11. Huomaa että numero "9" puuttuu yhdeksänjärjestelmän "aakkosista". Yhdeksänjärjestelmää ei käytännössä käytetä missään, tarkoitus on vain että ymmärrät, etteivät binääri-, heksa-, oktaali-, kymmenjärjestelmä, jne. ole lainkaan erilaisia toisistaan.

Binäärijärjestelmässä on kantaluku 2, eli siinä on vain kaksi merkkiä, 0 ja 1. 0 Jälkeen tulee 1, ja 1 jälkeen tulee 10, 10 jälkeen tulee 11, ja 11 jälkeen tulee 100.

Heksajärjestelmässä on kantaluku 16, eli siinä on 16 merkkiä: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E ja F. 8 jälkeen tulee 9, 9 jälkeen tulee A, A jälkeen tulee B, ja myöhemmin F jälkeen tulee 10. Kymmenjärjestelmän luku 10 on siis heksadesimaalina A, ja heksadesimaalina esitetty luku 10 vastaa kymmenjärjestelmässä lukua 16.

Mutta miksi juuri 0x3c? 3C on kymmenjärjestelmässä... lasketaanpas, 3*16 = 48 + C(12) = 60. Numero 60 taas vastaa ASCII-merkistössä merkkiä... rumpujen pärinää... <.

Mikä on ASCII-merkistö?

ASCII on kansainvälinen standardi jossa on 128 eri merkkiä. Melkein mikä tahansa ohjelmointikieli, mukaanlukien kyselykielet kuten SQL, osaa muuntaa ASCII-koodin (vaikka numero 65) sen merkiksi (vaikka A kirjain) ja takaisin. Voit lukea ASCII-merkistöstä täältä: https://fi.wikipedia.org/wiki/ASCII

Esimerkki

Sanotaan, että haluaisit lähettää sovellukselle jotain tällaista:

ORDER BY 1,(SELECT(CONCAT('<',@@version)))

Et kuitenkaan saa käyttää välilyöntejä, joten korvaat ne kommenteilla.

ORDER/**/BY/**/1,(SELECT(CONCAT('<',@@version)))

Et saa myöskään käyttää tekstiä (hipsuja tai lainausmerkkejä), joten korvaat ne CONCAT-funktiolla ja ASCII-heksakoodeilla.

ORDER/**/BY/**/1,(SELECT(CONCAT(0x3c,@@version)))

Voit myös tehdä tämän automaattisesti Hakatemian Muuntaja-työkalulla käyttäen Space2Comment- ja Str2Hex-muunnoksia:

Harjoitus

Näillä tekniikoilla aseistautuneena, kokeilehan ratkoa alla oleva harjoitus! Et pääse syöttämään ihan kaikkia merkkejä, mutta muuten tehtävä on identtinen edellisen ORDER BY -virhepohjaista tekniikkaa käsitelleen moduulin kanssa.

MySQLi Rajoitetuilla Merkeillä Pelaaminen

Tässä labrassa pääset harjoittelemaan kekseliäitä tapoja päästä ohi erilaisista rajoituksista joihin saatat törmätä.

Tavoite

Kirjaudu admin-käyttäjänä.

Tehtävät

Flag

Löydä lippu (flag) labraympäristöstä ja syötä se alle.

hakatemia pro

Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.

Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.