Taller de Seguridad Web #4

Iniciado por ANTRAX, Octubre 19, 2014, 06:08:10 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.


Introducción

Este taller va a tratar sobre seguridad web, y más precisamente, desarrollaremos  cómo evitar WAF (Web Application Firewall) en SQLi.
El WAF es un dispositivo que puede ser hardware o software que analiza el tráfico web (entre el servidor web y la WAN) y protege de diversos ataques como SQL Injection, Cross Site Scripting, etc. Protege ataques dirigidos al servidor web que los IDS/IPS no pueden. No enruta el tráfico ni lo NATea, sino que se hacen 2 peticiones diferentes, una desde el cliente hasta el WAF y otra desde el WAF hasta el servidor web final.

Pueden funcionar como bridge, router, proxy o plugin.
Un ejemplo de WAF a nivel software es el mod_security (plugin de Apache).

Como existe material de seguridad web,  SQLi por medio de MySQL, no profundizaremos, no obstante esa será la base a seguir.


Lista negra

Cuando estamos intentando PASAR un WAF, es conveniente tratar de evitar las palabras que se encuentran en una lista negra o tratar de ofuscarlas. En este ejemplo, tenemos la siguiente lista negra:


Si observamos la captura precedente, el código lo que hace es  detectar cada una de las palabras (usando preg_match):

Código: text
order
-
\s (espacios en blanco)
, (comas)
@@version
user()
tables
and
sleep
substr
substring
mid()
case


Al agregar la letra i al elenco de palabras que se detectan, posibilita que no importe si esa lista  de palabras son mayúsculas o minúsculas, de igual manera las va detectar.

Tenemos otra condición para ver si se encuentra (preg_match) en la URL las palabras:

Código: text
union
select
concat


Pero esta vez no utilizamos i (sensible a mayúsculas y minusculas), por lo que solo detectará las palabras en minúsculas  encuentran actualmente en la misma.


Inyectando SQLi y Detectando lista negra

Si hasta ahora hemos visto que al inyectar código SQL en una página, lo primero que hacemos es ver si nos tira algún error -y de hecho no importa si tampoco tira un error- como vimos en la Inyección SQL a Ciegas (Blind SQLi) en los talleres anteriores, donde nos basábamos en si era una consulta falsa o verdera para sacar los datos.

Lo típico, para ver si alguna página tiene un error en su consulta es romper la consulta en sí:

Código: mysql
$result = mysqli_query($con,"SELECT * FROM noticias WHERE id='$noticia'");


En ese caso, nuestra consulta es la anterior.

Nota importante
Código: text
Ahora, todo este código lo estamos viendo pero en realidad cuando estemos inyectando en una página código SQL éste no se verá ya que se encuentra en el Back End, por lo cual tendremos que imaginarnos como está estructurada la consulta en realidad.



Para romper esta consulta podemos utilizar ) " ' \
En este caso, como nuestra consulta es la siguiente:

Código: mysql
SELECT * FROM noticias WHERE id='$noticia'


Y lo que inyectamos se encuentra en $noticia con ' -romperíamos la consulta- quedando esté así:

