黑盒测试 | 挖掘.NET程序中的反序列化漏洞

ops/2024/9/24 6:06:27/

通过不安全反序列化漏洞远程执行代码

图片

img

今天,我将回顾 OWASP 的十大漏洞之一:不安全反序列化,重点是 .NET 应用程序上反序列化漏洞的利用。

📝$ _序列化_与_反序列化

序列化是将数据对象转换为字节流的过程,字节流可以存储在文件、内存和数据库中,或者通过网络、在应用程序的不同组件之间以及在 API 调用中发送。

反序列化是相反的过程;它将流字节恢复到对象被序列化之前的原始状态。

安全的反序列化正在传递可被应用程序解释的受操纵的序列化对象,从而导致其控制。该漏洞的影响范围从拒绝服务攻击、绕过身份验证到任意代码执行。

与任何安全漏洞一样,核心问题是应用程序端缺乏对用户输入的验证,而应用程序端盲目信任发送给它的数据。在解析数据并对其采取行动之前,没有实施适当的检查。

$_Exploitation_Demo

我选择了 Hack The Box 中的 JSON 关卡来演示 .NET 应用程序的不安全反序列化。

💭我的 Web 应用程序测试方法首先将请求分为三个部分:

手动模糊应用程序并使用 Burp Suite 仔细观察响应。我通常专注于通过更改、删除或修改值来测试发送到应用程序的每个参数。

有意生成错误消息,以查看应用程序是否会显示可见的错误,从而公开一些后端信息,帮助我了解应用程序的结构。

扫描目录和端点。

图片

img

图片

img

我通过 Burp Suite 代理发送请求来检查应用程序。我注意到日志记录请求被发送到“api/token”路由,以在授予访问令牌(Bearer Token)之前检查用户名和密码。

此外,所有数据均以 JSON 形式发送。

我将请求发送给Repeater进行进一步调查。由于我没有密码,因此我传递了随机值来观察应用程序的响应。正如我们从下面的屏幕中看到的,该用户不存在。

图片

img

通过向“ api/token”发送一个空请求来继续模糊测试过程,看看我是否仍然会收到“用户不存在”错误的相同错误。相反,应用程序返回了 500 错误响应,揭示了有关应用程序语言及其部署位置的一些有用信息;耶!!!!

根据显示的错误,用户名是admin。

图片

img

我尝试使用 admin/admin 登录,并且成功了。但该关卡并不是考察弱口令,而是展示信息泄露和不安全反序列化漏洞。

回到我们的demo……

图片

img

登录后,我注意到“api/Account”请求中添加了两个参数- Bearer token 和 OAuth2 Cookie 。这两个值均以 Base64 编码。

💡 Bearer Token 是与 OAuth 2.0 授权框架一起使用的访问令牌,用于授予对受保护资源的访问权限,而不是直接使用所有者的凭据。—RFC 6750 — OAuth 2.0 授权框架[1]

图片

img

💡安全反序列化的主要标志之一是使用 base64 编码的序列化对象并将其放入 cookie 中。当 Cookie 返回到应用程序时,它会对其进行反序列化并执行其内容。没有用于检查不可信数据的安全/安全控制。

为了确定哪个参数获取应用程序解析的内容,我为每个参数传递了不同的值。正如您所看到的,应用程序根本不检查 Cookie。它只寻找 Bearer Token值。

图片

img

图片

img

图片

img

确认反序列化错误的另一种方法是发送格式错误的 JSON 请求并查看应用程序如何响应它。我在请求中随机添加了第二个双引号,对其进行编码,然后将其发送到应用程序。

图片

img

图片

img

正如您所看到的,应用程序返回了一个反序列化错误,说明失败的原因以及期望的序列化类型。

失败,因为无法解析格式错误的 JSON 对象

预期的序列化类型是 JSON.NET

😈 $_Paylaod_Time

现在我们开始进行漏洞利用。我们知道Bearer token是易受攻击的参数;理论上,我们发送给它的任何 JSON 数据都应该被解析。为了检查这一点,我发送了一个简单的 ping 请求来确认我们在机器上执行了任意代码。

