GraphQL 风格的测试(下部分)

常见的 GraphQL 路径

  • /graphql
  • /graphql-console
  • /graphql-devtools
  • /graphql-explorer
  • /graphql-playground
  • /graphql-playground-html
  • /graphql.php
  • /graphql/console
  • /graphql/graphql
  • /graphql/graphql-playground
  • /graphql/schema.json
  • /graphql/schema.xml
  • /graphql/schema.yaml
  • /graphql/v1
  • /HyperGraphQL
  • /je/graphql
  • /laravel-graphql-playground
  • /lol/graphql
  • /portal-graphql
  • /v1/api/graphql
  • /v1/graphql
  • /v1/graphql-explorer
  • /v1/graphql.php
  • /v1/graphql/console
  • /v1/graphql/schema.json
  • /v1/graphql/schema.xml
  • /v1/graphql/schema.yaml
  • /v2/api/graphql
  • /v2/graphql
  • /v2/graphql-explorer
  • /v2/graphql.php
  • /graph
  • /graphql/console/
  • /graphiql
  • /graphiql.php

内省安全

参考资料:

常见内省攻击方法:

  • 模式泄露:通过 __schema 查询获取 GraphQL 模式的详细信息,了解 API 结构、类型、字段,甚至发现隐藏或敏感功能。
  • 类型混淆:通过查询分析模式,发现类型混淆漏洞(相同名称但不同定义的类型),可能导致意外数据访问或安全问题。
  • 字段枚举:通过查询模式,枚举 API 的所有字段和关联关系,了解数据模型、关系和功能,为后续攻击做准备。
  • 查询分析:发送大量查询,分析 API 性能和复杂性,发现性能问题、资源消耗过高的查询及潜在漏洞。
  • 敏感信息泄露:通过模式分析和查询,尝试获取用户凭据、API 密钥、数据库结构等,若未正确保护,可能导致信息泄露。

绕过内省:

  • 特殊字符绕过:使用空格、换行符、逗号等被 GraphQL 忽略的字符。

  • 弱正则匹配绕过:修改请求方式或类型绕过防护。

  • 示例 Payload:

    GET /api?query=query{__typename}
    GET /api?query=%7b__schema%0a+++++%7bqueryType%7bname%7d%7d%7d
    
    
  • 内省 Payload (枚举数据库模式):

    GET /api?query=mutation+deleteOrganizationUser+%7b%0d%0a++++deleteOrganizationUser%28input%3a+%7bid%3a3%7d%29+%7b%0d%0a++++++++user+%7b%0d%0a++++++++++++id%0d%0a++++++++++++username%0d%0a++++++++%7d%0d%0a++++%7d%0d%0a%7d
    
    
    mutation deleteOrganizationUser {
        deleteOrganizationUser(input: {id:3}) {
            user {
                id
                username
            }
        }
    }
     
  • 方法:导入解析 JSON,寻找端点和参数。

安全联动

靶场:

攻击类型:

  • XSS 存储型
  • RCE 代码执行
  • SSRF 请求伪造
  • 任意文件上传