宣传一波 更好的阅读体验 👉 个人blog
Broken Access Control(访问控制中断)
1.Insecure Direct Object References(不安全的直接引用对象)
1.
直接对象引用
直接对象引用是指应用程序使用客户端提供的输入来访问数据和对象。
例子
使用 GET 方法的直接对象引用示例可能如下所示
https://some.company.tld/dor?id=12345
https://some.company.tld/images?img=12345
https://some.company.tld/dor/12345
其他方法
POST、PUT、DELETE 或其他方法也可能容易受到影响,主要仅在方法和潜在有效载荷上有所不同。
不安全的直接对象引用
当引用未得到正确处理时,这些被认为是不安全的,并允许授权绕过或披露可用于 执行用户不应能够执行或访问的操作或访问数据。 假设作为用户,您去查看您的个人资料,URL 如下所示:
https://some.company.tld/app/user/23398
…您可以在那里查看您的个人资料。如果导航到以下位置,会发生什么情况:
https://some.company.tld/app/user/23399
…或在末尾使用另一个数字。如果您可以操作数字(用户 ID)并查看他人的配置文件,则对象引用是不安全的。 当然,这可以检查或扩展到 GET 方法之外,以查看数据,也可以操作数据。
更多好读物
在我们继续练习之前,这里有一些关于不安全的直接对象引用的好读物:
https://www.owasp.org/index.php/Testing_for_Insecure_Direct_Object_References_(OTG-AUTHZ-004)
https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control
https://www.owasp.org/index.php/Top_10_2013-A4-Insecure_Direct_Object_References
http://cwe.mitre.org/data/definitions/639.html
2.
先进行身份验证,后滥用授权
许多访问控制问题容易受到经过身份验证但未经授权的用户的攻击。因此,让我们从合法身份验证开始。然后,我们将寻找绕过或滥用授权的方法。
在这种情况下,帐户的 ID 和密码是“tom”和“cat”(这是一个不安全的应用程序,对吧?
身份验证后,进入下一个屏幕。
这题就是合法的身份验证,用tom和cat登录就行
3.
根据题意,查看请求中的非显示内容的属性
A consistent principle from the offensive side of AppSec is to view differences from the raw response to what is visible
“AppSec” 是 “Application Security” 的缩写,指的是应用程序安全。
在应用程序安全中,攻击者通常会利用应用程序的漏洞来获取未授权的访问或执行恶意操作。为了实现这一目标,攻击者需要了解应用程序的内部工作原理和潜在的弱点。
从攻击面的角度来看,一个重要的原则是密切关注应用程序的原始响应与用户可见内容之间的差异。这涉及到对应用程序的深入分析,包括请求和响应的结构、数据传输方式以及应用程序的逻辑流程。
就是你点击profile只有三个数据,但是响应的不止三个,用burp抓包就行,看返回的数据
可以知道多了role,userId
(记得用都好隔开)
4.
题目要求我们以另一种方式查看您自己的个人资料
这一题用的是RESTful 模式
RESTful是一种用于设计、构建和交付Web服务的架构风格。它基于HTTP协议,并使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来执行不同的操作。
RESTful Web服务具有以下特点:
- 客户端-服务器架构:客户端和服务器之间通过HTTP协议进行通信。客户端负责发送请求和接收响应,而服务器负责处理请求和返回响应。
- 资源标识:RESTful Web服务使用统一资源标识符(URI)来标识资源。例如,对于一个用户,可以将其标识为
/users/123
。- 资源状态:每个资源都有一个与之关联的状态,该状态可以通过HTTP请求来修改。HTTP方法(如GET、POST、PUT、DELETE等)定义了如何通过URI标识的资源来修改状态。
- 无状态通信:RESTful Web服务遵循无状态通信原则,这意味着服务器不会为每个请求存储任何状态信息。这有助于提高服务的可伸缩性和可靠性。
- 缓存:RESTful Web服务支持缓存,以便提高性能和减少网络延迟。客户端和中间件可以使用HTTP缓存头来缓存响应,并在后续请求中重用它们。
- 统一接口:RESTful Web服务使用统一的接口来访问资源。这意味着客户端可以使用相同的HTTP方法(如GET、POST、PUT、DELETE等)来访问不同的资源。
总之,RESTful Web服务提供了一种简单、一致和可扩展的方式来构建Web应用程序和服务之间的通信。它已经成为现代Web开发中的主流技术之一。
看下提示:看看前面的配置文件请求,这是类似的
上一题看到了get /WebGoat/IDOR/profile
返回的数据
{
"role" : 3,
"color" : "yellow",
"size" : "small",
"name" : "Tom Cat",
"userId" : "2342384"
}
说明请求路径大概是这样的
再看下提示说:将您的 ID 附加到上一个请求(即 …/profile/{yourId})
我们填入/WebGoat/IDOR/profile/2342384
就能访问自己的数据了
5.
这题我需要吐槽一下自己自找聪明用两个浏览器,一会用edge答题,一会用火狐,导致在做第五题的时候不管我怎么修改请求包返回的都是错误500😭,花了我一下午找问题,最后没办法直接重开,只用火狐才做出来的
题目主要的意思是第一个按钮是用来展现信息的,但是发送的请求包是%7BuserId%7D,即{userId}
说明提示我们用id去找,这里我们可以用2342384看一下tom的信息
返回
again. You need to use the same method\\/URL you used to access your own profile via direct object reference
看提示是要我们一个个推断userId,这里可以用burp爆破,也可以直接一个一个加
反之最后就是2342388
返回的json
{
"lessonCompleted" : true,
"feedback" : "Well done, you found someone else's profile",
"output" : "{role=3, color=brown, size=large, name=Buffalo Bill, userId=2342388}",
"assignment" : "IDORViewOtherProfile",
"attemptWasMade" : true
}
这里WebGoat8.2.2出了BUG,查找到Buffalo后这题直接完成了。
然后需要我们修改color为red,和修改role变小点
点击第二个按钮是用来修改信息的,点击后抓包
由题所知,这个请求遵循RESTful规则。
RESTful:GET查询、POST新增、PUT修改、DELETE删除
(1)请求方法从GET改为PUT
(2)Content-type改成application/json(因为需要传输修改的数据,修改的数据类型是json)
(3)请求内容中构造json格式的Buffalo Bill的profile,根据题目要求,role要设置为比3小的数,color要设置为red。
{
“role”:”1”,
“color”:”red”,
“size”:”large”,
“name”:”Buffalo Bill”,
“userId”:”2342388”
}
发送就行了
6.
讲了如何安全对象引用
2.Missing Function Level Access Control(缺少功能级访问控制)
2.
人们可以依靠 HTML、CSS 或 javascript 来隐藏用户通常不会访问的链接。 过去曾有过网络路由器试图在 UI 中使用 javascript 保护(隐藏)管理功能的情况:https://www.wired.com/2009/10/routers-still-vulnerable。
查找隐藏物品
通常有一些提示可以查找 UI 未公开的功能......
-
HTML 或 javascript 注释
-
注释掉的元素
-
通过 CSS 控件/类隐藏的项目
您的使命
在下面的菜单中找到攻击者/恶意用户感兴趣的两个不可见菜单项,并提交这些菜单项的标签(菜单中目前没有链接)。
就是f12慢慢找呗。。。
找到了两个不可用的链接
<a href="/users">Users</a>
<a href="/config">Config</a>
把Users和Config填入就行了
3.
这题是要是收集用户信息
利用上一题得到的user和config
上一页中找到了链接/users,但是直接点击的话,是404 not found
前面得加上/WebGoat/即
localhost:8080/WebGoat/users
但是会返回500错误
下面有两个做法(当然是提示里面说的。。。)
1.简单做法
抓包后加上
增加请求头Content-Type: application/json
的操作之后顺利拿到了hash。。
但是这太难猜了把。。。
2.进阶做法
show hints还能看到一种复杂思路,照着这个思路走了一遍
首先创建一个admin权限的用户,需要做3处修改:
(1)增加请求头Content-Type: application/json
(2)请求方法改为POST
(3)增加json格式的数据:{“username”:”newUser2”,”password”:”newUser12”,”role”:”WEBGOAT_ADMIN”}
然后返回登录页面,用这个账号就可以登陆了,然后在这个账号下重复简单做法(其实就是cooike不一样了)
就能看到hash值了
这个对这题来说是绕了个圈子,因为最后都得绕回简单做法,因为后来试了一下,用自己本来的账号也可以看到所有用户的信息。。~但或许这种思路在某些现实情况下有用吧