• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Bezpečnostní útoky na webové aplikace, Čtvrtkon 5
 

Bezpečnostní útoky na webové aplikace, Čtvrtkon 5

on

  • 3,102 views

Útoků na webové aplikace existují desítky. Představíme si tři základní, ukážeme si, jak takový útok provést a jak webovou aplikaci proti danému útoku zabezpečit. Na závěr si ...

Útoků na webové aplikace existují desítky. Představíme si tři základní, ukážeme si, jak takový útok provést a jak webovou aplikaci proti danému útoku zabezpečit. Na závěr si ukážeme, jak bezpečně ukládat uživatelská hesla a pár špeků, kterým byste se měli obloukem vyhnout.

Statistics

Views

Total Views
3,102
Views on SlideShare
2,439
Embed Views
663

Actions

Likes
3
Downloads
17
Comments
1

6 Embeds 663

http://ctvrtkon.cz 340
http://www.michalspacek.cz 255
http://www.scoop.it 47
http://michalspacek.localhost 12
http://www.linkedin.com 7
https://www.linkedin.com 2

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Bezpečnostní útoky na webové aplikace, Čtvrtkon 5 Bezpečnostní útoky na webové aplikace, Čtvrtkon 5 Presentation Transcript

    • Michal Špaček, #ctvrkton 5, 2013www.michalspacek.cz @spazef0rze
    • Útoky na web SQL Injection Cross-Site Scripting Full Path DisclosureÚtoků na webové aplikace existují desítky. Local File Inclusion, Remote Code Execution a další.Povíme si o těchto třech, kde první dva jsou navíc velice závažné. Všechny tři mají jednuspolečnou věc – zabránění těmto útokům je jednoduché, jak facka. Michal Špaček www.michalspacek.cz
    • Full Path Disclosure Vyzrazení plné cesty ke skriptu http://devblog.cz/2012/04/fpd-aneb-full-path-disclosure/Začneme od konce. Full Path Disclosure (FPD) je útok, kterým donutíte webovou aplikaci, abyvyzradila kde na disku serveru jsou uloženy skripty dané aplikace. Více o FPD si můžete přečíst vmém článku na uvedené adrese. Michal Špaček www.michalspacek.cz
    • Může to vypadat třeba takto. Aplikace nám toho ovšem vyzradí mnohem více, než jen to, kde nadisku žije. Dozvíme se například operační systém serveru, zjistíme, že je povolené zobrazováníchybových hlášek a z adresářové struktury odhadneme, že to nepoužívá Nette. Michal Špaček www.michalspacek.cz
    • Jednou z několika možností, jak tento útok vyvolat, je změna typu vstupních parametrů. Zklasického řetězce uděláme pole přidáním hranatých závorek za název parametru v URL (a předrovnítko). Některé funkce však umí pracovat jenom s řetězcem a náležitě nám to oznámí. Michal Špaček www.michalspacek.cz
    • Další variantou FPD útoku je zobrazení výstupu phpinfo(). Na velké části webů psaných v PHPse takový výstup nachází na URL /info.php nebo /phpinfo.php. Tyto informace obsahujítřeba i čísla verzí nebo kompletní nastavení PHP. Nikdy toto nedávejte na produkční servery. Michal Špaček www.michalspacek.cz
    • Řešení? display_errors = OffŘíkal jsem, že řešení jsou jednoduchá, že? Zakažte zobrazování chybových hlášek a hotovo.Hlášky si samozřejmě nesmíte vypisovat sami, třeba v nějakém error handleru. Zobrazovánízakažte pokud možno už v .htaccess pomocí php_flag display_errors off. Michal Špaček www.michalspacek.cz
    • log_errors = OnCo naopak povolte, je ukládání chybových hlášek do nějakého souboru, abyste se vůbecdozvěděli, že k nějakým chybám dochází. To provedete také nejlépe v souboru .htaccess takto:php_flag log_errors on, chybové hlášky pak naleznete v error logu serveru. Michal Špaček www.michalspacek.cz
    • Cross-Site Scripting (XSS) Útočník vloží na naši stránku vlastní JavaScriptZábavnějším útokem na webové aplikace a na jejich návštěvníky je Cross-Site Scripting. Útočníkvložením vlastního JavaScriptu do stránky získává kontrolu nad prohlížečem návštěvníka. Může sním dělat vše, co JavaScript dovoluje, inspirujte se třeba projektem BeEF http://beefproject.com/ Michal Špaček www.michalspacek.cz
    • Úspěšný útok Cross-Site Scripting může vypadat třeba takto. Toto je pouze Proof-of-Concept kód,načítající JavaScript z cizího serveru, zobrazení identifikátoru session nemá žádný praktickýdopad. Všimněte si hodnoty parametru zb v URL adrese. Michal Špaček www.michalspacek.cz
    • Všimněte si označeného textu. Tento HTML tag vložil útočník úpravou adresy stránky (vizpředchozí obrázek) a webová aplikace jej zapomněla zabezpečit. Útočníkovi pak stačí takovouadresu (třeba zkrácenou pomocí TinyURL) poslat oběti, této variantě se říká Reflected XSS.Variantě, kdy útočník vloží HTML značky například do diskuzního příspěvku a aplikace jej neošetříříkáme Permanent XSS, protože je zkrátka permanentní, útočník nemusí upravovat odkaz a nicnemusí nikomu posílat, stačí jenom navšívit takovou napadenou stránku. Michal Špaček www.michalspacek.cz
    • Pomocí vloženého JavaScriptu může útočník dělat spoustu věcí, zde je například ukázkaodchytávání uživatelských jmen a hesel zadávaných do formuláře s id userform a jejichodesílání na server tak, aby uživatel nic nepoznal, formulář se následně normálně odešle. Michal Špaček www.michalspacek.cz
    • Řešení? htmlspecialchars($string)Další jednoduché řešení. Pro ochranu před XSS stačí veškerá data (uživatelská i aplikační), kterádo HTML vypisujeme, nejdříve prohnat skrz uvedenou funkci. Na výpis do JavaScriptu, který májiné speciální znaky (trackovací kódy např.) použijte třeba json_encode(). Michal Špaček www.michalspacek.cz
    • htmlspecialchars($string, ENT_QUOTES)htmlspecialchars() standardně převádí na HTML entity pouze znaky &, ", < a >. PokudHTML atributy uzavíráte do jednoduchých uvozovek, musíte přidat flag ENT_QUOTES.Nejjednodušší je ale použít nějaký šablonovací systém, který celé escapování řeší za vás. Michal Špaček www.michalspacek.cz
    • Nepoužívat strip_tags() proti XSSNikdy nepoužívejte na ochranu před XSS funkci strip_tags(). Není na to určená a navícneochrání před tím, když útočník nebude vkládat celé tagy, ale jenom nové atributy (třebaonmouseover). Nepoužívejte ji ani na povolení některých tagů, ponechává totiž tagy i atributy. Michal Špaček www.michalspacek.cz
    • SQL Injection Útočník modifikuje SQL dotazDopad útoku SQL Injection může být poměrně značný. Pokud je úspěšný, tak má útočník podkontrolou celou databázi webové aplikace a může si s ní dělat, co chce. Například získávatuživatelská jména a hesla nebo finanční výsledky majitele. A taky měnit uložená data, třeba ceny. Michal Špaček www.michalspacek.cz
    • Útok spočívá v úpravě SQL dotazu, který aplikace odesílá do databázového serveru. Napsánímspeciálních znaků do některého parametru v adrese (zde znacka) vyvoláme chybu a zkoumáníma hledáním zadaného řetezce (třetí řádek shora, vpravo) zjistíme, jak parametr upravit. Michal Špaček www.michalspacek.cz
    • "… WHERE znacka = {$_GET[znacka]}"Chyba vyvolaná na této stránce vznikla nejspíš tak, že parametr znacka byl rovnou vložen doSQL dotazu, mezi jednoduché uvozovky, bez nějakého ošetření. Naznačen je kód v PHP skriptu,který je chybně napsán a umožňuje provést SQL Injection útok. Michal Špaček www.michalspacek.cz
    • Zde vidíme podobnou chybu, jako na předchozím obrázku. Parametr id původně obsahovalnějaké číslo, ale uvedením řetezce se útočníkovi podařilo vyvolat tuto chybovou hlášku, kterou nasebe aplikace vyzradila, že útoku SQL Injection neodolá. Michal Špaček www.michalspacek.cz
    • … WHERE id = . $_GET[id]Kód ve skriptu vypadal nejspíš nějak takto. Parametr id je rovnou připojen na konec SQL dotazu,není uzavřen v jednoduchých uvozovkách a proto si databázový server myslí, že je to názevsloupce. I bez zobrazeného SQL dotazu útočník dokáže odhadnout, co má do parametru vložit. Michal Špaček www.michalspacek.cz
    • Řešení? Prepared statements (PDO)V případě ochrany proti SQL Injection je řešení trochu náročnější. Místo skládání řetězcůoddělíme odesílání SQL kódu od dat a nemůže se tedy stát, že modifikací dat změníme kód. VPHP toto elegantně řeší extenze PDO. Někdy se můžete setkat s termínem vázání proměnných. Michal Špaček www.michalspacek.cz
    • Takto nějak vypadá práce s rozšířením PDO. Na řádku 2 vytvoříme spojení s databázovýmserverem. Na řádku 3 je pak uveden SQL dotaz a místo hodnot jsou uvedena zástupná jménaparametrů ve formátu :jmeno. Na řádku 4 řekneme databázovému serveru, aby si připravilvykonání dotazu. Metodou bindValue() propojíme zástupné jméno s hodnotou, všiměte si, žehodnotu nikde nijak speciálně neošetřujeme a že v dotazu nejsou kolem :id uvozovky. Na řádku6 konečně odešleme data na databázový server a tím efektivně vykonáme dotaz. Michal Špaček www.michalspacek.cz
    • mysql_set_charset() mysql_real_escape_string()Rozšíření mysql vázání proměnných nijak elegantně nepodporuje. Pro ošetření hodnot v SQLdotazu pak musíme použít funkci mysql_real_escape_string() a nesmíme po připojenízapomenout zavolat mysql_set_charset(). Uvedené řešení ovšem nevyřeší problém, který jeukázán na stránce 20, tedy případ, kdy v SQL dotazu očekáváme číslo. Tyto funkce slouží kzabránění „útěku z řetezce“, ale pokud v dotazu očekáváme číslo, tak v žádném řetezci nejsme anemusíme tedy z ničeho utíkat. Pro ochranu v tomto případě zvolíme přetypování na integer. Michal Špaček www.michalspacek.cz
    • Nepoužívat addslashes() proti SQLIAVůbec nikdy nepoužívejte funkci addslashes() pro ošetření dat proti SQL Injection Attack.Tato funkce, ač zdánlivě dělá to samé, tak neslouží pro ochranu proti SQL Injection. V MySQL vněkterých asijských znakových sadách je i přes použití addslashes() možné SQLIA provést. Michal Špaček www.michalspacek.cz
    • Hashování hesel Nepoužívat MD5 Ani SHA-1Pokud v aplikaci ukládáte hesla uživatelů, nikdy je neukládejte jen tak, v čitelné podobě. Hashujteje před uložením do databáze. Ovšem není hashování, jako hashování. Pro nové aplikace dnesuž nepoužívejte MD5 ani SHA-1 a to ani pokud hashujete vícenásobně a už vůbec ne bez saltu. Michal Špaček www.michalspacek.cz
    • Jak MD5, tak SHA-1 jsou už překonané. Předpočítané hashe najdete na webu Googlem, takženemusíte nic crackovat. A když nic nenajdete, tak oba algoritmy jsou tak rychlé, že cracknutí heselje většinou otázka několika minut. Michal Špaček www.michalspacek.cz
    • Řešení? SHA-512 a salt? hash_hmac()Pokud budete hashovat hesla, tak používejte minimálně SHA-512 a rozhodně je nutné použít saltjako obranu proti Birthday attacks. Salt může být uložen v databázi ve speciálním sloupci, včitelné podobě. Hash počítejte HMAC algoritmem, můžete také použít opakované hashování. Michal Špaček www.michalspacek.cz
    • oclHashcat md5($pass.$salt) md5($salt.$pass) sha1($pass.$salt) sha1($salt.$pass)Nepoužívejte salt uvedeným způsobem, tedy pouhým přidáním za heslo. Salt je uložen v databázispolečně s heslem a použitý „algoritmus“ se dá odhadnout nebo vyčíst ze zdrojových kódů.Nástroje na crackování hesel (třeba rychlý oclHashcat) s tímto způsobem saltování umí zacházet. Michal Špaček www.michalspacek.cz
    • Lepší řešení? bcrypt! crypt() + Blowfish hashing http://codahale.com/how-to-safely-store-a-password/Existuje ale lepší řešení a opět jednoduché, vícenásobné hashování i obranu proti hrubé síle díkyrelativní vlastní pomalosti vyřeší použití funkce crypt() s Blowfish hashing algoritmem, který sezapne saltem, který začíná na $2y$, tato možnost je dostupná v PHP 5.3.7 a novějším, varianta$2a$ nefunguje zcela korektně, více v dokumentaci PHP. V PHP 5.5 jsou nové funkcepassword_hash() a password_verify(), které vše elegantně řeší, do starších verzí je přidáknihovna https://github.com/ircmaxell/password_compat. Blowfish hash doporučuje váš dealer! Michal Špaček www.michalspacek.cz
    • Můžete si všechno správně zahashovat a ochránit proti všem možným útokům, ale kdyžzapomenete nějakou zálohu nebo logy na disku v adresáři, který je dostupný z prohlížeče a mápovolené vypisování obsahu (tzv. open dir), máte nemalý problém. To vypisování raději zakažte. Michal Špaček www.michalspacek.cz
    • V přístupných a „otevřených“ adresářích se dá najít spousta věcí. Třeba statistiky zasíláníinformačních e-mailů, včetně samotných e-mailových adres. Tohle na ulici nenajdete, databázeověřených adres lidí, kteří se zajímají o produkt, který web nabízí, stojí obvykle dost peněz. Michal Špaček www.michalspacek.cz
    • robots.txtMáte už plné zuby dobrých skutků, které jsou po zásluze potrestány? Napište evil bota, kterýbude procházet soubory robots.txt a bude stahovat obsah, ke kterému mají roboti normálnězakázán přístup. Ale pozor, budete mít opravdu mnoho opravdu zajímavých dat. Michal Špaček www.michalspacek.cz
    • Uvidíte-li v robots.txt uvedeny adresáře jako jsou třeba tmp nebo logs (nebo obojídohromady) určitě se do nich podívejte. Když se to podaří a adresář prozradí svůj obsah, bude tostát za to. Pamatujte, do robots.txt patří jen to, co nemají vidět roboti, ne lidé. Michal Špaček www.michalspacek.cz
    • /.svn/entriesDěláte deployment z SVN? A máte na serveru kompletní working copy? A co se stane, kdyžserver požádáte o soubor /.svn/entries? Když tento soubor dostanete, je velkápravděpodobnost, že dostanete celou working copy v původní podobě, což znamená… zdrojáky! Michal Špaček www.michalspacek.cz
    • http://hostname/.svn/text-base/index.php.svn-baseSubversion totiž ve working copy drží kopie původních souborů, které mají speciální koncovku,takže většinou nejsou zpracovávány jako PHP skripty a server je normálně nabídne ke stažení.Podívejte se do adresáře .svn a pak jej ze serveru smažte nebo aspoň do něj zakažte přístup. Michal Špaček www.michalspacek.cz
    • Thats it. Thats me. Michal Špaček www.michalspacek.cz @spazef0rze Přijďte na školení http://www.michalspacek.cz/skoleniTak a to je vše, přátelé. Sledujte mě na Twitteru https://twitter.com/spazef0rze, pokud se chcetedozvědět, co se děje v mém světě PHP, bezpečnosti a výkonnosti. Pokud se toho chcetedozvědět ještě více z uvedených oblastí, přijďte třeba na školení, která vedu. Díky a zas někdy!