注意细节:寻找隐藏的IDOR漏洞
前不久,我和几个朋友打算去印度的果阿旅行,于是在skyscanner
上搜索便宜的机票。很快我就找到了目标网站,这里我们就称它是whereIDORsLive.com
,它提供了令人惊喜的机票价格。这是专注于印度和其他地方的一个大型旅游门户网站,在新加坡、迪拜和伦敦也设有办事处。由于有一些宝莱坞名人为它们做广告,所以它的关注度也很高。
注意,以下漏洞顺序是按照我找到它们的时间排列的,和严重程度无关。
1.下载其他人的机票
在机票的交易完成页面,有“SMS”、“Email”和“下载pdf”几个电子机票选项。
我选择了下载PDF格式的机票,并很快注意到下载文件名经过了编码。起初我以为它只是base64编码的,但在base64解码后(经过适当的填充)我得到了一些乱码。这种情况一般是加密后的字符串利用base64进行“顺滑”处理,这样它们就可以被打印或显示,方便应用之间进行传输。
每当我在网站上看到加密字符串,都会好奇地探索其中的算法,在我的经验中,大多数网站定义的加密算法都有不少缺陷。
而我之所以怀疑这个网站是因为该网站没有为他们的API端口使用SSL证书,仅仅是对PDF文件名称进行了“加密”,这实在不是安全的行为。接下来,我对“下载PDF”的按钮进行检查元素。
此时你一定会注意到,有一个PDF下载函数,参数貌似是预订ID。接下来我做的第一件事就是用函数调用下一个预订ID66786694
。很快我打开了相同的PDF文件,还是我预订票的文件。不管你往下载函数输入什么ID,它都会打印出当前的票。然后我仔细查看downloadPdf
函数的代码。
代码很简单,它会将预定ID号(当前为66786693)作为“tid”代入,然后经过一系列操作得到文件名。当你点击下载按钮,一个新的标签页会打开你的PDF文件:
http://api.whereIDORsLive.com/XYZService/EticketPdf/hdnBookingId.pdf
部分代码如下:
function downloadPdf(tid) {
if (document.getElementById("hdnBookingId") != null && document.getElementById("hdnBookingId").value != "")
tid = document.getElementById("hdnBookingId").value;
if (tid != null && tid != "" && tid != undefined)
window.open("http://api.whereIDORsLive.com/XYZService/EticketPdf/" + tid + ".pdf", '_blank');
}
当看到代码时,我想为什么不直接调用下载函数,为什么传递ID号有时却不使用。
我觉得这可能和遗留代码有关,在此之前,函数可能直接使用预订ID生成PDF文件。
之前的下载链接可能是这样的:
http://api.whereIDORsLive.com/XYZService/EticketPdf/bookingId.pdf
为了验证以前的服务端点是否仍然存在,我直接访问了下列链接:
http://api.whereIDORsLive.com/XYZService/EticketPdf/66786693.pdf
是的,它直接显示了PDF。通过遍历预订ID,我也可以看到其他人的票。我立即向网站的相关团队披露了此事。
为什么会这样?
可能是因为服务器后端文件仍然保存为bookingId.pdf
,其中会有一个中间件会将hdnBookingIdto
解密成bookingId
,亦或者每个票据都有两份文件,一个是hdnBookingId.pdf
,另一个是bookingId.pdf
。
2.同一家公司的不同端点
又在某一天,我开始研究这家公司的android应用,并发现流量都被路由到以下端点:
http://cloud.whereIDORsLive.in/XYZService/dboperation.svc
当时我就觉得这是一个宝藏,其中记载了所有的端点。当单击与端点对应的超链接时,你可以看到从端点获得的JSON和xml响应示例。它就像是swagger(API开发工具),甚至比那更好。
通过这些端点,我发现了一个可能导致某些信息泄漏的端点。
/GetETicket/{TransactionscreenID}/{UserName}/{Password}/{ProcessType}
这个端点需要TransactionscreenID
,UserName
和Password
。
当在app中选择票据时,这个端点就会被触发,我也看到获取票据详细信息时所需的值。
端点会以html表格的形式返回乘客的详细信息。让我们试试获取他人信息。
成功执行。现在再试试修改ProcessType
参数,我们将1改为其他值。
ProcessType=2
也许代表发票。而ProcessType=3
会引发异常,这暴露了服务器信息。
3.同一天,同一家公司,另一个端点
通过查看文档,我又发现了另一个似乎会返回敏感信息的端点。
/GetPaxBookingDetails/{TransactionscreenID}/{UserName}/{Password}
这个端点会返回客户的敏感信息(航班信息、联系电话等)。任何曾经在该公司网站上预订过机票的用户都有可能受到影响。
之所以会发生这种情况,很明显是因为端点没有任何访问控制措施,任何人都可以得到敏感信息。
其他
保持好奇心总是对的,对输入的所有参数都要探求其作用。而且手机应用和网站都一样重要,且可能存在不同的漏洞点。当然,各种提高测试效率的小工具也不可缺少。
如果你想从反编译的apk或类似的文件中爬取出所有可能存在的端点,可以试试以下命令:
grep -rE "https?://.*companyName.*" .
这应该适用于任何*nix系统以及安装了grep的系统。
如果想在chrome中进行base64编码/解码,可以试试:
atob('eW91IGxlYXJudCB0aGF0IHJpZ2h0')
btoa('this is how you encode in base64')
如果是URI解码:
decodeURIComponent('https://example.com/?query=%22this%20is%20a%20url%20encoded%20string%22')
谢谢大家阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/@aseem.shrey/attention-to-details-a-curious-case-of-multiple-idors-5a4417ba8848
最新评论