Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Michal Špaček, Skype, #4IT445 2012
www.michalspacek.cz @spazef0rze
Útoky na web

                        SQL Injection
                        Cross-Site Scripting
                        F...
Full Path Disclosure


           Vyzrazení plné cesty ke skriptu
         http://devblog.cz/2012/04/fpd-aneb-full-path-di...
Může to vypadat třeba takto. Aplikace nám toho ovšem vyzradí mnohem více, než jen to, kde na
disku žije. Dozvíme se napřík...
Jednou z několika možností, jak tento útok vyvolat, je změna typu vstupních parametrů. Z
klasického řetězce uděláme pole p...
Další variantou FPD útoku je zobrazení výstupu phpinfo(). Na velké části webů psaných v PHP
se takový výstup nachází na UR...
Řešení?


     display_errors = Off

Říkal jsem, že řešení jsou jednoduchá, že? Zakažte zobrazování chybových hlášek a hot...
log_errors = On

Co naopak povolte, je ukládání chybových hlášek do nějakého souboru, abyste se vůbec
dozvěděli, že k něja...
Cross-Site Scripting (XSS)


              Útočník vloží na naši stránku
                   vlastní JavaScript

Zábavnější...
Ú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 ci...
Všimněte si označeného textu. Tento HTML tag vložil útočník úpravou adresy stránky (viz
předchozí obrázek) a webová aplika...
Pomocí vloženého JavaScriptu může útočník dělat spoustu věcí, zde je například ukázka
odchytávání uživatelských jmen a hes...
Řešení?

   htmlspecialchars($string)

