跳到内容

不安全直接对象引用防范速查表

简介

不安全直接对象引用 (IDOR) 是一种漏洞,当攻击者通过操纵 Web 应用程序 URL 或参数中使用的标识符来访问或修改对象时就会产生。它的发生是由于缺少访问控制检查,未能验证用户是否应该被允许访问特定数据。

示例

例如,当用户访问其个人资料时,应用程序可能会生成一个如下所示的 URL

https://example.org/users/123

URL 中的 123 是对数据库中用户记录的直接引用,通常由主键表示。如果攻击者将此数字更改为 124 并获取了另一个用户的信息,则应用程序易受不安全直接对象引用漏洞的攻击。发生这种情况是因为应用程序在显示用户 124 的数据之前,未正确检查该用户是否有权查看该数据。

在某些情况下,标识符可能不在 URL 中,而是在 POST 正文中,如以下示例所示

<form action="/update_profile" method="post">
  <!-- Other fields for updating name, email, etc. -->
  <input type="hidden" name="user_id" value="12345">
  <button type="submit">Update Profile</button>
</form>

在此示例中,应用程序允许用户通过提交一个表单来更新其个人资料,该表单在隐藏字段中包含用户 ID。如果应用程序未在服务器端执行适当的访问控制,攻击者可以操纵“user_id”字段,从而未经授权修改其他用户的个人资料。

标识符复杂度

在某些情况下,使用更复杂的标识符(如 GUID)可以使攻击者实际上不可能猜测出有效值。但是,即使使用复杂的标识符,访问控制检查仍然至关重要。如果攻击者获得了未经授权的对象的 URL,应用程序仍应阻止其访问尝试。

缓解措施

为了缓解 IDOR,请对用户尝试访问的每个对象实施访问控制检查。Web 框架通常提供便利此操作的方法。此外,使用复杂的标识符作为深度防御措施,但请记住,即使使用这些标识符,访问控制也至关重要。

如果可能,避免在 URL 和 POST 正文中暴露标识符。而是从会话信息中确定当前经过身份验证的用户。在使用多步流程时,在会话中传递标识符以防止篡改。

根据主键查找对象时,使用用户有权访问的数据集。例如,在 Ruby on Rails 中

// vulnerable, searches all projects
@project = Project.find(params[:id])
// secure, searches projects related to the current user
@project = @current_user.projects.find(params[:id])

每次尝试访问时都验证用户的权限。使用您的 Web 框架的推荐方法进行结构化实现。

作为额外的深度防御措施,将可枚举的数字标识符替换为更复杂、随机的标识符。您可以通过在数据库表中添加一列随机字符串,并在 URL 中使用这些字符串而不是数字主键来实现。另一种选择是使用 UUID 或其他长随机值作为主键。避免加密标识符,因为安全地进行加密可能具有挑战性。