簡介
判斷GraphQL方式
判斷一個網站是否使用了GraphQL API,可以通過以下幾種方法:
1. 檢查網絡請求
查看請求端點
- GraphQL 通常使用單一端點,常見路徑如:
/graphql
/api/graphql
/gql
/query
觀察請求特征
- POST 請求為主(雖然 GET 也可能)
- 請求體包含
query
、variables
、operationName
字段 - Content-Type 通常是
application/json
2. 分析請求/響應結構
請求體特征:
{"query": "{ user { id name email } }","variables": {},"operationName": "GetUser"
}
響應結構:
{"data": {"user": {"id": "123","name": "John","email": "john@example.com"}},"errors": []
}
4. 使用瀏覽器開發者工具
打開 F12 開發者工具
切換到 Network 標簽
執行網站操作,觀察 XHR/Fetch 請求
查找包含 GraphQL 特征的請求
內省查詢
- 發送內省查詢測試:
{__schema {types {name}}
}
通過綜合使用這些方法,你通常能夠準確判斷一個網站是否使用了 GraphQL API。最直接的方法是通過瀏覽器開發者工具觀察網絡請求的模式和內容。
Schema
-
GraphQL Schema 是 GraphQL 中定義數據模型和 API 結構的核心概念,它相當于數據的藍圖或契約,明確規定了客戶端可以執行的操作以及可訪問的數據類型。
-
Schema 的本質作用是描述整個 API 的數據結構和操作能力,就像數據庫的架構圖一樣,讓客戶端知道可以查詢什么數據、如何查詢,以及數據之間的關系。
-
Schema 包含三種核心操作類型:query(查詢操作,用于讀取數據)、mutation(變更操作,用于修改數據)和 subscription(訂閱操作,用于實時數據監聽)。
type Book {
id: ID!
title: String!
author: String!
year: Int
}
- 完整 Schema 的構成需要將業務數據類型(如 Book)與操作類型結合。Query 類型是必需的,定義了所有可執行的查詢操作;Mutation 類型是可選的,當需要修改數據時才定義;Subscription 類型則根據是否需要實時功能來決定是否定義。
Type
基于您提供的內容,我來整理總結 GraphQL Schema 中的 Type 系統:
GraphQL Type 系統概述
GraphQL Schema 通過 Type(類型) 來實現數據模式的抽象描述。每個 Type 由多個 Field(字段) 組成,而每個字段又指向特定的 Type,形成了完整的類型關系網。
Type 的分類
GraphQL 中的 Type 主要分為六類:Scalar
、Object
、Interface
、Union
、Enum
、Input
,其中最重要的是前兩種。
- Scalar Type(標量類型)
標量類型是 GraphQL 的基礎數據類型,包括:
- String:字符串類型
- Int:整數類型
- Float:浮點數類型
- Boolean:布爾類型
- ID:唯一標識符類型
- Enum:枚舉類型
非空標識:字段后添加 !
符號表示該字段不能為空(必需字段)。例如 ID!
、String!
表示必需的 ID 和字符串字段。
除了內置標量類型,還可以根據需要聲明自定義標量類型。
- Object Type(對象類型)
對象類型用于表達復雜的數據結構,由多個字段組成。例如:
type Book {id: ID!title: String!author: String!year: Int
}
這里 Book
就是一個對象類型,包含 4 個字段,每個字段都指向相應的類型。
3. 字段類型的靈活性
字段的類型不僅可以是標量類型,還可以是其他對象類型,這樣可以建立對象之間的關聯關系:
type User {id: IDname: String
}type Book {id: ID!title: String!author: User # 這里使用了對象類型 User
}
通過這種方式,可以構建出層次化、關聯性的復雜數據模型,實現數據之間的引用和組合關系。
Operations
GraphQL 規范中主要包括三種操作類型,分別是:Query(查詢,用于從服務器查詢數據)、Mutation(變更,用于操作服務器上數據,包括:添加、修改、刪除等)、Subscription(訂閱),這三者也被稱為root operation type,名為根操作類型。
雖然定義了Book類型,但是這個類型不能直接被訪問和操作,需要通過規范中的 Query、Mutation、Subscription 三個根操作類型來實現,且這三個根操作類型需要顯式的被定義,無法直接使用。
Introspection
Introspection(內省)是 GraphQL 的內置功能,是用于查詢服務端已定義好的 Schema 有關的信息,且在內省系統中還內置了很多元數據類型,包括:__schema、__type、__typeKind、__field、__inputValue、__enumValue、__directive。
由于在真實環境中是無法知道目標 GraphQL Schema 所支持的查詢類型和字段名,但可以通過內省查詢來獲取這些信息(類似于 Swagger API 說明文檔)。除此之外,內省查詢還會泄漏一些敏感信息,所以在真實環境中,記得禁用內省查詢。
也可以直接通過 BurpSuite 內置的功能來進行內省查詢。
如果目標禁用內省查詢,可以通過工具 Clairvoyance 來進行自動化收集 API 信息。
Vulnerability
1.端點探測
通用端點名稱
GraphQL 服務通常使用類似的端點后綴。測試 GraphQL 端點時,您應該嘗試將通用查詢發送到以下位置:
/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql
在找到 GraphQL 端點后,可以通過簡單的測試來探測目標是否使用 GraphQL 服務,請求類型為application/json,如果沒有正確的回顯,可以嘗試不同的請求的方式以及不同的請求類型。
{“query”: “{}”}
{“query”: “{__schema}”}
{“query”: “{__typename}”}
{“query”: “{__schema{types{name}}}”}
{“query”: “{__schema{queryType{name}}}”}
{“query”: “{__schema{types{name,fields{name}}}}”}
或者直接使用burpsuite自帶得GraphQL或者插件InQL
2. Info Gathering
由于在真實環境中是無法知道目標 GraphQL Schema 所支持的查詢類型和字段名,但可以通過內省查詢來獲取這些信息(類似于 Swagger API 說明文檔)。除此之外,內省查詢還會泄漏一些敏感信息,所以在真實環境中,記得禁用內省查詢。
內省查詢的結果往往很長而難以處理,可以使用 graphql-voyager 來可視化 Schema 實體之間的關聯。可通過在線網站來實現,地址:https://graphql-kit.com/graphql-voyager/。將內省查詢的結果復制到箭頭處即可。