测试不安全的直接对象引用
ID |
---|
WSTG-ATHZ-04 |
总结
当应用程序根据用户提供的输入提供对对象的直接访问时,会发生不安全的直接对象引用 (IDOR)。由于此漏洞,攻击者可以绕过授权并直接访问系统中的资源,例如数据库记录或文件。
不安全的直接对象引用允许攻击者通过修改用于直接指向对象的参数的值来绕过授权并直接访问资源。此类资源可以是属于其他用户的数据库条目、系统中的文件等。这是因为应用程序采用用户提供的输入并使用它来检索对象,而没有执行足够的授权检查。
测试目标
- 确定可能出现对象引用的点。
- 评估访问控制措施以及它们是否容易受到 IDOR 的攻击。
如何测试
为了测试此漏洞,测试人员首先需要绘制出应用程序中使用用户输入直接引用对象的所有位置。例如,使用用户输入访问数据库行、文件、应用程序页面等的位置。接下来,测试人员应该修改用于引用对象的参数值,并评估是否可以检索属于其他用户的对象或以其他方式绕过授权。
测试直接对象引用的最佳方法是让至少两个(通常是更多)用户来覆盖不同的拥有的对象和函数。例如,两个用户都有权访问不同的对象(例如购买信息、私人消息等),以及具有不同权限的用户(例如管理员用户),以查看是否有对应用程序功能的直接引用。通过拥有多个用户,测试人员可以节省宝贵的测试时间来猜测不同的对象名称,因为他可以尝试访问属于其他用户的对象。
以下是此漏洞的几种典型场景以及每种漏洞的测试方法:
参数的值直接用于检索数据库记录
示例请求:
http://foo.bar/somepage?invoice=12345
在这种情况下,invoice 参数的值用作数据库 invoices 表中的索引。应用程序获取此参数的值,并在对数据库的查询中使用它。然后,应用程序将发票信息返回给用户。
由于 invoice 的值直接进入查询,因此通过修改参数的值,可以检索任何 invoice 对象,而不管 invoice 属于哪个用户。为了测试这种情况,测试人员应该获取属于不同测试用户的 invoice 的标识符(确保他不应该根据应用程序业务逻辑查看此信息),然后检查是否可以在未经授权的情况下访问对象。
参数的值直接用于在系统中执行操作
示例请求:
http://foo.bar/changepassword?user=someuser
在这种情况下,参数 user
的值用于告诉应用程序它应该为哪个用户更改密码。在许多情况下,此步骤将是向导的一部分,或者是多步骤操作。在第一步中,应用程序将收到一个请求,说明要更改哪个用户的密码,在下一步中,用户将提供新密码(不询问当前密码)。
user
参数用于直接引用将对其执行密码更改操作的用户的对象。要测试这种情况,测试人员应该尝试提供与当前登录的用户名不同的测试用户名,并检查是否可以修改其他用户的密码。
参数的值直接用于检索文件系统资源
示例请求:
http://foo.bar/showImage?img=img00011
在这种情况下, file
参数的值用于告诉应用程序用户要检索的文件。通过提供不同文件的名称或标识符(例如 file=image00012.jpg),攻击者将能够检索属于其他用户的对象。
为了测试这种情况,测试人员应该获取一个用户不应该能够访问的引用,并尝试将其用作 file
参数的值来访问它。注意:此漏洞通常与目录/路径遍历漏洞一起利用(请 参阅路径遍历测试file)
参数的值直接用于访问应用程序功能
示例请求:
http://foo.bar/accessPage?menuitem=12
在这种情况下,menuitem
参数的值用于告诉应用程序用户正在尝试访问哪个菜单项(以及哪个应用程序功能)。假设用户应该受到限制,因此具有只能访问菜单项 1、2 和 3 的链接。通过修改 menuitem
参数的值,可以绕过授权并访问其他应用程序功能。为了测试这种情况,测试人员确定一个位置,在该位置,应用程序功能是通过引用菜单项来确定的,映射给定测试用户可以访问的菜单项的值,然后尝试其他菜单项。menuitemmenuitem
在上面的示例中,修改单个参数就足够了。但是,有时对象引用可能会在多个参数之间拆分,因此应相应地调整测试。