GraphQL API漏洞是由于设计缺陷产生,比如,自省功能处于开启状态,使攻击者可以查询API来收集架构的信息。
我们测试GraphQLAPI之前,需要找到端点,由于GraphQL对所有请求都使用相同的端点,所以找到端点很有价值。
使用bp在扫描过程中自动测试GraphQL端点,找到会引发找到GraphQL端点问题。
如果发送query{__typename}到任何 GraphQL 端点
它将{"data": {"__typename": "query"}}在其响应中的某个位置包含该字符串。这称为通用查询,是探测 URL 是否对应于 GraphQL 服务的有用工具。
GraphQL 服务通常使用类似的端点后缀。测试 GraphQL 端点时,您应该尝试将通用查询发送到以下位置:
/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql
如果这些常见端点没有返回 GraphQL 响应,您也可以尝试附加/v1到路径。
注:GraphQL服务通常对任何非GraphQL请求做出查询不存在或者错误的响应。
找到GraphQL端点最好的方式,就是bp设置post请求仅接收application/json方法。
如果API使用参数可以直接访问对象,就可能收到访问控制漏洞的影响。用户只需要提供正确的参数,就可以访问到一些未授权信息,成为IDOR
最好的方式是使用自省查询,自省是一个内置的GraphQL函数,可以让我们查询服务器以获取相关的架构信息。
要使用自省来发现架构信息,需要查询该__schema字段。这个字段在所有查询的类型上都可用。我们可以使用burp进行查询
我们使用BURP在记录中找到
/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql
/graphql/v1
找到着一些页面,我们可以发送到重发器,最新版的bp可以在其中找到GraphQL
如果启用了自省但上述查询未运行,尝试从查询结构中删除onOperation、onFragment和指令。许多端点不接受这些指令作为自省查询的一部分,通过删除它们,通常可以更成功地进行自省。