Código: mysql
SELECT * FROM noticias WHERE id='''


Causando un error de sintaxis, ya que tiene 3 comillas simples.

En caso de utilizarlo en la web nos daría el error también:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta' ERROR


Hasta aquí, ya todo se ha visto en los talleres anteriores, por lo que  no explicaré en detalle cómo se inyecta, ya que ese punto lo conocen, o los invito a visitar los links:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Al no saber que hay en la lista negra, a la hora de inyectar vamos haciéndolo en la forma usual, esto nos permitirá saber si algún WAF nos está detectando. En algunos casos los WAF hacen redirección, o simplemente reinician la conexión haciendo algún sleep(),  bloquean la IP, etc.

Continuemos con la inyección:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta' order by 10 –- - DETECTADO

Nos devuelve algo como lo siguiente:


En esta oportunidad, es demasiado fácil saber que alguna de esas palabras las está detectando ya que nos lo dice en pantalla, burlándose de nosotros...)

En el siguiente paso, intentamos agregar lo menos que podamos:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta' –- - DETECTADO

Nos damos cuenta de que lo único que tenemos -aparte de los espacios- son los guiones, entonces está detectando los guiones, o los espacios, o ambos; para al notar esta situación, podemos evitar los guiones y utilizar # /* ` como comentario.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta' %23 DETECTADO

Ahora, quitemos  el espacio y ponemos los guiones:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO

Vamos a ponerle %23 es el # solo que está encodeado en URL, debido a que también se usa como hash para ir a determinada parte de un documento HTML.

Continuemos...

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA

No ha lanzado error, entonces hasta ahora nuestra inyección es correcta. Como anteriormente advertimos que también detecta los espacios;  por consiguiente, nuestra lista negra actualmente se encuentra así:

DETECTA ESPACIOS
DETECTA GUIONES


En consecuencia, tendremos que evitarlos.

Los espacios trataremos de evitarlos usando /**/ en lugar de espacios ya que es un comentario multilínea que  cierra el mismo.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA

Lo siguiente, sería saber cuántas columnas tiene la primera consulta, para de esta manera poder inyectar la nuestra utilizando la cláusula UNION y SELECT. Esto, como lo vimos,  lo hacemos usando ORDER BY.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO

Por medio de esta acción, no damos cuenta que también detecta ORDER BY. Una cláusula parecida es GROUP BY, la cual se utiliza cuando estamos usando funciones, usaremos ésta para evitar el uso de las palabras de la lista negra:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA (CON ERROR)


Nos mando un error, pero es correcta la consulta ya que en ningún momento nos dice que se ha detectado la palabra, informándonos también que no tiene 10 columnas; por lo que habrá que ir bajando...

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA (CON ERROR)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA (CON ERROR)


A través de estas consultas, nos damos percibimos la existencia de 3 columnas.

Finamente, a  generar nuestra consulta: 3

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO

Aquí hay diferentes respuestas: o nos detecta unión, o select, o las comas, o todo.

A continuación le quitaremos las comas y dejaremos la consulta solo con union select:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO

Esta acción nos permite notar que detecta union o select, lo que resulta más fácil todavía: quitamos select:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO

Quitamos union:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO

Ahora sabemos que está detectando las dos palabras...

Vamos a ver si estas palabras son sensibles a mayúsculas y minúsculas, alternando entre mayúsculas y minúsculas, entre las cláusulas:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta SIN DETECTAR (CON ERRROR EN LA CONSULTA)


Repasemos, el estado de nuestra lista negra, la que se encuentra así:

DETECTA ESPACIOS
DETECTA GUIONES
DETECTA ORDER BY
DETECTA UNION (EN MINUSCULAS)
DETECTA SELECT (EN MINUSCULAS)


Actualizamos nuestra consulta en forma correcta:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO (SIN ERRROR EN LA CONSULTA)

La última consulta nos permite ver que también nos detecta las comas. En este caso vamos utilizar join  con subconsultas de modo que nuestras tablas se multipliquen y de manera que cada registro de la primera tabla va con cada registro de la segunda tabla, y así sucesivamente.


Nota importante

Código: text
La sentencia join en SQL permite combinar registros de dos o más tablas en una base de datos relacional.

Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE, o dentro de otra subconsulta.



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA

Como se ve utilizamos alias porque sino devolvería un error como el siguiente:

ERROR 1248 (42000): Every derived table must have its own alias


Excelente, tenemos nuestros campos vulnerables, por lo cual podemos comenzar a buscar nuestra tabla, para ello como nos mostraron en los talleres anteriores vamos a buscar en la base de datos de meta datos INFORMATION_SCHEMA (esta base de datos contienen los registros, columnas y bases de datos; en sí toda la estructura).

INFORMATION_SCHEMA

¡Es hora de comenzar a inyectar!  Recordar que ya incluimos FROM para poder multiplicar las tablas... por lo cual usaremos from information_schema.tables dentro de una subconsulta.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO



El resultado de detección que resulta, no permite conocer  si nos detecta... table_name, o nos detecta information_schema, o nos detecta tables; en consecuencia para saber cual nos detecta probamos de 1 a 1...

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta NO DETECTADO (CON ERROR EN CONSULTA)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta NO DETECTADO (CON ERROR EN CONSULTA)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta DETECTADO (CON ERROR EN CONSULTA)


Hasta el momento, nuestra lista negra se encuentra así:

DETECTA ESPACIOS
DETECTA GUIONES
DETECTA ORDER BY
DETECTA UNION (EN MINUSCULAS)
DETECTA SELECT (EN MINUSCULAS)
DETECTA COMAS
DETECTA TABLES


Dentro de information_schema hay otras tablas donde podemos encontrar la misma información que cuando utilizamos tables, para evitar esto utilizaremos la tabla partitions.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA


En muchos casos no devolverá como en el ejemplo, por lo cual, filtraremos utilizando WHERE por la base de datos:

WHERE table_schema=database()

WHERE - filtramos solo los datos por los que queremos
table_schema - contienen los nombres de las bases de datos
database()  - es nuestra base de datos actual

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA


En este caso me he saltado el concat en minúsculas porque también lo detecta.

GROUP_CONCAT – Concatena 1MB de datos

Aquí, lo más importante a sacar es la tabla usuarios.

Lo siguiente es sacar las columnas:

column_name – tabla de informacion_schema donde se encuentran las columnas
columns – columna donde se encuentran los nombres de las columnas
table_name – columna donde se encuentran los nombres de las tablas

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA

Muchas veces, algunos servidores tienen habilitado magic_quotes_gpc por lo al final en table_name='usuarios' habría un error en nuestra consulta a causa de las comillas simples; en caso de que eso suceda, convertimos nuestra cadena a hexadecimal, agregando al inicio 0xacaelhexadecimalnuestratabla para que nuestra base de datos MySQL sepa que es un hexadecimal.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta CONSULTA CORRECTA


Por último, para sacar los datos, tendríamos que hacerlo de 1 a 1 ya que si recordamos las comillas son detectadas:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


O simplemente utilizar la otra subconsulta:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


usuario: arthusu
password: a74e85d6c1d4faef74abfede3bae2030 (youwin)


Finalmente,  iniciamos sesión en el panel:



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



muy bien n.n ya comprato en las redes   ;)

Felicitaciones arthusu! Está excelente el taller! Ataques avanzados de rápida comprensión gracias a la didáctica del texto.

+1

Saludos!
WhiZ


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Felicitaciones arthusu! Está excelente el taller! Ataques avanzados de rápida comprensión gracias a la didáctica del texto.

+1

Saludos!
WhiZ

Gracias y tambien a ti aika, cualquier cosa en que tengan dudas sobre el tema por favor comenten ;)
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

está excelente mis felicitaciones arthusu.

saludos!


Excelente Material, felicidades espero las próximas entregas sobro el tema.

aquí tienes un +1

Saludos  :)

Noviembre 12, 2014, 09:02:02 PM #7 Ultima modificación: Noviembre 12, 2014, 09:03:49 PM por iMex
Hola ANTRAX, buen contenido, me parece un poco corto pero bien explayado, me gustaría que se incluyera que hacer después, las dificultades de subir shell, cuando está filtrada, como bypasear y como subir un uploader para subir la shell en caso de que te limite el tamaño... hace mucho que no me paso por foros, me registré ya que me pareció buen tema y en Infiernohacker hay poca actividad...

Está muy bueno el Taller.

¡Gracias por compartir!


Excelente Taller, mis respetos para arthusu.

Best Regards,

hum4n3xpl01t  8)