Burp로 GraphQL Introspection 및 민감데이터 검사
Burp를 활용해 GraphQL Introspection을 수집하고 응답을 분석해 민감데이터 노출을 식별하는 절차와 대응 방안을 정리한 실무
목차
소개
GraphQL은 유연한 쿼리 구조로 클라이언트 요구에 맞춘 데이터를 제공한다. 그러나 Introspection 기능과 느슨한 스키마 설계는 민감데이터 노출 위험을 키운다. 본문은 Burp를 중심으로 GraphQL Introspection 수집과 응답 분석을 통해 민감데이터를 찾아내는 흐름을 설명한다. 초보자도 이해할 수 있도록 순서와 예시를 포함한다.
GraphQL Introspection 개요
Introspection의 역할
Introspection은 GraphQL 서버가 제공하는 타입, 필드, 스칼라 등 메타데이터를 반환하는 쿼리 기능이다. 개발 환경에서는 디버깅과 자동 문서화에 유용하다. 하지만 외부 노출 시 내부 구조와 민감 필드명을 노출시키는 단서가 된다.
보안 관점
스키마에 password, ssn, token 같은 민감 식별자가 포함되면 Introspection 결과만으로도 취약점이 식별될 수 있다. 또한 일부 필드는 권한 체크가 약해 의도치 않게 데이터가 반환될 위험이 있다.
Burp 준비와 플러그인
필요한 구성 요소
- Burp Suite (프로 또는 커뮤니티로 기본 기능 사용 가능)
- GraphQL 관련 확장 (예: "GraphQL" 확장 또는 "Autorize" 등 권한 검사 보조 도구)
- Logger와 Repeater, Intruder 모듈
확장 설치는 Burp의 Extender에서 수행된다. 확장에 따라 Introspection 자동화와 스키마 시각화가 가능하다.
Introspection 수집 절차
기본 요청 구조
일반적인 Introspection 쿼리는 다음과 같다. 이 쿼리는 스키마의 타입과 필드를 반환한다.
{
"query": "query IntrospectionQuery { __schema { types { name kind fields { name type { name kind ofType { name } } } } } }"
}
Burp에서의 수집 흐름
- 브라우저를 Burp 프록시로 연결해 GraphQL 엔드포인트 요청을 캡처한다.
- 캡처된 요청을 Repeater로 보내 Introspection 쿼리로 교체한다.
- 응답을 저장하고 스키마 목록을 확보한다.
이 과정에서 스키마가 비활성화되어 있을 경우 200 이외의 응답이나 빈 결과가 반환된다. 그 경우 권한 문제나 서버 설정 확인이 필요하다.
민감데이터 탐지 방법
필드명 기반 탐색
Introspection 결과에서 'password', 'ssn', 'token', 'credit', 'secret' 같은 식별자는 우선순위가 높다. 자동화된 검색은 정규표현식을 활용해 필드명을 필터링한다. 예시 정규식은 다음과 같다.
/password|passwd|pwd|ssn|social|token|secret|credit|card|cvv/i
응답 샘플 검사
필드명이 발견되면 같은 쿼리로 실제 데이터를 요청해 반환 여부를 확인한다. 이때 권한 체크나 필드 레벨 보호가 어떻게 동작하는지 파악한다. 테스트 시 토큰 유효성, 사용자 역할 등 컨텍스트를 다양하게 바꿔 응답 차이를 관찰한다.
Burp 도구 연동
- Logger: Introspection 응답과 후속 쿼리들을 기록한다.
- Intruder: 다양한 권한 토큰, 사용자 ID, 변형 쿼리로 자동화된 대량 테스트를 실행한다.
- Scanner(프로): 발견된 엔드포인트에 대해 추가적인 취약점 패턴을 검사한다.
응답 파싱과 민감도 판정
응답에서 민감성은 필드명뿐 아니라 값의 형태와 노출 범위로 판정한다. 예를 들어 해시화된 비밀번호는 원문 노출보다 낮은 위험으로 분류된다. 그러나 API 토큰, 전체 신용카드 번호, 주민등록번호 같은 값은 즉시 고위험으로 분류된다.
우선순위 기준 예시
- 고위험: 인증 토큰, 전체 카드번호, 주민등록번호
- 중위험: 이메일, 전화번호, 주소(부분 마스킹 없는 경우)
- 저위험: 해시값, 공개 프로필 정보
실무 권고 사항
권한 분리와 필드 레벨 접근 제어의 적용이 핵심이다. Introspection 자체를 외부에 열어둘 필요가 없으면 비활성화가 권장된다. 또한 민감 필드가 존재하면 다음과 같은 보호 조치가 권고된다.
- 필드 레벨 권한 체크 적용
- 출력 마스킹 또는 부분 가림 처리
- Introspection 접근을 개발자 IP로 제한
- 로깅 시 민감 데이터 마스킹
예시 워크플로우 요약
- 프록시로 요청 캡처
- Introspection 쿼리 실행 및 스키마 확보
- 필드명 정규표현식으로 민감 필드 식별
- 권한/토큰 변형으로 실제 데이터 반환 여부 확인
- 분류에 따른 권고 적용 및 문서화
결론
Burp를 사용하면 GraphQL 스키마 수집과 민감데이터 탐지가 체계적으로 진행된다. Introspection은 편리하지만 보안 위험을 동반한다. 수집, 분석, 판정, 대응까지의 전 과정을 정리하면 실제 운영 환경에서의 노출을 효과적으로 줄일 수 있다.