小白兔快开门,我是你爸爸。WEB安全基础入门—访问控制漏洞和权限提升_访问权限修饰符控制漏洞(2)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

例题 3、4

  • 平台配置错误导致访问控制中断

一些程序的访问控制是依赖于平台基于角色对特定URL和HTTP的限制实现的。
DENY: POST, /admin/deleteUser, managers

禁止managers用户组的人员 使用删除账户的功能

但是可尝试修改访问方法X-Original-URL X-Rewrite-URL两个header重写URL,实现绕过

POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...

例题 5、6

2. 横向权限提升

如果用户能够访问属于另一个用户的资源,即为横向权限提升。如查看他人个人信息页或查看工资单。
攻击手段与垂直权限提升攻击手段类似,如直接访问URL
https://insecure-website.com/myaccount?id=123

例题7、8、9

3. 从横向到纵向的权限提升

如果横向权限提升到了其他高权限账户,则实现了从横向到纵向的权限提升。

例题 10

4. 不安全的直接对象引用(IDOR)

应用程序直接调用被用户控制输入的信息进行查询,造成对恶意对象的直接调用。

  • 对数据对象的直接引用

https://insecure-website.com/customer_account?customer_number=132355
如上URL,某个网站数据库存储的索引值(index)直接作为路径参数customer_number的值。若防护不当,攻击者可以任意修改该值,查看其他索引值对应存储的信息。
若遍历到存储高权限账户的索引值,则攻击会造成很大的威胁。

  • 对静态文件的直接引用

https://insecure-website.com/static/12144.txt
如上URL,某个网站将聊天记录以txt文档形式定期存储在服务其上,随着不断累积自动生成新的txt文档。网站可通过URL直接访问这些静态文件。若防护不当,攻击者可任意修改该URL路径,查看其他静态文件。

例题11

5. 多步骤业务流程中的访问控制漏洞

在处理比较重要的业务时,往往采用多步骤处理流程。以管理员更新指定账户信息的操作为例,往往涉及至少如下三个步骤:

  • 读取指定用户的信息
  • 提交变更
  • 查看变化内容并确认

有时网站安全防护只针对部分步骤进行了访问控制,而忽略剩余页面的防护。比如,开发者对上述一、二两步骤设置访问控制,却默认到达第三步的用户为可信用户,无需再做访问控制。攻击者可以利用这点直接调到第三步进行未授权访问。

例题 12

6. 基于Referer的访问控制

有些网页的认证逻辑是,用户在登陆管理员页面/admin时,进行严格的访问控制。但在执行后续操作时,如删除某个用户/admin/deleteUser,则采取验证报头referer的方式,验证其是否从/admin页面过来。

referer标头的作用是记录请求过来时的上一个路径,但此标头可以在Burp等类似工具中任意修改。

例题 13

7. 基于地理位置的访问控制

有些商业或社交媒体应用对访问者的位置进行访问控制,此种情况可以使用代理、VPN或者修改地理位置的插件进行篡改,从而实现绕过。

5. 漏洞实例

