devme

WebページのURLが与えられた。
このWebページには、メールアドレスを送るフォームがあった。

Firefoxの開発者ツールのネットワークタブを開いた状態で適当な文字列(a@example.com)を送ると、 graphqlというファイルにリクエストを送っているのが見えた。
そこで、「graphql writeup」でググると、以下のページが見つかった。

An URL of a web page was given.
the web page had a form to send a e-mail address.

I sent some string (a@example.com) with the Network tab on the Developer Tool in Firefox opened, finding that it is sending a request to a file named graphql.
Then, I googled "graphql writeup" and found this page:

SECCON Beginners 2020 Writeup (profiler, Somen) - Ryoto's Blog

このページを参考に、以下のクエリを送ることで、使えるクエリの情報を得ることができた。
(「クエリを送る」とは、開発者ツールでgraphqlへのリクエストの要求ボディをクエリに書き換え、 「編集して再送信」することである)

Referring this page, I obtained information about available queries by sending the following query.
("send query" here means to replace the request body of the request of the file graphql to the query and to "Edit and Resend" on the Developer Tool)

{"query": "query{__type(name: \"Query\"){name fields{name args{name type{name kind}} type{name kind ofType{name kind}}}}}"}

以下のレスポンスが得られた。 (見やすいように空白や改行を補っている)

The server sent this response. (spaces and newlines are added for readability)

query_res.json

"name": "flag"という部分があるので、以下のクエリを送った。

Seeing the part "name": "flag", I sent this query:

{"query":"query {flag}"}

すると、以下のメッセージが返ってきた。

The server responded with this message:

Field "flag" argument "token" of type "String!" is required, but it was not provided.

そこで、tokenを追加した以下のクエリを送った。

Seeing this, I sent this query with token added:

{"query":"query {flag(token:\"a\")}"}

すると、「Invalid token!」というメッセージが返ってきた。
そこで、"name": "users"に注目し、 メールアドレスを送った時のクエリに含まれていたusernameと、 tokenの情報を得るために推測したtokenを用い、以下のクエリを送った。

The server sent "Invalid token!" in the response for this query.
Seeing this, noting the "name": "users", I sent the following query using username, which is in the query sent on sending an e-mail address, and token, which I guessed to obtain information about "token".

{"query":"query {users{username, token}}"}

すると、usernametokenの対応表が得られ、usernameadminの項目があった。
そこで、admintokenを用い、以下のクエリを送った。

This resulted in getting a table of username and token. There was an entry whose username is admin.
Seeing this, I sent this query using the token corresponding to the admin:

{"query":"query {flag(token:\"3cd3a50e63b3cb0a69cfb7d9d4f0ebc1dc1b94143475535930fa3db6e687280b\")}"}

すると、flagを送ってくれた。

The server sent the flag in the response of this query.

corctf{ex_g00g13_3x_fac3b00k_t3ch_l3ad_as_a_s3rvice}

corCTF 2021