Další jednoduché řešení. Pro ochranu před XSS stačí veškerá data (uživatelská i apl...
htmlspecialchars($string, ENT_QUOTES)




htmlspecialchars() standardně převádí na HTML entity pouze znaky &, ", < a >. Po...
Nepoužívat

                            strip_tags()

                               proti XSS
Nikdy nepoužívejte na ochra...
SQL Injection


              Útočník modifikuje SQL dotaz



Dopad útoku SQL Injection může být poměrně značný. Pokud je ...
Útok spočívá v úpravě SQL dotazu, který aplikace odesílá do databázového serveru. Napsáním
speciálních znaků do některého ...
"… WHERE znacka = '{$_GET['znacka']}'"




Chyba vyvolaná na této stránce vznikla nejspíš tak, že parametr znacka byl rovn...
Zde vidíme podobnou chybu, jako na předchozím obrázku. Parametr id původně obsahoval
nějaké číslo, ale uvedením řetezce se...
'… WHERE id = ' . $_GET['id']




Kód ve skriptu vypadal nejspíš nějak takto. Parametr id je rovnou připojen na konec SQL ...
Ř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í...
Takto nějak vypadá práce s rozšířením PDO. Na řádku 2 vytvoříme spojení s databázovým
serverem. Na řádku 3 je pak uveden S...
mysql_set_charset()

    mysql_real_escape_string()

Rozšíření mysql vázání proměnných nijak elegantně nepodporuje. Pro oš...
Nepoužívat

                            addslashes()

                              proti SQLIA
Vůbec nikdy nepoužívejte f...
Hashování hesel

                       Nepoužívat MD5

                                Ani SHA-1
Pokud ve vaší aplikaci u...
Jak MD5, tak SHA-1 jsou už překonané. Předpočítané hashe najdete na webu Googlem, takže
nemusíte nic crackovat. A když nic...
Řešení?

                      SHA-512 a salt?

                          hash_hmac()
Pokud budete hashovat hesla, tak pou...
Lepší řešení?

                               bcrypt!
     crypt() + Blowfish hashing
          http://codahale.com/how-to...
That's it. That's me.

                       Michal Špaček
                       www.michalspacek.cz
                   ...
Upcoming SlideShare
Loading in …5
×

of

Bezpečnostní útoky na webové aplikace Slide 1 Bezpečnostní útoky na webové aplikace Slide 2 Bezpečnostní útoky na webové aplikace Slide 3 Bezpečnostní útoky na webové aplikace Slide 4 Bezpečnostní útoky na webové aplikace Slide 5 Bezpečnostní útoky na webové aplikace Slide 6 Bezpečnostní útoky na webové aplikace Slide 7 Bezpečnostní útoky na webové aplikace Slide 8 Bezpečnostní útoky na webové aplikace Slide 9 Bezpečnostní útoky na webové aplikace Slide 10 Bezpečnostní útoky na webové aplikace Slide 11 Bezpečnostní útoky na webové aplikace Slide 12 Bezpečnostní útoky na webové aplikace Slide 13 Bezpečnostní útoky na webové aplikace Slide 14 Bezpečnostní útoky na webové aplikace Slide 15 Bezpečnostní útoky na webové aplikace Slide 16 Bezpečnostní útoky na webové aplikace Slide 17 Bezpečnostní útoky na webové aplikace Slide 18 Bezpečnostní útoky na webové aplikace Slide 19 Bezpečnostní útoky na webové aplikace Slide 20 Bezpečnostní útoky na webové aplikace Slide 21 Bezpečnostní útoky na webové aplikace Slide 22 Bezpečnostní útoky na webové aplikace Slide 23 Bezpečnostní útoky na webové aplikace Slide 24 Bezpečnostní útoky na webové aplikace Slide 25 Bezpečnostní útoky na webové aplikace Slide 26 Bezpečnostní útoky na webové aplikace Slide 27 Bezpečnostní útoky na webové aplikace Slide 28 Bezpečnostní útoky na webové aplikace Slide 29
Upcoming SlideShare
Introduction to chrome extension development
Next
Download to read offline and view in fullscreen.

4 Likes

Share

Download to read offline

Bezpečnostní útoky na webové aplikace

Download to read offline

Ú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.

Related Books

Free with a 30 day trial from Scribd

See all

Bezpečnostní útoky na webové aplikace

  1. 1. Michal Špaček, Skype, #4IT445 2012 www.michalspacek.cz @spazef0rze
  2. 2. Ú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í jednu společnou věc – zabránění těmto útokům je jednoduché, jak facka. Michal Špaček www.michalspacek.cz
  3. 3. 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, aby vyzradila kde na disku serveru jsou uloženy skripty dané aplikace. Více o FPD si můžete přečíst v mém článku na uvedené adrese. Michal Špaček www.michalspacek.cz
  4. 4. Může to vypadat třeba takto. Aplikace nám toho ovšem vyzradí mnohem více, než jen to, kde na disku ž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
  5. 5. Jednou z několika možností, jak tento útok vyvolat, je změna typu vstupních parametrů. Z klasického řetězce uděláme pole přidáním hranatých závorek za název parametru v URL (a před rovní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
  6. 6. Další variantou FPD útoku je zobrazení výstupu phpinfo(). Na velké části webů psaných v PHP se 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
  7. 7. Ř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
  8. 8. log_errors = On Co naopak povolte, je ukládání chybových hlášek do nějakého souboru, abyste se vůbec dozvě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
  9. 9. Cross-Site Scripting (XSS) Útočník vloží na naši stránku vlastní JavaScript Zábavnějším útokem na webové aplikace a na jejich návštěvníky je Cross-Site Scripting. Útočník vložením vlastního JavaScriptu do stránky získává kontrolu nad prohlížečem návštěvníka. Může s ním dělat vše, co JavaScript dovoluje, inspirujte se třeba projektem BeEF http://beefproject.com/ Michal Špaček www.michalspacek.cz
  10. 10. Ú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
  11. 11. Všimněte si označeného textu. Tento HTML tag vložil útočník úpravou adresy stránky (viz předchozí obrázek) a webová aplikace jej zapomněla zabezpečit. Útočníkovi pak stačí takovou adresu (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 nic nemusí nikomu posílat, stačí jenom navšívit takovou napadenou stránku. Michal Špaček www.michalspacek.cz
  12. 12. Pomocí vloženého JavaScriptu může útočník dělat spoustu věcí, zde je například ukázka odchytávání uživatelských jmen a hesel zadávaných do formuláře s id userform a jejich odesílání na server tak, aby uživatel nic nepoznal, formulář se následně normálně odešle. Michal Špaček www.michalspacek.cz
  13. 13. Ř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
  14. 14. htmlspecialchars($string, ENT_QUOTES) htmlspecialchars() standardně převádí na HTML entity pouze znaky &, ", < a >. Pokud HTML 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
  15. 15. Nepoužívat strip_tags() proti XSS Nikdy nepoužívejte na ochranu před XSS funkci strip_tags(). Není na to určená a navíc neochrání před tím, když útočník nebude vkládat celé tagy, ale jenom nové atributy (třeba onmouseover). Nepoužívejte ji ani na povolení některých tagů, ponechává totiž tagy i atributy. Michal Špaček www.michalspacek.cz
  16. 16. SQL Injection Útočník modifikuje SQL dotaz Dopad útoku SQL Injection může být poměrně značný. Pokud je úspěšný, tak má útočník pod kontrolou celou databázi webové aplikace a může si s ní dělat, co chce. Například získávat už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
  17. 17. Útok spočívá v úpravě SQL dotazu, který aplikace odesílá do databázového serveru. Napsáním speciálních znaků do některého parametru v adrese (zde znacka) vyvoláme chybu a zkoumáním a hledáním zadaného řetezce (třetí řádek shora, vpravo) zjistíme, jak parametr upravit. Michal Špaček www.michalspacek.cz
  18. 18. "… WHERE znacka = '{$_GET['znacka']}'" Chyba vyvolaná na této stránce vznikla nejspíš tak, že parametr znacka byl rovnou vložen do SQL 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
  19. 19. Zde vidíme podobnou chybu, jako na předchozím obrázku. Parametr id původně obsahoval nějaké číslo, ale uvedením řetezce se útočníkovi podařilo vyvolat tuto chybovou hlášku, kterou na sebe aplikace vyzradila, že útoku SQL Injection neodolá. Michal Špaček www.michalspacek.cz
  20. 20. '… 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ázev sloupce. I bez zobrazeného SQL dotazu útočník dokáže odhadnout, co má do parametru vložit. Michal Špaček www.michalspacek.cz
  21. 21. Ř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. V PHP 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
  22. 22. Takto nějak vypadá práce s rozšířením PDO. Na řádku 2 vytvoříme spojení s databázovým serverem. Na řádku 3 je pak uveden SQL dotaz a místo hodnot jsou uvedena zástupná jména parametrů ve formátu :jmeno. Na řádku 4 řekneme databázovému serveru, aby si připravil vykonání dotazu. Metodou bindValue() propojíme zástupné jméno s hodnotou, všiměte si, že hodnotu nikde nijak speciálně neošetřujeme a že v dotazu nejsou kolem :id uvozovky. Na řádku 6 konečně odešleme data na databázový server a tím efektivně vykonáme dotaz. Michal Špaček www.michalspacek.cz
  23. 23. 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 SQL dotazu 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ý je ukázán na stránce 20, tedy případ, kdy v SQL dotazu očekáváme číslo. Tyto funkce slouží k zabránění „útěku z řetezce“, ale pokud v dotazu očekáváme číslo, tak v žádném řetezci nejsme a nemusí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
  24. 24. Nepoužívat addslashes() proti SQLIA Vůbec nikdy nepoužívejte funkci addslashes() pro ošetření dat proti SQL Injection. Tato funkce, ač zdánlivě dělá to samé, tak neslouží pro ochranu proti SQL Injection. V některých asijských znakových sadách je i přes použití addslashes() možné takový útok provést. Michal Špaček www.michalspacek.cz
  25. 25. Hashování hesel Nepoužívat MD5 Ani SHA-1 Pokud ve vaší aplikaci ukládáte uživatelská hesla, nikdy je neukládejte jen tak, v čitelné podobě. Hashujte je před uložením do databáze. Ale pozor, není hashování, jako hashování. Pro nové aplikace dnes už nepoužívejte MD5 ani SHA-1. Michal Špaček www.michalspacek.cz
  26. 26. Jak MD5, tak SHA-1 jsou už překonané. Předpočítané hashe najdete na webu Googlem, takže nemusíte nic crackovat. A když nic nenajdete, tak oba algoritmy jsou tak rychlé, že cracknutí hesel je většinou otázka několika minut. Michal Špaček www.michalspacek.cz
  27. 27. Ř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 salt jako 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
  28. 28. 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íky relativní vlastní pomalosti vyřeší použití funkce crypt() s Blowfish hashing algoritmem, který se zapne saltem, který začíná na $2a$, více v dokumentaci PHP. Tento hash doporučuje váš dealer! Michal Špaček www.michalspacek.cz
  29. 29. That's it. That's me. Michal Špaček www.michalspacek.cz @spazef0rze Přijďte na školení http://www.michalspacek.cz/skoleni Tak a to je vše, přátelé. Sledujte mě na Twitteru https://twitter.com/spazef0rze, pokud se chcete dozvědět, co se děje v mém světě PHP, bezpečnosti a výkonnosti. Pokud se toho chcete dozvědět ještě více z uvedených oblastí, přijďte na školení, která vedu. Díky a zas někdy!
  • ivorius

    Jan. 3, 2013
  • ladislavprskavec

    Jan. 3, 2013
  • KarelUhlik

    May. 14, 2012
  • petrbela

    May. 13, 2012

Ú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.

Views

Total views

3,930

On Slideshare

0

From embeds

0

Number of embeds

248

Actions

Downloads

28

Shares

0

Comments

0

Likes

4

×