注意细节:寻找隐藏的IDOR漏洞

iso60001  1723天前

22.jpg

前不久,我和几个朋友打算去印度的果阿旅行,于是在skyscanner上搜索便宜的机票。很快我就找到了目标网站,这里我们就称它是whereIDORsLive.com,它提供了令人惊喜的机票价格。这是专注于印度和其他地方的一个大型旅游门户网站,在新加坡、迪拜和伦敦也设有办事处。由于有一些宝莱坞名人为它们做广告,所以它的关注度也很高。

注意,以下漏洞顺序是按照我找到它们的时间排列的,和严重程度无关。

1.下载其他人的机票

在机票的交易完成页面,有“SMS”、“Email”和“下载pdf”几个电子机票选项。

33.png

我选择了下载PDF格式的机票,并很快注意到下载文件名经过了编码。起初我以为它只是base64编码的,但在base64解码后(经过适当的填充)我得到了一些乱码。这种情况一般是加密后的字符串利用base64进行“顺滑”处理,这样它们就可以被打印或显示,方便应用之间进行传输。

44.png

每当我在网站上看到加密字符串,都会好奇地探索其中的算法,在我的经验中,大多数网站定义的加密算法都有不少缺陷。

而我之所以怀疑这个网站是因为该网站没有为他们的API端口使用SSL证书,仅仅是对PDF文件名称进行了“加密”,这实在不是安全的行为。接下来,我对“下载PDF”的按钮进行检查元素。

55.png

此时你一定会注意到,有一个PDF下载函数,参数貌似是预订ID。接下来我做的第一件事就是用函数调用下一个预订ID66786694。很快我打开了相同的PDF文件,还是我预订票的文件。不管你往下载函数输入什么ID,它都会打印出当前的票。然后我仔细查看downloadPdf函数的代码。

66.png

代码很简单,它会将预定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,我也可以看到其他人的票。我立即向网站的相关团队披露了此事。

77.png

88.png


为什么会这样?

可能是因为服务器后端文件仍然保存为bookingId.pdf,其中会有一个中间件会将hdnBookingIdto解密成bookingId,亦或者每个票据都有两份文件,一个是hdnBookingId.pdf,另一个是bookingId.pdf

2.同一家公司的不同端点

又在某一天,我开始研究这家公司的android应用,并发现流量都被路由到以下端点:

http://cloud.whereIDORsLive.in/XYZService/dboperation.svc

99.png

当时我就觉得这是一个宝藏,其中记载了所有的端点。当单击与端点对应的超链接时,你可以看到从端点获得的JSON和xml响应示例。它就像是swagger(API开发工具),甚至比那更好。

通过这些端点,我发现了一个可能导致某些信息泄漏的端点。

/GetETicket/{TransactionscreenID}/{UserName}/{Password}/{ProcessType}

这个端点需要TransactionscreenIDUserNamePassword

100.png

当在app中选择票据时,这个端点就会被触发,我也看到获取票据详细信息时所需的值。

110.png

端点会以html表格的形式返回乘客的详细信息。让我们试试获取他人信息。

120.png

成功执行。现在再试试修改ProcessType参数,我们将1改为其他值。

130.png

ProcessType=2也许代表发票。而ProcessType=3会引发异常,这暴露了服务器信息。

140.png

3.同一天,同一家公司,另一个端点

通过查看文档,我又发现了另一个似乎会返回敏感信息的端点。

/GetPaxBookingDetails/{TransactionscreenID}/{UserName}/{Password}

这个端点会返回客户的敏感信息(航班信息、联系电话等)。任何曾经在该公司网站上预订过机票的用户都有可能受到影响。

150.png

160.png

170.png

之所以会发生这种情况,很明显是因为端点没有任何访问控制措施,任何人都可以得到敏感信息。

其他

保持好奇心总是对的,对输入的所有参数都要探求其作用。而且手机应用和网站都一样重要,且可能存在不同的漏洞点。当然,各种提高测试效率的小工具也不可缺少。

如果你想从反编译的apk或类似的文件中爬取出所有可能存在的端点,可以试试以下命令:

grep -rE "https?://.*companyName.*" .

这应该适用于任何*nix系统以及安装了grep的系统。

180.png

如果想在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

最新评论

昵称
邮箱
提交评论