1. 不受保护的管理功能(Unprotected admin functionality
  • 目标

删除账户carlos

  • 解题思路

随手一试有/robots.txt得到路径/administrator-panel可直接访问

2. 不受保护的管理功能但使用了不可预测的URL(Unprotected admin functionality with unpredictable URL
  • 目标

删除账户carlos

  • 解题思路

在首页代码中发现js代码,获取后台管理路径/admin-mzk80q

var isAdmin = false;
if (isAdmin) {
   var topLinksTag = document.getElementsByClassName("top-links")[0];
   var adminPanelTag = document.createElement('a');
   adminPanelTag.setAttribute('href', '/admin-mzk80q');    (关键信息在此行)
   adminPanelTag.innerText = 'Admin panel';
   topLinksTag.append(adminPanelTag);
   var pTag = document.createElement('p');
   pTag.innerText = '|';
   topLinksTag.appendChild(pTag);
}

3. 由请求参数控制的用户角色(User role controlled by request parameter
  • 目标

删除账户carlos
测试账户:wiener:peter

  • 解题思路

浏览数据包发现cookie中存在Admin=false,改为true即可

GET /my-account HTTP/1.1
Host: 0ab100e204f55672c0eb16ac002b0029.web-security-academy.net
Cookie: session=DsCKlJOncLPK0Qw4ANnbaeMd0SjWW9m9; Admin=false


4. 可以在用户配置文件中修改用户角色(User role can be modified in user profile
  • 目标

管理页面路径为/admin 用户roleid=2可访问。删除账户carlos
测试账户:wiener:peter

  • 解题思路
    1. 经测试在更换邮箱功能点时发现如下数据包和响应,包含roleid
POST /my-account/change-email HTTP/1.1
Host: 0aa400d30361cda2c0613cc0007b00f7.web-security-academy.net

{"email":"123@123.com"}

HTTP/1.1 302 Found
Location: /my-account
Content-Type: application/json; charset=utf-8
Connection: close
Content-Length: 115

{
"username": "wiener",
"email": "123@123.com",
"apikey": "EG450geTGShSaScJP4Wx0jQfObL3dITa",
"roleid": 1
}

  1. 因是json交互,尝试在请求json中,增加roleid=2
POST /my-account/change-email HTTP/1.1
Host: 0aa400d30361cda2c0613cc0007b00f7.web-security-academy.net

{"email":"123@123.com",
"roleid":2
}

5. 可以绕过基于URL的访问控制(URL-based access control can be circumvented
  • 目标

管理页面在/admin HTTP支持标头X-Original-URL删除账户carlos

  • 解题思路

本题访问/admin页面被拒绝,考虑使用X-Original-URL重写URL,实现绕过

GET / HTTP/1.1
Host: 0a1400540499c19fc0588c9500a700cc.web-security-academy.net
X-Original-URL: /admin

GET /?username=carlos HTTP/1.1
Host: 0a1400540499c19fc0588c9500a700cc.web-security-academy.net
X-Original-URL: /admin/delete?username=carlos

6. 可以绕过基于方法的访问控制(Method-based access control can be circumvented
  • 目标

登陆账户wiener:peter 提升权限至administrator
可参考登陆administrator:admin熟悉整个流程

  • 解题思路

暂略

7. 可控制请求参数中的用户的ID (User ID controlled by request parameter
  • 目标

获取账户carlos 的API key
测试账号:wiener:peter

  • 解题思路

熟悉流程后,发现数据包/my-account?id=wiener
尝试更为为id=carlos

8. 具有不可预测的用户ID (User ID controlled by request parameter, with unpredictable user IDs
  • 目标

获取账户carlos 的 GUID 获取其API key
测试账号:wiener:peter

  • 解题思路
    1. 熟悉流程后,发现数据包/my-account?id=85ecc1fe-90e2-4de8-b2ac-f35b58117019
    2. 发现参数id使用了GUID无法预测,不能像上题直接更换参数了。继续浏览网页查看是否有其他途径获取carlos的GUID
    3. 发现carlos发布的文章,查看页面代码,发现亮点(其实这道题放在信息泄露那里更适合)
<h1>What Can 5G Do For You?</h1>
<p><span id=blog-author><a href='/blogs?userId=cad2ac39-9e5b-45ed-bb36-7db56335aa3d'>carlos</a></span> | 07 May 2022</p>

  1. 改造数据包为
GET /my-account?id=cad2ac39-9e5b-45ed-bb36-7db56335aa3d HTTP/1.1
Host: 0a21001804b9771bc0c2445d00ad005d.web-security-academy.net

9. 重定向数据泄漏获取ID参数 (User ID controlled by request parameter with data leakage in redirect
  • 目标

获取账户carlos 的API key
测试账号:wiener:peter

  • 解题思路

此题与第7题完全一样,只是页面重定向到了登陆界面,但是数据包信息全部泄露。
给我们的启发是做安全渗透要一边看web页面,一边看数据包内容,甚至是习惯只看数据包,来发现所有功能点和内部文件的调用关系。这是个基本功。

10. 请求参数控制,获取密码(User ID controlled by request parameter with password disclosure
  • 目标

获取账户administrator的密码,删除账户carlos
测试账号:wiener:peter

  • 解题思路

与第7题思路一致,在响应包中获取administrator的密码

11. 不安全的直接对象引用(Insecure direct object references
  • 目标

通过查看聊天记录文件,获取目标账户carlos的密码,登陆其账户。

  • 解题思路
    1. 找到聊天功能点,查看数据包,发现下载数据包路径为GET /download-transcript/2.txt
    2. 尝试修改为GET /download-transcript/1.txt,可得到他人聊天记录获取密码
12 多步骤处理流程的访问缺陷(Multi-step process with no access control on one step
  • 目标

使账户wiener:peter成为管理员权限账户
可以使用administrator:admin熟悉整个流程

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

a57acb))

  • 目标

使账户wiener:peter成为管理员权限账户
可以使用administrator:admin熟悉整个流程

[外链图片转存中…(img-R5H13p01-1715458141152)]
[外链图片转存中…(img-5AcLfdgr-1715458141153)]
[外链图片转存中…(img-K0jaOC8R-1715458141153)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以用Python的turtle模块来画一个小白兔。下面是代码: ```python import turtle # 创建画布和画笔 canvas = turtle.Screen() canvas.bgcolor("white") pen = turtle.Turtle() pen.speed(0) pen.color("black") # 画兔耳朵 pen.fillcolor("#FCD5B5") pen.begin_fill() pen.setheading(60) pen.circle(80, 60) pen.setheading(120) pen.circle(80, 120) pen.end_fill() # 画兔脸 pen.fillcolor("#FCD5B5") pen.begin_fill() pen.setheading(240) pen.circle(80, 60) pen.setheading(300) pen.circle(80, 120) pen.end_fill() # 画眼睛 pen.penup() pen.goto(-30, 40) pen.pendown() pen.fillcolor("black") pen.begin_fill() pen.circle(10) pen.end_fill() pen.penup() pen.goto(30, 40) pen.pendown() pen.fillcolor("black") pen.begin_fill() pen.circle(10) pen.end_fill() # 画嘴巴 pen.penup() pen.goto(-20, 10) pen.pendown() pen.setheading(-45) pen.circle(25, 90) # 画身体 pen.penup() pen.goto(-80, -80) pen.pendown() pen.fillcolor("#FCD5B5") pen.begin_fill() pen.setheading(60) pen.circle(80, 60) pen.setheading(120) pen.circle(80, 120) pen.setheading(-120) pen.circle(80, 120) pen.setheading(-60) pen.circle(80, 60) pen.end_fill() # 画前腿 pen.penup() pen.goto(-70, -80) pen.pendown() pen.fillcolor("#FCD5B5") pen.begin_fill() pen.setheading(-45) pen.circle(40, 90) pen.setheading(0) pen.forward(30) pen.end_fill() # 画后腿 pen.penup() pen.goto(10, -80) pen.pendown() pen.fillcolor("#FCD5B5") pen.begin_fill() pen.setheading(-135) pen.circle(40, 90) pen.setheading(180) pen.forward(30) pen.end_fill() # 结束画笔 pen.hideturtle() # 显示画布 turtle.done() ``` 这个小白兔长这样: ![小白兔](https://cdn.jsdelivr.net/gh/kaito0925/blog-img-repo/img/rabbit.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值