深入浅出:直接对象引用及其安全风险

本文通过通俗易懂的示例解释了直接对象引用的概念,分析了其在Web应用中的安全风险,特别是涉及用户数据篡改和HIPAA违规的场景,帮助开发者理解并防范此类漏洞。

让我们谈谈直接对象引用

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。

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

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

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

还有许多其他类型的直接对象引用,不安全的和其他。有很好的理由使用直接对象引用(漫画),也有很好的理由绝对不使用直接对象引用(患者信息)。下次你在URL中看到似乎是任意数字时,想一想。


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

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