IDOR漏洞

IDOR漏洞

一、概述

IDOR,Insecure Direct Object reference,即"不安全的直接对象引用",场景为基于用户提供的输入对象进行访问时,未进行权限验证,是一类访问控制漏洞。在OWASP API安全前10名的API漏洞中排名第一。IDOR漏洞其实在越权(Broken Access Control)漏洞的范畴之内,也可以说是逻辑漏洞,或是访问控制漏洞,国内通常被称为越权漏洞。

二、权限绕过

1.改变HTTP请求方法

如果某个请求方法无效,那么可以试试其它方法,如GET, POST, PUT, DELETE, PATCH…等,一个通常的技巧就是用GET和POST进行互换,原因在于服务端的访问控制措施不够完善。

GET /users/delete/VICTIM_ID  --> 403 Forbidden
POST /users/delete/VICTIM_ID  --> 200 OK

2.路径穿越绕过

POST /users/delete/VICTIM_ID  -->  403 Forbidden
POST /users/delete/MY_ID/../VICTIM_ID --> 200 OK
POST /users/delete/..;/delete/VICTIM_ID --> 200 OK
POST /users/delete/.;/VICTIM_ID --> 200 OK
POST /users/delete/hello/%3baaaa/VICTIM_ID --> 200 OK

3.改变Content-type(内容类型)

Content-type: application/xml  -->  Content-type: application/json

4.更换参数类型

例如将字符类型的请求替换为数值型

GET /file?id=90ri2xozifke29ikedawOd
GET /file?id=302

将请求值替换为数组类型

{"id":111} --> 401 Unauthriozied
{"id":[111]}  --> 200 OK

5.大小写替换绕过

GET /admin/profile --> 401 Unauthorized
GET /ADMIN/profile --> 200 OK

6.用通配符替换ID

GET /api/users// --> GET /api/users/*

7.给Web应用提供一个请求ID

如果Web应用在请求动作中没有ID号要求,那么可以尝试给它添加一个ID号看看会发生什么。比如添加一个随机ID号、用户ID、会话ID,或是其它的对象引用参数,观察服务端的响应内容。

GET /api_v1/messages --> 200 OK
GET /api_v1/messages?user_id=victim_uuid --> 200 OK

8.HTTP参数污染

用HTTP参数污染方式针对同一参数去给它多个不同的值,这样也是可以导致IDOR漏洞的。因为Web应用可能在设计时不会料想到用户会为某个参数提交多个不同值,因此,有时可能会导致Web后端接口的访问权限绕过。

GET /api_v1/messages?user_id=ATTACKER_ID&user_id=VICTIM_ID
GET /api_v1/messages?user_id=VICTIM_ID&user_id=ATTACKER_ID

GET /api_v1/messages?user_id[]=ATTACKER_ID&user_id[]=VICTIM_ID
GET /api_v1/messages?user_id[]=VICTIM_ID&user_id[]=ATTACKER_ID

json格式也可以进行尝试

POST /api/get_profile
Content-Type: application/json
{"user_id" :,"user_id" :}

9.更改文件类型

切换请求文件的类型可能会导致Web服务端在授权处理上发生不同,如在请求URL后加上一个.json,看看响应结果如何。可以尝试不同的后缀名字,判断回显(例如.json .xml .config .zip)

GET /user_data/123 --> 401 Unauthorized
GET /user_data/123.json --> 200 OK

10.尝试不同版本的API

GET /v2/users_data/1234 --> 403 Forbidden
GET /v1/users_data/1234 --> 200 OK

三、任意密码重置

1、验证码未绑定用户

造成原因:输入手机号和验证码进行重置密码的时候,仅对验证码是否正确进行了判断,未对该验证码是否与手机号匹配做验证。
测试方法:在提交手机号和验证码的时候替换手机号为他人手机号进行测试,成功通过验证并重置他人密码。

2、修改接收的手机或邮箱

造成原因:用户名、手机号、验证码三者没有统一进行验证,仅判断了三者中的手机号和验证是否匹配和正确,如果正确则判断成功并进入下一流程。
测试方法:输入用户名获取验证码,修改接收验证码的手机号为自己的号码,自己手机成功接收验证码,提交到网站进行验证,验证成功并进入下一流程。

3、本地验证绕过

造成原因:客户端在本地进行验证码是否正确的判断,而该判断结果也可以在本地修改,最终导致欺骗客户端,误以为我们已经输入了正确的验证码。
测试方法:重置目标用户,输入错误验证码,修改返回包,把错误改为正确,即可绕过验证步骤,最终重置用户密码。

4、跳过验证步骤

