在这篇文章中,我将跟大家介绍如何利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息。在过去的一年半时间里,我一直都在对雅虎平台的安全性进行分析,而本文所要描述的内容也是我在这段时间里所得到的成果之一。

利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息

挖洞过程

在前期的侦察过程中,我首先想要知道的就是服务器端都运行着哪些东西。虽然这并不能直接让我拿到漏洞奖金,但这些信息可以帮助我识别公开的已知漏洞,或者在之后的漏洞利用过程中帮到我。

我们的测试目标是雅虎的小型企业服务平台,经过一段时间的分析之后,我首先找到了一个包含错误配置的页面,然后通过分析网络请求发现了其用户控制面板运行的是NodeJS,并且还对外暴露了一个模板。需要注意的是,这个模板本来应该是在客户端执行的,但这里却在服务器端执行了。

既然我们已经知道了该网站的控制面板部分运行的是NodeJS,那么我们就可以直接进行测试而不必绕弯路了。

在购买了订阅服务之后,我发现了一个有意思的页面。这个简单的页面负责给用显示PDF格式的发票信息,当用户点击了“Download”下载按钮之后,便可以查看自己的账单信息了。

利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息

查看PDF的节点如下:

https://www.luminate.com/my-services/invoices/INV08179455/pdf

一般来说,在面对这种节点地址时,我们首先会尝试修改其中的“INV08179455”参数。如果这里存在IDOR漏洞的话,那我们就可以查看其他人的账单信息了。

那么第一个问题就来了,这里为什么使用的是“PDF文件名/pdf”而不是“PDF文件名.pdf”呢?这很可能是因为网站在将PDF提供给用户之前,需要验证该账单确实属于发起请求的用户。听起来貌似是这样的,但随着我们不断地深入分析,这一猜想也被推翻了。

由于我们已经知道了服务器端运行了NodeJS,那我就可以尝试调用一些特殊参数来进行测试了,例如:

NodeJS "/view/ID"(这跟 PHP的"/view.php?id=ID"是一样的)

那么接下来,我们就可以向服务器发送一些数据并尝试让系统做一些它本不该做的事情了。在研究了几分钟与SQL注入有关的控制字符之后,我对网站的源代码也进行了分析,并以此来确保浏览器在请求PDF文件时不会进行其他不必要的函数调用。分析之后我得到了以下结论:

https://www.luminate.com/my-services/invoices/.%2fINV08179455/pdf https://www.luminate.com/my-services/invoices/INV08179455/pdf

这两个HTTP请求返回的是相同的结果。虽然很多Web服务器会直接将”.%2f”当作”./”来处理,并且最终返回相同的目录以及参数,但NodeJS会将”.%2f”当作实际的发票ID目录参数来处理。如果真是这样的话,这就说明系统会使用发票ID目录参数来获取某些文件内容以显示PDF给用户,而用户可以提供”.%2″或者”..%2f”来指定需要提取的目录。为了证实这一点,我们可以发送下列请求:

https://www.luminate.com/my-services/invoices/..%2fINV08179455/pdf

果不其然,系统返回了“404-not found”,因为这是一个无效的PDF参数。为了进一步确认,我还需要找到PDF文件真正所在的目录,这也就意味着我需要进行“暴力破解”了。此处省略一万字…最终我还是找到了我的PDF:

https://www.luminate.com/my-services/invoices/..%2finvoices%2fINV08179455/pdf

利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息

不知道你是否注意到了地址中“invoices”之前的目录?接下来,我又发送了如下请求:

https://www.luminate.com/my-services/invoices/..%2f..%2fmy-services%2finvoices%2fINV08179455/pdf

这个请求同样返回了“404-not found”,这也意味着服务器很可能在尝试从一个名叫“invoices”的文件夹中获取文件。思考片刻之后,我认为服务器很可能使用了某种字符串识别信息(例如账号ID或电子邮箱)来给用户创建专门的文件夹,之后再通过索引来从中获取用户的文件。这样的话,当用户正常调用该节点时,则需要提供“accountID/invoices/ID”并禁止他人通过修改ID号来查看他人的账单PDF。下面给出的是一些失败的请求尝试:


https://www.luminate.com/my-services/invoices/..%2f..%2fsamwcurry@gmail.com%2finvoices%2fINV08179455/pdf

https://www.luminate.com/my-services/invoices/..%2f..%2faccountIDhash%2finvoices%2fINV08179455/pdf

https://www.luminate.com/my-services/invoices/..%2f..%2fsamwcurry%40gmail%2ecom%2finvoices%2fINV08179455/pdf

因此,我打算换一个角度来进行尝试。接下来,我又发送了如下所示的请求尝试:


https://www.luminate.com/order/confirmation/..%2forders%2forderId

https://www.luminate.com/my-services/more-info/json?uid=../subscriptions/subscriptionID

https://www.luminate.com/my-services/edit-payment-method?uid=../paymentmethods/paymentMethodID

这些请求可以帮助我找出相关目录的根目录,这样我也许就可以获取其他用户的目录文件了。此时我突然回想起来,该网站的域名控制面板部分有一个功能允许我们更新域名信息,你可以将域名修改成其他的东西,而此时服务器将返回一段非常有意思的错误信息:

{"error":"Id samwcurry@gmail.com#vjdoes not have permission to modify the domain example.com."}

为什么上面的邮件地址结尾有一个“#vj”呢?说实话,我自己也不清楚…我只知道这里有这样一个字符。不过需要注意的是,这个节点是不可利用的。但是,当我们使用这个邮件地址(末尾跟加上“#vj”,URL编码后为“%23vj”)来访问我的个人文件时,竟然成功了!

 https://www.luminate.com/my-services/invoices/..%2f..%2fsamwcurry@gmail.com%23vj%2finvoices%2fINV08179455/pdf

仔细分析下来,大致的情况应该是这样:


- samwcurry@gmail.com#vj

  services

    -serviceID (full folder samwcurry@gmail.com#vj/services/serviceID)

  invoices

    -invoiceID (full folder samwcurry@gmail.com#vj/invoices/invoideID)

  paymentmethods

-paymentMethodID (full folder samwcurry@gmail.com#vj/paymentmethods/paymentMethodID)

而后续测试也证明,我们可以使用这种方法来访问其他用户的文件。在真实的攻击场景中,攻击者只需要知道目标用户的邮箱地址,就可以查看到他们的支付信息了,其中包括用户信用卡号的最后四位数、卡片到期日、以及账单地址等等

利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息

总结

雅虎的小型企业服务平台将用户数据存储在一系列目录之中,而他们只是尝试通过模糊文件夹名称来保护这些数据的安全。对于攻击者来说,只要他们知道目标用户的邮箱地址,他们就能够使用字典来暴力破解出可猜测的服务ID,并最终从服务器所返回的请求中查看到用户的信用卡支付信息。

漏洞时间轴

2017年10月21日:漏洞提交

2017年10月23日:漏洞归类

2017年11月08日:漏洞修复

漏洞奖金未确认

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