# Sokudo (16/04/2026)

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FfpQDi0HJzV5MbPaRY2v7%2Fimage.png?alt=media&#x26;token=77c44265-0649-4867-929f-d22d58f272cd" alt=""><figcaption></figcaption></figure>

This is a new web application! We haven't seen this one in the rotation at all, so let's take a look at it from scratch.

## Initial Analysis

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FjuFH5iBZaG28qBD6wSRW%2Fimage.png?alt=media&#x26;token=1062dcf5-501b-4bc6-8731-eaf95b1b9868" alt=""><figcaption></figcaption></figure>

We tried default credentials, as well as blind SQLi and user enumeration isn't the path forward this time.

Time to create a new account!

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FLxDBYSjnEC6UAaV1STcN%2Fimage.png?alt=media&#x26;token=93d4c4c9-f44f-47a5-933c-31efc69d1805" alt=""><figcaption></figcaption></figure>

We instantly see something suspicious here during registration as right after we have a call to `/api/graphql`.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2Fd6RQcrnQgr7iyxx4VggT%2Fimage.png?alt=media&#x26;token=10ad955e-da9b-4eba-be2d-8471f36cc705" alt=""><figcaption></figcaption></figure>

Nevertheless, let's take a look around the web app.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FCz1k3UZ9sxo2lf2adVEy%2Fimage.png?alt=media&#x26;token=dbbdc502-f774-4ba1-bb87-5e7c8b4e2fce" alt=""><figcaption></figcaption></figure>

So this is a speed typing competition type web app.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FJh0VqiuGs6OTB9iD9mud%2Fimage.png?alt=media&#x26;token=00d0e0a7-031d-45f4-a30a-12858fbfcadc" alt=""><figcaption></figcaption></figure>

And we have a leaderboard! Of course we are #1 hehe.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FOXKIVjGQC7sTtlb7zFTy%2Fimage.png?alt=media&#x26;token=d7a137ac-2499-4135-a800-1f4f1f28b49c" alt=""><figcaption></figcaption></figure>

## Finding the bug

Okay, so while browsing the site we notice that nothing else is off-putting besides the GraphQL request. Working with Burp, it automatically adds a new tab if it notices the request is GraphQL syntax.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FjTJkm0742IH9tzIlEq0v%2Fimage.png?alt=media&#x26;token=0e49028e-1270-4887-82b3-bbdd39e275b4" alt=""><figcaption></figcaption></figure>

It looks like the following, so it formats it nicely for us and gives us the variables used:

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FMdQO7qZoE1QJF5Bn2oLw%2Fimage.png?alt=media&#x26;token=1e79b235-147d-413c-b3aa-12d33b90dada" alt=""><figcaption></figcaption></figure>

Let's send it to the Repeater and right click to open the GraphQL options:

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FudWd73L9U5K92qEbqAdB%2Fimage.png?alt=media&#x26;token=4e6af38c-0bee-4371-90f9-9a38eafb45aa" alt=""><figcaption></figcaption></figure>

We can set the introspection query so we can gather information regarding the schema. If it is enabled we get full details, if not we get the details that we currently do:

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

```
query IntrospectionQuery {
    __schema {
        queryType {
            name
        }
        mutationType {
            name
        }
        subscriptionType {
            name
        }
        types {
            ...FullType
        }
        directives {
            name
            description
            locations
            args {
                ...InputValue
            }
        }
    }
}

fragment FullType on __Type {
    kind
    name
    description
    fields(includeDeprecated: true) {
        name
        description
        args {
            ...InputValue
        }
        type {
            ...TypeRef
        }
        isDeprecated
        deprecationReason
    }
    inputFields {
        ...InputValue
    }
    interfaces {
        ...TypeRef
    }
    enumValues(includeDeprecated: true) {
        name
        description
        isDeprecated
        deprecationReason
    }
    possibleTypes {
        ...TypeRef
    }
}

fragment InputValue on __InputValue {
    name
    description
    type {
        ...TypeRef
    }
    defaultValue
}

fragment TypeRef on __Type {
    kind
    name
    ofType {
        kind
        name
        ofType {
            kind
            name
            ofType {
                kind
                name
            }
        }
    }
}
```

{% endcode %}

and the response is:

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

