SlideShare una empresa de Scribd logo
1 de 29
Michal Špaček, Skype, #4IT445 2012
www.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í jednu
společ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, 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
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
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
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
Ř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 = 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
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
Ú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 (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
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
Ř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 >. 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
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
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
Ú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
"… 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
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
'… 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
Ř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
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
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
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
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
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
Ř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
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
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!

Más contenido relacionado

La actualidad más candente

Jak zlepšit zabezpečení čtvrtiny celého webu
Jak zlepšit zabezpečení čtvrtiny celého webuJak zlepšit zabezpečení čtvrtiny celého webu
Jak zlepšit zabezpečení čtvrtiny celého webuMichal Špaček
 
Základy webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketingZáklady webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketingMichal Špaček
 
HTTP Strict Transport Security (HSTS)
HTTP Strict Transport Security (HSTS)HTTP Strict Transport Security (HSTS)
HTTP Strict Transport Security (HSTS)Michal Špaček
 
WebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnostWebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnostMichal Špaček
 
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdíleníPassword manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdíleníMichal Špaček
 
Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)Michal Špaček
 
HTTPS (a šifrování) všude
HTTPS (a šifrování) všudeHTTPS (a šifrování) všude
HTTPS (a šifrování) všudeMichal Špaček
 
Bezpečnost na webu
Bezpečnost na webuBezpečnost na webu
Bezpečnost na webuMiloš Janda
 
Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)wcsk
 
WordCamp Prague 2014 - Website security cz
WordCamp Prague 2014 - Website security czWordCamp Prague 2014 - Website security cz
WordCamp Prague 2014 - Website security czpeter_sucuri
 
HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015tomashala
 
Nejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webůNejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webůVladimír Smitka
 
API Obludárium (API 2018, Praha)
API Obludárium (API 2018, Praha)API Obludárium (API 2018, Praha)
API Obludárium (API 2018, Praha)Michal Taborsky
 
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
WordPress šablony a  rychlost načítání (WordCamp Praha 2017)WordPress šablony a  rychlost načítání (WordCamp Praha 2017)
WordPress šablony a rychlost načítání (WordCamp Praha 2017)Martin Michálek
 

La actualidad más candente (20)

Jak zlepšit zabezpečení čtvrtiny celého webu
Jak zlepšit zabezpečení čtvrtiny celého webuJak zlepšit zabezpečení čtvrtiny celého webu
Jak zlepšit zabezpečení čtvrtiny celého webu
 
Hashování hesel
Hashování heselHashování hesel
Hashování hesel
 
Zabezpečení Slevomatu
Zabezpečení SlevomatuZabezpečení Slevomatu
Zabezpečení Slevomatu
 
Základy webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketingZáklady webové bezpečnosti pro PR a marketing
Základy webové bezpečnosti pro PR a marketing
 
Přechod na HTTPS
Přechod na HTTPSPřechod na HTTPS
Přechod na HTTPS
 
HTTP Strict Transport Security (HSTS)
HTTP Strict Transport Security (HSTS)HTTP Strict Transport Security (HSTS)
HTTP Strict Transport Security (HSTS)
 
WebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnostWebTop100 Technické chyby, výkon a bezpečnost
WebTop100 Technické chyby, výkon a bezpečnost
 
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdíleníPassword manažeři detailněji – 1Password, LastPass, 2FA, sdílení
Password manažeři detailněji – 1Password, LastPass, 2FA, sdílení
 
Hlava není na hesla
Hlava není na heslaHlava není na hesla
Hlava není na hesla
 
Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)Bezpečnost e-shopů (HTTPS, XSS, CSP)
Bezpečnost e-shopů (HTTPS, XSS, CSP)
 
Zapomeňte vaše hesla
Zapomeňte vaše heslaZapomeňte vaše hesla
Zapomeňte vaše hesla
 
HTTPS (a šifrování) všude
HTTPS (a šifrování) všudeHTTPS (a šifrování) všude
HTTPS (a šifrování) všude
 
Bezpečnost na webu
Bezpečnost na webuBezpečnost na webu
Bezpečnost na webu
 
Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)Website Security & WordPress (Peter Gramantik)
Website Security & WordPress (Peter Gramantik)
 
WordCamp Prague 2014 - Website security cz
WordCamp Prague 2014 - Website security czWordCamp Prague 2014 - Website security cz
WordCamp Prague 2014 - Website security cz
 
HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015HTTPS zdarma a pro všechny - LinuxDays 2015
HTTPS zdarma a pro všechny - LinuxDays 2015
 
Nejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webůNejčastejší problémy WordPress webů
Nejčastejší problémy WordPress webů
 
Total Cost of Pwnership
Total Cost of PwnershipTotal Cost of Pwnership
Total Cost of Pwnership
 
API Obludárium (API 2018, Praha)
API Obludárium (API 2018, Praha)API Obludárium (API 2018, Praha)
API Obludárium (API 2018, Praha)
 
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
WordPress šablony a  rychlost načítání (WordCamp Praha 2017)WordPress šablony a  rychlost načítání (WordCamp Praha 2017)
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
 

Similar a Bezpečnostní útoky na webové aplikace

PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018Brilo Team
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidechseznamVyvojari
 
5was 100524062135-phpapp02
5was 100524062135-phpapp025was 100524062135-phpapp02
5was 100524062135-phpapp02simon680
 
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)Jakub Kulhan
 
Představení Ruby on Rails
Představení Ruby on RailsPředstavení Ruby on Rails
Představení Ruby on Railsigloonet
 
Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...
Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...
Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...Sun Marketing
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017Michal Blažek
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace Jan Hřídel
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)almadcz
 
