利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息
在这篇文章中,我将跟大家介绍如何利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息。在过去的一年半时间里,我一直都在对雅虎平台的安全性进行分析,而本文所要描述的内容也是我在这段时间里所得到的成果之一。
挖洞过程
在前期的侦察过程中,我首先想要知道的就是服务器端都运行着哪些东西。虽然这并不能直接让我拿到漏洞奖金,但这些信息可以帮助我识别公开的已知漏洞,或者在之后的漏洞利用过程中帮到我。
我们的测试目标是雅虎的小型企业服务平台,经过一段时间的分析之后,我首先找到了一个包含错误配置的页面,然后通过分析网络请求发现了其用户控制面板运行的是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/pdfhttps://www.luminate.com/my-services/invoices/..%2f..%2faccountIDhash%2finvoices%2fINV08179455/pdfhttps://www.luminate.com/my-services/invoices/..%2f..%2fsamwcurry%40gmail%2ecom%2finvoices%2fINV08179455/pdf
因此,我打算换一个角度来进行尝试。接下来,我又发送了如下所示的请求尝试:
https://www.luminate.com/order/confirmation/..%2forders%2forderIdhttps://www.luminate.com/my-services/more-info/json?uid=../subscriptions/subscriptionIDhttps://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日:漏洞修复
漏洞奖金未确认
- android上拉下拉加载更多数据
- 「微信小程序」剖析(二):框架原理 | 在桌面浏览器上运行的尝试
- Working with Windows Workflow Foundation in ASP.NET
- 微信小程序剖析【下】:运行机制
- android多屏幕分辨率适配
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
- 怎么解决web service circular reference 问题
- android使用LruCache对listview加载图片时候优化处理
- 如何创建一个兼容「微信小程序」的Web框架:WIN
- RePractise前端篇: 前端演进史
- Git远程库版本回滚
- android 之ndk开发
- 【持续集成】使用 Jenkinsfile 设计直观的 Pipeline
- 将OpenOffice.org变成一个文档格式转换工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP CRM Interactive Report(交互式报表)里和服务订单相关的一些字段
- SAP S/4HANA Customer Management(CRM)模块的扩展性设计
- SAP S/4HANA Customer Management(CRM)模块的Partner模型设计
- 使用soapUI消费SAP Cloud for Customer的web service
- 视频上云网关EasyNTS智能云组网如何通过23端口穿透实现远程控制功能?
- 视频上云网关平台EasyCVR登录页开发控制台报net::ERR_CONNECTION_TIMED_OUT错误
- 视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列——开启存储服务
- 设计模式~责任链模式
- 大数据计算的基石——MapReduce
- SPA单页应用的优缺点
- 《JavaScript 模式》读书笔记(7)— 设计模式1
- CenterNet测试推理过程
- Docker学习笔记[nginx]
- MySQL集群搭建方案(PXC)
- Java8——行为参数化传递代码