Insecure Direct Object References不安全的直接对象引用
直接对象引用
直接对象引用是指应用程序使用客户端提供的输入来访问数据和对象。
例子
使用 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://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Cheat_Sheet.html
https://www.owasp.org/index.php/Top_10_2013-A4-Insecure_Direct_Object_References
http://cwe.mitre.org/data/definitions/639.html
先进行身份验证,后滥用授权
许多访问控制问题容易受到经过身份验证但未经授权的用户的攻击
0x02
直接使用tom cat登录
0x03
页面上没显示的属性是role和userid
0x04
填写为WebGoat/IDOR/profile/2342384 提交,意思是直接使用userid就可以查询该id的信息。
如果知道了其他用户的id,那就也可以查询信息了。
在restful风格中,提供使用同样的url,不同的方法来进行处理,可以利用这样的模式,比如修改方法,传body,看能否对某些属性做出修改。
安全的對象引用
1、要有权限控制文档。
2、水平和垂直权限控制,通常我们使用角色来进行权限控制,但是同样角色的用户,也可能获取到其他用户的信息,这就是水平权限,也需要进行控制。
3、审计。权限控制规则应该包括哪些操作应该被记录下来,如超级用户或者管理员修改了其他人的信息,应该有日志记录。
另外试图破坏权限控制机制的操作也应该记录下来。
4、使用间接引用。这个的方法用的比较少,可以hash,编码或者其他的方法,使客户端看到的id不是真实的引用对象,
这会降低一些处理效率,但是也容易被猜测,暴力破解,或者反编译。
5、权限控制API 如 JSON Web Tokens (https://jwt.io和Secure Token Binding
Missing Function Level Access Control缺少功能级别访问控制
在整个应用,方法/功能都需要做权限控制。
IDOR 与缺少功能级访问控制
很多人会将功能级访问控制和 IDOR (即不安全的直接对象引用)组合成“Access control”。但是这两者是有区别的。
最明显的区别是 IDOR 更多的是“水平”或“横向”访问控制问题,而缺少功能级别访问控制会“expose functionality”。尽管此处的 IDOR 课程演示了如何公开功能(至少向具有相同角色的其他用户),但我们将研究可能公开功能的其他方式。
Relying on obscurity
可以使用 HTML, CSS, or javascript 隐藏用户一般用不到的链接. 在过去,一个网络路由视图使用js在UI中隐藏管理员相关功能。Blogger: Time Warner Routers Still Hackable Despite Company Assurance | WIRED.
找到隐藏内容
There are usually hints to finding functionality the UI does not openly expose in:
-
HTML or javascript comments
-
Commented out elements
-
Items hidden via CSS controls/classes
作业0x02
在下面的菜单中找到攻击者/恶意用户感兴趣的两个不可见菜单项,并提交这些菜单项的标签(菜单中目前没有链接)
查看html页面,可以看到还有一个被隐藏的菜单,下面有三个li标签,每个标签有一个href。
这些href如果没有做权限控制,就可能被攻击者利用。
收集用户信息
利用权限控制漏洞,可以获取用户信息。
Often data dumps originate from vulnerabilities such as SQL injection, but they can also come from poor or lacking access control.
It will likely take multiple steps and multiple attempts to get this one:
-
Pay attention to the comments and leaked info.
-
You’ll need to do some guessing too.
-
You may need to use another browser/account along the way.
作业0x03
本题要求根据收集到的隐藏信息,找到user列表,并找到某个用户的hash值。
根据上一题的信息收集,我们得知了/users与/config链接,但是我直接访问localhost/WebGoat/users
没有任何可用的信息,一开始以为是题目问题,知道看别人的解法,请求/users时把content-type改为application/json 得到hash值。
作业0x04
要求对第二题找到的链接/WebGoat/access-control/users-admin-fix,根据这个链接,获取jerry的hash。
参考:A1-Missing Function Level Access Control - 知乎 (zhihu.com)
1、 GET方法访问这个链接,提示403,权限不够,只有admin可以访问
2、在源码里,针对这个链接还有一个post方法,可以用来设置用户的角色。
用post方法请求,将当前自己的账号设置为admin
3、然后GET方法请求
这个题的bug之处在于如果没有源码,不知道可以设置角色,那就解不出来了。
总结:对于url,method,function都要做access control,不要试图通过hide信息让用户无法访问,一旦这些信息泄露,被攻击者发现,就over了。