```
HTTP/2 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Date: Thu, 16 Apr 2026 11:30:59 GMT
Etag: W/"9a6-mVPDo/grP/EfDShqrTafr6Txb94"
X-Powered-By: Express
Content-Length: 2470

{"errors":[{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"__schema\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"queryType\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"mutationType\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"types\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"directives\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"args\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"kind\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"fields\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"args\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"type\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"inputFields\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"interfaces\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"enumValues\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"possibleTypes\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"type\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"kind\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"ofType\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"kind\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"ofType\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"kind\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"ofType\"."},{"message":"GraphQL introspection has been disabled, but the requested query contained the field \"kind\"."}]}
```

{% endcode %}

So we at least know what the fields are called, now let's explore some GraphQL attack paths and try to implement them here, we would ideally be using some of the fields to write queries.

{% embed url="<https://0xn3va.gitbook.io/cheat-sheets/web-application/graphql-vulnerabilities>" %}

Since our website only really has a typing speed feature and a leaderboard feature, we might need to take a look at users, none of the fields from the introspection query lead towards any information about users unfortunately (just guessing by the names), so how about we try to query some information about users.

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

```graphql
query {
  allUsers {
    name
  }
}
```

{% endcode %}

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FBLCqiREktULd7hxe4WNF%2Fimage.png?alt=media&#x26;token=9dfbdddb-ca1e-4844-b285-bbcce775a025" alt=""><figcaption></figcaption></figure>

This one was a whoopsie as well, since we don't need to include the query {}, as when we see the request regularly this the way that the body is being formatted:

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FvWpkfX9FtnCQfVS9pJ0m%2Fimage.png?alt=media&#x26;token=0d67cc89-28fe-490f-a16d-b9f4479e5ea3" alt=""><figcaption></figcaption></figure>

Nevertheless, the web app gave us the hint we needed. Back to the GraphQL interface.

## Exploitation

Well, the web app is basically telling us to fix our query, let's try their suggestion.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FqPjEpoBTjEfRcCHq2VrQ%2Fimage.png?alt=media&#x26;token=20fe4bf5-3ccd-4740-ab57-c97c8fa58309" alt=""><figcaption></figcaption></figure>

Okay, step by step information:

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

```graphql
{"errors":[{"message":"Field \"users\" of type \"[User!]!\" must have a selection of subfields. Did you mean \"users { ... }\"?","locations":[{"line":1,"column":2}]}]}
```

{% endcode %}

The question is, what are the field names for {users}? I guess we have to do this manually since introspection is blocked.

Unfortunately, just getting an error this time won't give us the way forward, so we have to guess.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FZj4cu5cyR5V02xS78i6W%2Fimage.png?alt=media&#x26;token=37b1aae5-5570-4af5-9bae-fc12b18d1504" alt=""><figcaption></figcaption></figure>

What kind of fields do users usually have? Let's remember our registration.

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

```
{"username":"minatour","email":"minatour@gmail.com","password":"minatour","full_name":"minatour"}
```

{% endcode %}

and the corresponding GraphQL query:

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

```
{"query":"\n  mutation LogActivity($event: String!, $userId: ID, $metadata: String) {\n    logActivity(event: $event, userId: $userId, metadata: $metadata) {\n      id\n      event\n      timestamp\n    }\n  }\n","variables":{"event":"user.register","userId":"4","metadata":"{\"username\":\"minatour\"}"}}
```

{% endcode %}

At the very least we know we have the username and userId fields.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FEXvG66rtIP7aR4qzoedl%2Fimage.png?alt=media&#x26;token=0004bd6b-0c22-490a-91d4-fd13d7e9c3c2" alt=""><figcaption></figcaption></figure>

I guess we don't have userId though?

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FywJCPSsgdPp0ZTzM3CRV%2Fimage.png?alt=media&#x26;token=a397e868-35b4-42c3-bd03-004937834822" alt=""><figcaption></figcaption></figure>

Let's try to see if we can re-use any of the information we sent during registration, we can try the password field.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FatMYLLb2MILgVwBSQ3tp%2Fimage.png?alt=media&#x26;token=ee4d24f7-f664-4bbc-9830-5f6e1b5326ac" alt=""><figcaption></figcaption></figure>

Nice lab!

Technically with graphql fields if you are close enough to the fieldname it will usually give you the full field name.

<figure><img src="https://2195055109-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcMiUkiiKxEC7T74iugoy%2Fuploads%2FRBcW2qO256rphH29hn4q%2Fimage.png?alt=media&#x26;token=3a793db7-a05f-4223-9c4a-eeaf8a56553e" alt=""><figcaption></figcaption></figure>

So you don't need to bruteforce plurals for example if that ever helps.


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://minatours-notes.gitbook.io/blog/bugforge/dailies/sokudo-16-04-2026.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
