让我们谈谈直接对象引用
Kelsey Bellew //
也许您不知道“直接对象引用”是什么意思,如果您去谷歌搜索,可能会得到这样的解释:
“…直接对象引用发生在开发者暴露对内部实现对象(如文件、目录或数据库键)的引用时。如果没有访问控制检查或其他保护,攻击者可以操纵这些引用来访问未经授权的数据。”
这个描述使用“直接”、“对象”和“引用”这些词来解释“直接对象引用”。这从来都不是一个好兆头。
让我们从另一个角度来探讨这个问题。
假设有一个网站。假设这个网站上有用户。假设每个用户都有一个ID号,并且某个用户(Bob)的ID是123。假设当您查看用户Bob时,URL看起来像这样:
https://www.somesitewithusers.com/users/123
这就是一个直接对象引用。换句话说,123引用了Bob,他是一个用户。在这种情况下,用户就是对象。所以,这是一个直接对象引用。
如果您将123改为124,网站可能会显示另一个用户。如果确实如此,并且这个用户是您不应该能够看到的,那么这就是一个不安全的直接对象引用。
这里有一个真实世界的例子:
我用红色框出的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”可能是因为您点击了一个写着“Edit Profile”的按钮。但为什么是122?
还记得Bob吗?他的号码是123,您在查看他的个人资料时看到了。如果您将“/edituser/”后面的122改为123,然后点击回车……
嘿,看,是Bob!并且您看到一个按钮可以更改他的名字、用户名,也许还可以更改他的电子邮件和密码。
然后您可以保存更改。
下次您查看Bob的个人资料时,它包含了您所做的所有更改。所以,嘿,这看起来不安全,绝对是网站不应该允许您做的事情。
这不会在所有地方发生。即使您注意到一个引用用户的数字并将其更改为另一个数字,网站也可以检查您的凭据,看看您是否应该有权访问该页面,然后拒绝您的访问。网站仍然使用直接对象引用,但这些直接对象引用并不是不安全的。
所以让我们回顾一下。谷歌给我们的定义如下:
“…直接对象引用发生在开发者暴露对内部实现对象(如文件、目录或数据库键)的引用时。如果没有访问控制检查或其他保护,攻击者可以操纵这些引用来访问未经授权的数据。”
开发者是制作网站的人。“内部实现对象”可能是用户或漫画之类的东西。我们讨论的唯一引用是URL中的一个数字,但引用也可以是其他东西,并且在其他位置。它可能是漫画的名称,或者用户文件中的某个唯一信息,也许是他们的用户名或电子邮件。引用可能在HTTP请求中。访问未经授权的数据指的是某人像更改Bob的个人资料而没有以Bob身份登录的情况。
如果您无法对找到的某些页面进行任何更改,比如上面的漫画例子呢?那时它是否不安全?如果您无法进行更改,那么问题是什么?
这里有一个问题:HIPAA。
如果 instead of being able to change Bob’s profile you can just learn what his email and home address are, that’s one thing. It’s a bad thing.
但假设您在一个包含患者信息的Web应用程序中。您只能点击医院数据库内的患者;但然后您注意到,当您点击您知道是按顺序创建的患者记录时,URL中的数字是124466和124470。这看起来不对,所以您将其改为124467看看发生了什么。相反,您最终查看了一个不在您医院的患者文档。这是一件更糟糕的事情。
所有这些都是因为开发者决定存储数据的方式。您无法点击该患者,因为它不在您的访问范围内,但即便如此,没有什么能阻止您递增一百二十万条患者记录。这违反了HIPAA,这是非常非法的。
还有许多其他类型的直接对象引用,不安全的和其他类型的。有充分的理由使用直接对象引用(漫画),也有充分的理由绝对不使用直接对象引用(患者信息)。下次当您在URL中看到似乎是任意数字时,请思考一下。