WEB漏洞-XXE&XML之利用检测 – 作者:明月清风hzx

WEB漏洞-XXE&XML之利用检测

该文章为学习笔记大佬勿喷

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE Injection全称XML External Entity Injection,即xml外部实体注入漏洞,也就是XML外部实体注入攻击。XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

XML 与 HTML 的主要差异:

XML 被设计为传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息 ,而 XML 旨在传输信息。

<!–XML声明–>

<?xml version=”1.0″?>

<!–文档类型定义–>

<!DOCTYPE note [ <!–定义此文档是 note 类型的文档–>

<!ELEMENT note (to,from,heading,body)><!–定义note元素有四个元素–>

<!ELEMENT to (#PCDATA)><!–定义to元素为”#PCDATA”类型–>

<!ELEMENT from (#PCDATA)><!–定义from元素为”#PCDATA”类型–>

<!ELEMENT head (#PCDATA)><!–定义head元素为”#PCDATA”类型–>

<!ELEMENT body (#PCDATA)><!–定义body元素为”#PCDATA”类型–>

]]]>

<!–文档元素–>

<note>

<to>Dave</to>

<from>Tom</from>

<head>Reminder</head>

<body>You are a good man</body>

</note>

#DTD

文档类型定义(DTD)可定义合法的XML文档构建模块

它使用一系列合法的元素来定义文档的结构

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

(1)内部的 DOCTYPE 声明

<!DOCTYPE 根元素 [元素声明]>

(2)外部文档声明

<!DOCTYPE 根元素 SYSTEM ”文件名”>

#DTD实体

(1)内部实体

在程序用的比较多就是内部实体

参数实体声明:<!ENTITY 实体名称 ”实体的值”>

<?xml version=”1.0″ encoding=”ISO-8859-1″?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don’t forget the meeting!</body></note>

(2)外部实体

外部实体可支持http、file等协议 不同程序支持的协议也不同。

参数实体声明:<!ENTITY 实体名称 SYSTEM ”URI/URL”>

<?php

$string_xml = ‘<?xml version=”1.0″ encoding=”utf-8″?><note><to>George</to><from>John</from><heading>Reminder</heading><body>xml实体注入</body></note>’;

$xml = isset($GET[‘xml’])?$GET[‘xml’]:$string_xml;

$data = simplexml_load_string($xml);

echo ‘<meta charset=”UTF-8″>’;

print_r($data);

?>

(3)有回显

任意读取文件

<?xml version=”1.0″?><!DOCTYPE a [<!ENTITY b SYSTEM “file:///etc/passwd”>]><c>&b;</c>

使用是要进行编码

在php里还可以利用伪协议读取文件

扫描端口

执行命令

(4)称为 blind xxe 可以使用外带数据通道 提取数据

xxe漏洞修复与防御方案-php,java,python-过滤及禁用

方案1-禁用外部实体

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

Python:

from lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案2-过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

来源:freebuf.com 2021-06-16 22:34:58 by: 明月清风hzx

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论