由于应用程序正在寻找 JSON.NET 对象,因此我们可以使用Alvaro Muñoz开发的名为ysoserial.net:https://github.com/pwntester/ysoserial.net的工具来创建所需的对象。他的 GitHub 存储库提供了使用该工具的优秀示例。

注意:此工具在 Windows 计算机上效果最佳。

图片

img

图片

img

我使用 Base64 对请求进行编码,并启动tcpdump来侦听 ICMP 数据包 [echo requests]。当我将编码的有效负载传递给应用程序时,我立即收到了机器的响应,验证了我们执行代码的能力。

图片

img

图片

img

从这里,我们可以使用NetcatNishang Powershell来反弹shell。我选择了Nishang TCP on-liner。

图片

img

图片

img

图片

img

正如我们所看到的,精心设计的payload被反序列化并执行,应用程序没有进行验证检查以防止此类攻击。影响是远程代码执行。

✏️ $预防&建议:

•如果可能,请停止使用序列化 😐

•使用HMAC签名等数字签名来检查传递的数据是否未被篡改。

•在序列化并发送到应用程序之前始终验证用户输入并清理数据

这就是本教程的全部内容。感谢您的阅读!

无偿获取网络安全优质学习资料与干货教程

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。


http://www.ppmy.cn/ops/115146.html

相关文章

vue3知识汇总

vue3.x 0. changelog https://juejin.cn/post/7030992475271495711#heading-0 1. vite//要构建一个 Vite Vue 项目,运行,使用 NPM:npm init vitejs/app 项目名//使用 Yarn:yarn create vitejs/app 项目名//你会觉得非常快速的创建了项目,然…

淘系电商平台店铺所有商品宝贝数据API接口,用json格式示例

以下是一个淘宝店铺所有商品接口数据的 JSON 格式示例: { "status": "success", "message": "商品数据获取成功", "data": { "shop_name": "时尚潮流店铺", "products": [ { &q…

C++ | Leetcode C++题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class AllOne {list<pair<unordered_set<string>, int>> lst;unordered_map<string, list<pair<unordered_set<string>, int>>::iterator> nodes;public:AllOne() {}void inc(string key) {if (…

【c++】动态内存管理

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、内存区域分布 二、c中的动态内存管理方式 1. new与delete对内置类型的操作 2. new与delete对自定义类型的操作 三、operator new函数和op…

基于51单片机的矿井安全检测系统

基于51单片机的矿井安全检测系统使用51单片机作为系统主控&#xff0c;LCD1602进行显示同时系统集成了ADC0808和烟雾传感器、甲烷传感器&#xff0c;二者结合测量环境烟雾值&#xff0c;同时使用DHT11温湿度传感器获取环境温湿度值&#xff0c;使用L298N驱动风扇&#xff0c;利…

Gin渲染

HTML渲染 【示例1】 首先定义一个存放模板文件的 templates文件夹&#xff0c;然后在其内部按照业务分别定义一个 posts 文件夹和一个 users 文件夹。 posts/index.tmpl {{define "posts/index.tmpl"}} <!DOCTYPE html> <html lang"en">&…

WEB攻防- Oracle基本注入

前置知识 1.dual表 此表是Oracle数据库中的一个自带表&#xff0c;为满足查询条件而产生。与MySQL不同的是&#xff0c;在MySQL中查询语句可以直接是&#xff1a;select 1,2&#xff0c;但是在Oracle中就必须跟一个表名&#xff0c;但是如查询日期是没有表的&#xff0c;就可以…

线性代数(宋浩版)(4)

2.4逆矩阵 &#xff08;不要把矩阵放在分母上&#xff09; 方阵的行列式 性质1 性质2 性质3 伴随矩阵&#xff08;只有方阵才有&#xff09; 1.求出所有元素的代数余子式&#xff08;矩阵先求行列式&#xff09;。 2.按行求的代数余子式按列放。 定理1&#xff08;重要&…