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/<user_id>/ --> 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" :<id_1>,"user_id" :<id_2>}
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链接到新密码的界面,输入密码重置成功。
5、未校验用户字段的值
造成原因:在整个重置密码的流程中,只对验证码和手机号做了校验,未对后面设置新密码的用户身份做半判断,导致在最后一步通过修改用户身份来重置他人的密码。
测试方法:使用自己的手机号走流程,在走到最后一个设置密码的流程时,修改数据包里的用户信息。
6、cookie值的替换
造成原因:重置密码走到最后一步的时候仅判断唯一的用户标识cookie是否存在并没有判断该cookie有没有通过之前重置
密码过程的验证,导致可替换cookie重置他人用户密码。(cookie可指定用户获取)
测试方法:重置自己用户密码到达最后阶段,抓到数据包,并在第一阶段重新获取目标用户cookie,替换cookie?到我们抓取的数据包中,发包测试。
7、修改信息时替换字段信息
造成原因:邮箱重置密码或者手机号码重置密码的时候,请求中没有明显的身份标识,可以尝试增加参数值来测试是否存在MVC数据对应自动绑定漏洞。比如增加email参数及对应的自用邮箱作为参数值,看看是否能收到密码重置链接。有关这个漏洞可以看看carry_your师傅视频中的案例,以及CF_HB发过的案例,也可以看看CplusHua有关模糊测试的ppt。
测试方法:修改个人资料的时候,抓取数据包,然后来修改数据包的参数和对应的值,参数名一般可以在其他地方找到,替换隐藏参数即可修改他人的密码等信息。
案例:
然后抓包查看参数信息
查看下这个页面的源代码,找到了一个参数loginld,这个参数是对应用户身份的,而我们发现上面的数据包里没有这个参数,那么我们是否可以自己添加上去呢?
8、任意邮箱用户重置
利用国际化域名(IDN)进行密码重置:https://www.punycoder.com/
我们假设目标网站地址为https://axin.com
,本次存在漏洞的接口为https://axin.com/forget-password?email=
,可以看到,这是一个再普通不过的通过邮箱重置密码的功能点,但是这个接口没能正确的处理Unicode字符,也就是说,当我输入邮箱victim@gmáil.com
会被规范化为victim@gmail.com
,然后目标站点axin.com
就会把victim@gmail.com
用户的重置密码链接发送到邮箱victim@xn--gmil-6na.com
中,其中xn--gmil-6na.com
是gmáil.com
的punnycode
所以,只要我去注册gmáil.com
域名,并搭建一个邮件服务器就能够完成攻击。
当然测试的时候不需要去注册邮箱这么麻烦,只需要这几步。
- 到目标站点用邮箱
victim@gmail.com.3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net
注册一个测试账号 - 然后在重置密码的接口处输入含有Unicode字符的邮箱地址:
victim@gmáil.com.3bfqygorkwzimx55ppnmvkandej47t.burpcollaborator.net
,发送 - 如果目标存在漏洞,我们就可以在collobrator client上看到目标站点发送给我们的
victim@gmail.com
用户的重置密码链接了
9、session覆盖
例如:https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2014-085843
在忘记密码的功能处通过自己账号忘记密码发送邮箱修改密码地址,然后收到邮箱的链接地址不要打开,需要在同浏览器内打开网站还是忘记密码输入要修改的账号,进行到同样的步骤,然后打开我们的邮箱链接,就可以修改他人用户的密码。
四、交易金额篡改
1、直接修改交易金额
按照流程完成校验,然后在跳转支付的最后一步,修改支付金额。由于未对具体金额校验,支付成功之后可以获取商品。
2、正负值对冲
同时购买多个物品,部分商品数量改为负数,然后总金额会小于实际应付款金额。
3、商品id修改
商品价格检测和付款校验是分布进行的,首先利用低价A商品绕过商品价格检测,然后替换商品id进行B商品的购买,可以利用低价购买B商品。
4、利用多平台数据不同步的特性,进行支付绕过
案例:肯德基
利用肯德基APP客户端和微信客户端之间的数据不同步,首先在其中一个客户端用套餐兑换券下单待支付,在另一个客户端操作对兑换券退款,退款之后把订单取消可以重新获取一个兑换券,也可以再退款之后使用优惠券获得取餐码。