造成原因:对修改密码的步骤,没有做校验导致可以直接输入最终修改密码的网址,直接跳转到该页面,然后输入新密码达到重置密码
的目的。
测试方法:首先使用自己的账号走一次流程获取每个步骤的页面链接,然后记录页面3对应的输入新密码的链接,重置他人用户时,获取验证码后,直接输入页面3链接到新密码的界面,输入密码重置成功。

IDOR漏洞_第1张图片

5、未校验用户字段的值

造成原因:在整个重置密码的流程中,只对验证码和手机号做了校验,未对后面设置新密码的用户身份做半判断,导致在最后一步通过修改用户身份来重置他人的密码。
测试方法:使用自己的手机号走流程,在走到最后一个设置密码的流程时,修改数据包里的用户信息。

6、cookie值的替换

造成原因:重置密码走到最后一步的时候仅判断唯一的用户标识cookie是否存在并没有判断该cookie有没有通过之前重置
密码过程的验证,导致可替换cookie重置他人用户密码。(cookie可指定用户获取)
测试方法:重置自己用户密码到达最后阶段,抓到数据包,并在第一阶段重新获取目标用户cookie,替换cookie?到我们抓取的数据包中,发包测试。

IDOR漏洞_第2张图片

7、修改信息时替换字段信息

造成原因:邮箱重置密码或者手机号码重置密码的时候,请求中没有明显的身份标识,可以尝试增加参数值来测试是否存在MVC数据对应自动绑定漏洞。比如增加email参数及对应的自用邮箱作为参数值,看看是否能收到密码重置链接。有关这个漏洞可以看看carry_your师傅视频中的案例,以及CF_HB发过的案例,也可以看看CplusHua有关模糊测试的ppt。
测试方法:修改个人资料的时候,抓取数据包,然后来修改数据包的参数和对应的值,参数名一般可以在其他地方找到,替换隐藏参数即可修改他人的密码等信息。

案例:

IDOR漏洞_第3张图片

然后抓包查看参数信息

IDOR漏洞_第4张图片

查看下这个页面的源代码,找到了一个参数loginld,这个参数是对应用户身份的,而我们发现上面的数据包里没有这个参数,那么我们是否可以自己添加上去呢?

IDOR漏洞_第5张图片

IDOR漏洞_第6张图片

8、任意邮箱用户重置

利用国际化域名(IDN)进行密码重置:https://www.punycoder.com/

我们假设目标网站地址为https://axin.com,本次存在漏洞的接口为https://axin.com/forget-password?email=,可以看到,这是一个再普通不过的通过邮箱重置密码的功能点,但是这个接口没能正确的处理Unicode字符,也就是说,当我输入邮箱victim@gmáil.com会被规范化为[email protected],然后目标站点axin.com就会把[email protected]用户的重置密码链接发送到邮箱[email protected]中,其中xn--gmil-6na.comgmáil.com的punnycode

所以,只要我去注册gmáil.com域名,并搭建一个邮件服务器就能够完成攻击。

当然测试的时候不需要去注册邮箱这么麻烦,只需要这几步。

  • 到目标站点用邮箱victim@gmail.com.3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net注册一个测试账号
  • 然后在重置密码的接口处输入含有Unicode字符的邮箱地址:victim@gmáil.com.3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net,发送
  • 如果目标存在漏洞,我们就可以在collobrator client上看到目标站点发送给我们的[email protected]用户的重置密码链接了

9、session覆盖

例如:https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2014-085843

在忘记密码的功能处通过自己账号忘记密码发送邮箱修改密码地址,然后收到邮箱的链接地址不要打开,需要在同浏览器内打开网站还是忘记密码输入要修改的账号,进行到同样的步骤,然后打开我们的邮箱链接,就可以修改他人用户的密码。

四、交易金额篡改

1、直接修改交易金额

按照流程完成校验,然后在跳转支付的最后一步,修改支付金额。由于未对具体金额校验,支付成功之后可以获取商品。

2、正负值对冲

同时购买多个物品,部分商品数量改为负数,然后总金额会小于实际应付款金额。

3、商品id修改

商品价格检测和付款校验是分布进行的,首先利用低价A商品绕过商品价格检测,然后替换商品id进行B商品的购买,可以利用低价购买B商品。

4、利用多平台数据不同步的特性,进行支付绕过

案例:肯德基

利用肯德基APP客户端和微信客户端之间的数据不同步,首先在其中一个客户端用套餐兑换券下单待支付,在另一个客户端操作对兑换券退款,退款之后把订单取消可以重新获取一个兑换券,也可以再退款之后使用优惠券获得取餐码。

参考文章

越权漏洞测试技巧

IODR案例总结

你可能感兴趣的:(安全)