Jak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránkyJak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránkyVladimír Smitka
 
ASP.NET MVC 3 and SQL Server interoperability overview [CZ]
ASP.NET MVC 3 and SQL Server interoperability overview [CZ]ASP.NET MVC 3 and SQL Server interoperability overview [CZ]
ASP.NET MVC 3 and SQL Server interoperability overview [CZ]Vítězslav Šimon
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbecDavid Grudl
 
moderni webapp - frontend
moderni webapp - frontendmoderni webapp - frontend
moderni webapp - frontendTomas Hodbod
 
Seo Pro Drupal Developery
Seo Pro Drupal DeveloperySeo Pro Drupal Developery
Seo Pro Drupal DeveloperyJozef Toth
 

Similar a Bezpečnostní útoky na webové aplikace (20)

PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018PoSobota 96 ČB 28.4.2018
PoSobota 96 ČB 28.4.2018
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidech
 
5was 100524062135-phpapp02
5was 100524062135-phpapp025was 100524062135-phpapp02
5was 100524062135-phpapp02
 
Web Application Scanning (WAS)
Web Application Scanning (WAS)Web Application Scanning (WAS)
Web Application Scanning (WAS)
 
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
 
Představení Ruby on Rails
Představení Ruby on RailsPředstavení Ruby on Rails
Představení Ruby on Rails
 
ASP.NET 3.5 / futures
ASP.NET 3.5 / futuresASP.NET 3.5 / futures
ASP.NET 3.5 / futures
 
Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...
Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...
Digisemestr - Broken linkbuilding, strukturovaná data a další možnosti pokroč...
 
Instalace WordPress
Instalace WordPressInstalace WordPress
Instalace WordPress
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace
 
TNPW2-2011-06
TNPW2-2011-06TNPW2-2011-06
TNPW2-2011-06
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)
 
Jak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránkyJak si (ne)nechat hacknout Wordpress stránky
Jak si (ne)nechat hacknout Wordpress stránky
 
ASP.NET MVC 3 and SQL Server interoperability overview [CZ]
ASP.NET MVC 3 and SQL Server interoperability overview [CZ]ASP.NET MVC 3 and SQL Server interoperability overview [CZ]
ASP.NET MVC 3 and SQL Server interoperability overview [CZ]
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbec
 
QualysGuard InfoDay 2014 - WAS
QualysGuard InfoDay 2014 - WASQualysGuard InfoDay 2014 - WAS
QualysGuard InfoDay 2014 - WAS
 
moderni webapp - frontend
moderni webapp - frontendmoderni webapp - frontend
moderni webapp - frontend
 
TNPW2-2016-03
TNPW2-2016-03TNPW2-2016-03
TNPW2-2016-03
 
Seo Pro Drupal Developery
Seo Pro Drupal DeveloperySeo Pro Drupal Developery
Seo Pro Drupal Developery
 

Más de Michal Špaček

Lámání a ukládání hesel
Lámání a ukládání heselLámání a ukládání hesel
Lámání a ukládání heselMichal Špaček
 
Fantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v OpeřeFantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v OpeřeMichal Špaček
 
Quality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of DefenseQuality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of DefenseMichal Špaček
 
Disclosing password hashing policies
Disclosing password hashing policiesDisclosing password hashing policies
Disclosing password hashing policiesMichal Špaček
 
Operations security (OPSEC) in IT
Operations security (OPSEC) in ITOperations security (OPSEC) in IT
Operations security (OPSEC) in ITMichal Špaček
 
HTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English versionHTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English versionMichal Špaček
 
Bezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeníchBezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeníchMichal Špaček
 
I forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and whyI forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and whyMichal Špaček
 
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)Michal Špaček
 
The problem with the real world
The problem with the real worldThe problem with the real world
The problem with the real worldMichal Špaček
 
Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013Michal Špaček
 

Más de Michal Špaček (12)

Lámání a ukládání hesel
Lámání a ukládání heselLámání a ukládání hesel
Lámání a ukládání hesel
 
Fantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v OpeřeFantom Opery, "VPN" a Secure Proxy v Opeře
Fantom Opery, "VPN" a Secure Proxy v Opeře
 
Quality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of DefenseQuality of Life, Multiple Lines of Defense
Quality of Life, Multiple Lines of Defense
 
Disclosing password hashing policies
Disclosing password hashing policiesDisclosing password hashing policies
Disclosing password hashing policies
 
Operations security (OPSEC) in IT
Operations security (OPSEC) in ITOperations security (OPSEC) in IT
Operations security (OPSEC) in IT
 
HTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English versionHTTP Strict Transport Security (HSTS), English version
HTTP Strict Transport Security (HSTS), English version
 
Bezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeníchBezpečnost na mobilních zařízeních
Bezpečnost na mobilních zařízeních
 
I forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and whyI forgot my password – what a secure password reset needs to have and why
I forgot my password – what a secure password reset needs to have and why
 
HTTP/2
HTTP/2HTTP/2
HTTP/2
 
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
Víte, že nevíte, že já vím, že nevíte? (WebTop100 2014)
 
The problem with the real world
The problem with the real worldThe problem with the real world
The problem with the real world
 
Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013Defense in Depth Web Inkognito 12/2013
Defense in Depth Web Inkognito 12/2013
 

Bezpečnostní útoky na webové aplikace

  • 1. Michal Špaček, Skype, #4IT445 2012 www.michalspacek.cz @spazef0rze
  • 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. 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. 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. 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. 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. Ř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. 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. 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. Ú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. 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. 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. Ř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. 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. 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. 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. Ú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. "… 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. 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. '… 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. Ř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. 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. 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. 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. 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. 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. Ř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. 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. 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!