본문 바로가기
보안

🚨 GraphQL 공격: Introspection 쿼리를 이용한 내부 데이터 구조 유출 🔍

by IT 분석가 2025. 2. 20.
반응형

그래프큐엘 공격

 

📌 목차

  1. GraphQL이란?
  2. GraphQL 공격의 원리
  3. Introspection 쿼리를 이용한 내부 데이터 유출
  4. 주요 GraphQL 보안 취약점
  5. 방어 방법 및 대응 방안

🔍 GraphQL이란?

GraphQL은 Facebook이 개발한 유연하고 강력한 API 쿼리 언어로,
클라이언트가 원하는 데이터를 선택적으로 요청할 수 있는 기능을 제공한다.

그러나 잘못된 보안 설정으로 인해 공격자가 내부 데이터 구조를 유출하거나,
불필요한 API 기능을 악용하여 권한 상승, 대량 데이터 추출, 서비스 거부(DDoS) 등을 일으킬 수 있다.


⚙️ GraphQL 공격의 원리

GraphQL API는 기본적으로 Introspection 쿼리를 제공한다.
이 기능을 활성화하면 API 스키마 정보를 직접 조회할 수 있다.
공격자는 이를 활용하여 데이터 구조를 파악한 후 추가적인 공격을 시도할 수 있다.

GraphQL introspection 쿼리 예제

{
  __schema {
    types {
      name
      fields {
        name
      }
    }
  }
}
 

🚨 결과:

  • API에서 사용되는 모든 데이터 타입과 필드를 확인 가능
  • 내부 데이터베이스 구조 및 숨겨진 API 엔드포인트 노출

🚨 Introspection 쿼리를 이용한 내부 데이터 유출

1️⃣ 스키마 노출을 통한 공격

📌 공격 방식

  • introspection을 통해 데이터베이스 구조 확인
  • 비공개 API 엔드포인트 및 민감한 데이터 테이블 조회

공격 예제

{
  __schema {
    types {
      name
    }
  }
}
 

🚨 결과:

  • User, Admin, Transaction 같은 내부 데이터 테이블 명칭 확인

2️⃣ 비공개 데이터 테이블 및 필드 확인

📌 공격 방식

  • User 테이블에서 관리자 관련 필드가 있는지 확인

공격 예제

{
  __type(name: "User") {
    fields {
      name
    }
  }
}
 

🚨 결과:

  • id, username, passwordHash, email, isAdmin 같은 필드 조회 가능

3️⃣ 권한 없는 데이터 접근

📌 공격 방식

  • 인증이 필요한 API 엔드포인트를 우회하여 민감한 데이터 조회

공격 예제

{
  allUsers {
    id
    email
    passwordHash
  }
}
 

🚨 결과:

  • 사용자 계정 정보가 유출될 가능성 있음

⚠️ 주요 GraphQL 보안 취약점

1. Introspection 활성화로 인해 내부 구조 노출

  • 공격자는 API 구조를 쉽게 파악하여 취약점을 찾을 수 있음

2. 과도한 쿼리 요청(DoS 공격 가능성)

  • GraphQL은 재귀 쿼리가 가능하여 서버 과부하를 유발할 수 있음

3. 인증 및 권한 검증 부족

  • 권한 검증이 부족하면 일반 사용자가 관리자 데이터를 조회할 수 있음

4. 대량 데이터 추출(Enumeration Attack)

  • 하나의 요청으로 대량 데이터를 조회하여 정보 탈취 가능

🔐 방어 방법 및 대응 방안

1. Introspection 비활성화 (운영 환경에서 제한 필요)

  • introspection을 차단하여 API 스키마를 외부에 노출하지 않도록 설정
  • 예제 (Apollo Server)
const server = new ApolloServer({
  schema,
  introspection: process.env.NODE_ENV !== "production" // 운영 환경에서 비활성화
});

 

2. API 인증 및 권한 검증 적용

  • 모든 요청에 대해 사용자 인증 및 권한 검증 필수 적용
  • 예제 (Express + GraphQL)
app.use("/graphql", (req, res, next) => {
  if (!req.isAuthenticated()) {
    return res.status(401).json({ error: "Unauthorized" });
  }
  next();
});

 

3. 요청 제한 및 Rate Limiting 적용

  • 무제한 쿼리 요청을 방지하기 위해 쿼리 크기 제한 및 요청 속도 제한 적용
  • 예제 (Express Rate Limit)
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1분
  max: 100 // 분당 최대 100 요청
});
app.use("/graphql", limiter);

 

4. Depth Limiting 및 Query Complexity 제한 적용

  • 재귀적인 쿼리 요청을 방지하여 DoS 공격 차단
  • 예제 (GraphQL Shield 적용)
import { rule, shield } from "graphql-shield";
const isAdmin = rule()(async (parent, args, ctx) => ctx.user.role === "admin");
const permissions = shield({
  Query: {
    sensitiveData: isAdmin
  }
});

 

5. 웹 애플리케이션 방화벽(WAF) 사용

  • GraphQL API에 대한 비정상적인 요청을 탐지하고 차단

6. 정기적인 보안 테스트 수행

  • Burp Suite, OWASP GraphQL Security Scanner를 사용하여 보안 점검

📌 해시태그
#GraphQL #웹보안 #API보안 #정보유출 #보안취약점 #Introspection #데이터보안 #GraphQLSecurity

반응형