恶意|API查询语言GraphQL的优秀安全实践( 三 )

  • name
  • }
  • }
  • 而攻击者可以通过制造一些网络请求 , 来枚举API服务器中的每一个droid对象 。 这就可能会导致API级别的DoS攻击、暴力破解秘密数据、绕过请求的速率限制、以及对象枚举等安全问题 。
    GraphQL注入攻击
    GraphQL API通常与作为数据源的数据库管理系统相连接 。 API后端的Resolver在收到请求后 , 会根据操作集来区分查询 。 在Resolver查询数据库时 , 如果其操作涉及到数据的提取 , 那么就会直接执行相应的获取操作 。 可见 , 如果来自API客户端的数据 , 在未被适当清理的情况下 , 执行任何受信的操作 , 那么黑客就可以通过编排SQL/NoSQL , 来实施注入攻击 。 同样 , 如果对输入的清理不够充分 , 攻击者还会执行诸如LDAP注入、以及命令注入等其他形式的注入攻击 。
    GraphQL CSRF攻击
    跨站请求伪造(CSRF)攻击是指 , 在合法用户不知情时 , 强迫Web服务器运行那些不必要的操作 。 当存在CSRF漏洞时 , 攻击者会在当前登录用户的上下文 , 发送经过身份验证的请求 。 而GraphQL类型的应用极易受到CSRF攻击 , 毕竟API在接收浏览器的请求时 , 会自动接受所有的cookie(其中就包括了会话cookie) 。
    目前 , 主要有两种类型的GraphQL CSRF攻击:基于Post和基于Get的CSRF 。 由于GraphQL使用多个API层来转换传入的多格式请求 , 而且能够影响到GraphQL应用的状态 , 因此大多数CSRF攻击通常以POST请求为目标 。 通常 , 许多开发人员会只接受设置为application/json的Content-Type标头 。 例如 , 以下POST请求可用于发出有效的GraphQL查询:
    1. POST /GraphQLHTTP/1.1
    2. Host: redacted
    3. Connection: close
    4. Content-Length: 100
    5. accept: */*
    6. User-Agent: ...
    7. content-type: application/json
    8. Referer: https://redacted/
    9. Accept-Encoding: gzip, deflate
    10. Accept-Language: en-US,en;q=0.9
    11. Cookie: ...
    12. {"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
    服务器可以将此请求作为form-urlencoded POST请求予以接受:
    1. POST /GraphQLHTTP/1.1
    2. Host: redacted
    3. Connection: close
    4. Content-Length: 72
    5. accept: */*
    6. User-Agent: Mozilla/5.0(Macintosh; Intel Mac OS X 11_2_2)AppleWebKit/537.36(KHTML, like Gecko)Chrome/89.0.4389.82 Safari/537.36
    7. Content-Type: application/x-www-form-urlencoded
    8. Referer: https://redacted
    9. Accept-Encoding: gzip, deflate
    10. Accept-Language: en-US,en;q=0.9
    11. Cookie: ...
    12. query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
    而有经验的攻击者则可以使用自动化扫描工具 , 将其转换为CSRF的攻击接口:
    1. <html>
    2. <!-- CSRF PoC - generated by Burp Suite Professional -->

      推荐阅读