深入解析不安全的直接对象引用(IDOR)漏洞

本文通过生动实例详细解释了直接对象引用(DOR)的概念及其安全风险,特别分析了不安全的直接对象引用(IDOR)漏洞如何导致未授权数据访问,并结合HIPAA合规要求说明医疗数据场景下的严重危害。

让我们聊聊直接对象引用

Kelsey Bellew //

也许您不知道"直接对象引用"是什么意思,如果去谷歌搜索,会得到这样的定义:

“当开发人员暴露对内部实现对象(如文件、目录或数据库键)的引用时,就会发生直接对象引用。如果没有访问控制检查或其他保护措施,攻击者可以操纵这些引用来访问未授权数据。”

这个描述用"直接"、“对象"和"引用"这些词来解释"直接对象引用”,这从来都不是个好兆头。

让我们换个角度来理解。

假设有一个网站,网站上有用户,每个用户都有一个ID号,比如用户Bob的ID是123。当您查看用户Bob时,URL看起来像这样: https://www.somesitewithusers.com/users/123

这就是直接对象引用。换句话说,123引用了Bob这个用户对象。

如果您将123改为124,网站可能会显示不同的用户。如果确实如此,而且这个用户是您不应该看到的,那么这就是不安全的直接对象引用。

这里有一个真实世界的例子:

XKCD漫画示例

我用红色标出的1133就是这个特定漫画的直接引用。如果您更改这个数字,就会改变您正在查看的漫画。

证明(我将1133改为113,得到了不同的漫画):

修改后的漫画

好的,您可能觉得自己明白了。这里的对象是漫画,引用是数字(1133或113)。那么这是"不安全的直接对象引用"吗?

有什么理由您不应该看到这个漫画吗?或者通过这种方法能访问到其他无法通过其他方式访问的漫画?

如果您在浏览这个网站时注意观察,会发现每次点击"Next"按钮时,数字都会增加1。113变成114。如果点击"Prev"按钮,113变成112。因为它们是按顺序排列的,所以通过更改URL中的数字所能访问的页面,都可以通过点击页面上的按钮来访问。

让我们回到第一个例子,那个有用户的网站。假设不是查看Bob的个人资料,而是点击编辑个人资料的按钮。您看到URL变成了: https://www.somesitewithusers.com/edituser/122

这看起来很有趣。看到那个122了吗?为什么在编辑个人资料时会有数字?“somesitewithusers.com"是网站。“edituser"可能是因为您点击了"编辑资料"按钮。但为什么是122?

还记得Bob吗?他的号码是123,您在查看他的资料时看到了。如果您将”/edituser/“后面的122改为123,然后按回车…

看,是Bob!您可以看到更改他的名字、用户名、电子邮件和密码的按钮。

然后您可以保存更改。

下次查看Bob的个人资料时,它会显示您所做的所有更改。这看起来很不安全,绝对是网站不应该允许您做的事情。

这种情况不会在所有地方发生。即使您注意到一个引用用户的数字并将其更改为另一个数字,网站也可以检查您的凭据,看看您是否应该有权访问该页面,然后拒绝您的访问。网站仍然使用直接对象引用,但这些直接对象引用并不是不安全的。

让我们回顾一下。谷歌给我们的定义是:

“…当开发人员暴露对内部实现对象(如文件、目录或数据库键)的引用时,就会发生直接对象引用。如果没有访问控制检查或其他保护措施,攻击者可以操纵这些引用来访问未授权数据。”

开发人员是制作网站的人。“内部实现对象"可以是用户或漫画之类的东西。我们讨论的唯一引用是URL中的数字,但引用也可以是其他东西,也可以在其他地方。它可能是漫画的名称,也可能是用户文件中的某些独特信息,比如他们的用户名或电子邮件。引用可能在HTTP请求中。访问未授权数据指的是某人像更改Bob的个人资料而没有以Bob身份登录这样的情况。

如果您无法对找到的某些页面进行任何更改,比如上面的漫画例子?那样还算是 insecure 吗?如果您无法进行更改,那又有什么问题呢?

这里有一个问题:HIPAA(健康保险携带和责任法案)。

如果您无法更改Bob的个人资料,但可以了解他的电子邮件和家庭地址,这是一回事。这是一件坏事。

但假设您在一个包含患者信息的Web应用程序中。您只能点击医院数据库中的患者;但随后您注意到,当您点击您知道是按顺序创建的患者记录时,URL中的数字是124466和124470。这看起来不对,所以您将其改为124467看看情况。结果,您最终查看了一个不在您医院的患者文档。这是一件更糟糕的事情。

这一切都是因为开发人员决定存储数据的方式。您无法点击该患者,因为它不在您的访问范围内,但即便如此,没有什么能阻止您递增十二万条患者记录。这违反了HIPAA,这是非常非法的。

还有许多其他类型的直接对象引用,包括不安全的和其他类型的。有充分的理由使用直接对象引用(漫画),也有充分的理由绝对不使用直接对象引用(患者信息)。下次当您在URL中看到似乎是任意数字时,请思考一下这个问题。


https://www.youtube.com/watch?v=ydrtF45-y-g

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计