在Web应用安全测试中,不安全的直接对象引用 是一个常见但容易被低估的漏洞。除了常规的ID递增测试外,攻击者和安全研究员在实践中也发现了一些新颖的绕过思路,这些思路往往针对后端验证逻辑的特定实现缺陷。本文将介绍四种实战中易被忽略的IDOR检测技巧。
1. 前导零绕过
原理:部分后端系统在校验资源ID时,会先将参数字符串转换为数字类型,或在进行比对时忽略前导零,导致009与9被视为同一个ID。
示例:
假设攻击者的用户ID为10,正常情况下只能访问 /api/users/10。直接尝试访问 /api/users/9 会被拒绝。然而,尝试访问以下路径可能成功:
GET /api/users/009
某些后端语言(如PHP、Python)在类型转换时会将字符串 "009" 解析为整数 9。如果权限验证环节使用了转换后的值进行判断,而数据查询环节使用了原始字符串或进行了不同的处理,就可能绕过验证,泄露用户9的信息。
2. URL编码空格绕过
原理:部分系统未能正确处理URL编码,或在对请求路径进行验证时,未对%20(空格的URL编码)进行规范化处理,导致其被忽略。
示例:
GET /api/users/9%20
如果后端权限验证逻辑没有对路径进行严格的解码和匹配,可能会将 "9%20" 错误地解析或匹配为 "9",从而绕过访问控制,成功获取目标数据。
3. 类型混淆绕过
原理:当API的验证逻辑与数据处理逻辑存在类型不一致时,可能产生漏洞。例如,权限校验使用字符串比对,而数据库查询使用整数ID,在弱类型比较下可能被绕过。
示例:
GET /api/users/"9"
在某些弱类型语言(如PHP、JavaScript)中,使用==进行比较时,字符串 "9" 与整数 9 会被判定为相等(true)。如果验证环节采用了这种宽松比较,而后续环节类型严格,则可能造成权限绕过。
4. 十六进制或哈希值绕过
原理:后端可能接受资源的十六进制表示形式或哈希值(如MD5、SHA1)作为查询参数,但未将传入的替代ID与当前用户身份进行绑定校验。
示例:
正常请求:
GET /api/users/123
绕过尝试:
GET /api/users/0x7B # 十六进制表示123(0x7B = 7*16+11=123)
GET /api/users/202cb962ac59075b964b07152d234b70 # 123的MD5哈希值
如果后端接收到这些参数后,仅仅将其解码或还原为原始ID 123,然后直接查询数据库,而没有再次校验当前登录用户是否有权访问ID为123的资源,就会导致越权信息泄露。这提醒开发者在涉及资源访问时,必须进行严格的权限验证,这是安全开发的核心实践之一。
总结与防御建议
以上几种思路的核心,均在于后端对用户输入的处理逻辑不一致或验证不充分。要有效防御此类IDOR漏洞,开发者应在整个请求处理链路中保持一致的资源标识符处理方式,并在数据访问层实施基于会话或令牌的强制权限检查,而非仅仅依赖前端传入的ID值。对于安全测试人员而言,在测试Web安全漏洞时,应拓宽测试边界,尝试多种参数变形和编码方式,以发现更深层的逻辑缺陷。
|