API 보안 테스트
ACTION REQUIRED (읽은 후 즉시 실행)
NOW:../field-journal/precedent-pentest.md읽기 — 이 스킬의 작업이 승인된 일상적 작업인지 확인NOW: 현재 작업이 이 스킬의 적용 범위에 해당하는지 확인NEXT:../tool-index.md읽기, 도구 가용성 및 실제 경로 확인NEXT: 도구가 없으면 bootstrap 호출, 경로를 추측하지 않음ACT: "작업 흐름"의 첫 단계로 진입하여 실행, 확인 상태에 머물지 않음
REST / GraphQL / WebSocket / SOAP 전 프로토콜 커버 검색부터 CI/CD 통합까지 10단계 방법론
적용 시나리오
- REST API 보안 테스트 (OpenAPI/Swagger 기반 또는 블라인드 테스트)
- GraphQL 보안 감사 (내부 정보 조회, 배치 쿼리, 별칭 오버로드)
- WebSocket 보안 테스트
- JWT / OAuth 2.0 인증 테스트
- BOLA/IDOR/BFLA 권한 취약점 탐지
- API 속도 제한 우회 및 DoS 테스트
10단계 테스트 프로세스
Phase 1: API 검색 및 정찰
능동적 검색:
□ Vespasian: 헤드리스 브라우저 크롤링 → OpenAPI 3.0 / GraphQL SDL 스펙 자동 생성
□ Entropy --discover: robots.txt + JS 파일에서 엔드포인트 추출
□ Kiterunner / ffuf: 문서화되지 않은 엔드포인트 경로 무차별 대입
□ 일반 경로 확인: /swagger.json, /openapi.json, /graphql, /api-docs
GraphQL 내부 정보 조회 (3단계 시도):
1. 표준 내부 정보 조회 쿼리
2. 간소화된 쿼리 (WAF 완전 차단 우회)
3. __schema { types { name } } 만 조회 (최소 탐지)
Phase 2: 인증 테스트
JWT 분석 (jwt_tool / Burp):
□ alg:none 공격: 헤더를 "alg":"none"으로 수정, 서명 제거
□ 키 혼동: RS256 공개 키 → HS256 대칭 키
□ 약한 HMAC 키 무차별 대입: jwt_tool -C -d wordlist.txt
□ 만료/클레임 변조: exp/iat/sub/role 클레임 수정
□ kid 주입: ../../etc/passwd → HMAC 서명 우회
OAuth 2.0:
□ redirect_uri 조작 → 인증 코드 유출
□ state 파라미터 누락으로 인한 CSRF
□ Referer 헤더를 통한 토큰 유출
□ PKCE 누락 감지
GraphQL 인증:
□ GET 요청을 통한 mutation 인증 우회 (CSRF)
□ 배치 쿼리 인증 우회
Phase 3: 권한 부여 테스트 (BOLA/IDOR/BFLA)
BOLA (객체 수준 권한 우회):
□ 숫자 ID 순회: /user/1 → /user/2 → /user/3
□ UUID 순회
□ 사용자 이름/이메일 순회
□ Burp Autorize: 이중 세션 재생 및 비교
BFLA (기능 수준 권한 우회):
□ 일반 사용자가 관리자 API 실행
□ HTTP 메서드 전환: GET → PUT → PATCH → DELETE
□ API 버전 다운그레이드: /v2/admin → /v1/admin
□ 일괄 작업 주입: {"users": [1,2,3]} → {"users": [1,2,3,admin_id]}
도구: Burp Autorize, AuthMatrix, Entropy (malicious_insider persona)
Phase 4: GraphQL 특화
내부 정보 조회 유출 → 정보 노출 탐지
별칭 오버로드 → 100개 이상의 별칭 DoS
배치 쿼리 → 10개 이상 동시 쿼리 DoS
필드 중복 → __typename × 500
지시문 오버로드 → 재귀적 @skip/@include
순환 쿼리 → 깊은 중첩 내부 정보 재귀
필드 제안 → 오류 메시지 정보 유출
GraphiQL/Playground 노출 → IDE 공개 위험
GET 변이 → CSRF 위험
추적/디버그 모드 → 메타데이터 유출
도구: FireTail, Escape DAST, api.sh (Phases 1-3)
Phase 5: REST 입력 유효성 검사
□ HTTP 메서드 전환: GET→POST→PUT→DELETE→OPTIONS→PATCH
□ Content-Type 변조: JSON→XML→multipart
□ NoSQL 주입: {"username": {"$gt": ""}}
□ URL 파라미터를 통한 SSRF: webhook URL/아바타 URL/가져오기 URL
□ XML 엔드포인트에서 XXE
□ 파라미터 오염: /api?role=user&role=admin
□ 일괄 할당: 요청 본문에 is_admin: true 추가
Phase 6: 비즈니스 로직 및 차이 테스트
□ Entropy compare: v1과 v2 API 비교 → 상태 코드 변경/필드 삭제/지연 회귀
□ 다중 역할 워크플로 테스트: admin/user/readonly 권한 매트릭스
□ 쿠폰/포인트/가격 조작
□ 경쟁 조건: TOCTOU 동시 요청 테스트
Phase 7: WebSocket 테스트
□ 엔드포인트 검색
□ 메시지 주입 (페이로드 주입, 프로토타입 오염)
□ 대용량 메시지 처리
□ 유형 혼동
□ 교차 사이트 WebSocket 하이재킹 (CSWH)
Phase 8: 속도 제한 및 DoS
□ 헤더를 통한 속도 제한 우회: X-Forwarded-For, X-Real-IP
□ 경로 변형: /api/ → /api → /Api/ → /API/
□ Slowloris 저대역폭 소진
□ GraphQL 배치 쿼리 깊은 중첩 DoS
□ IP 순환 테스트 (ProxyCat 프록시 풀)
Phase 9: 데이터 노출
□ 응답 과도 노출: API 반환값과 UI 표시 비교
□ 페이지네이션 열거: ?page=1&limit=10000
□ 오류 메시지 정보 유출: 스택 트레이스/내부 경로/SQL 오류
□ GraphQL 중첩 순회를 통한 권한 초과 데이터 접근
□ OpenAPI 스펙을 통한 민감한 엔드포인트 노출
Phase 10: CI/CD 통합
□ Entropy --ci --watch: 스펙 변경 시 자동 재실행
□ Escape DAST: 심각도 임계값에 따라 빌드 자동 차단
□ 발견된 내용을 회귀 테스트로 지속화
□ StackHawk (개발자 우선, ZAP 엔진 기반)
도구 체인
| 도구 | 용도 | 획득 방법 |
|---|---|---|
| Vespasian | 트래픽 → OpenAPI/GraphQL 스펙 | GitHub: praetorian-inc/vespasian |
| Entropy | LLM 기반 공격 시나리오 생성, 5가지 persona | GitHub: arjinexe/entropy-chaos |
| Escape DAST | 비즈니스 로직 보안 테스트 | escape.tech |
| api.sh | 8단계 전 프로토콜 공격 파이프라인 | GitHub: Sharon-Needles/api |
| FireTail | GraphQL 12가지 특화 테스트 | firetail.ai |
| jwt_tool | JWT 종합 테스트 | GitHub: ticarpi/jwt_tool |
| Burp Autorize | 이중 세션 권한 비교 | Burp BApp Store |
참고 자료
references/rest-graphql-testing.md— REST + GraphQL 심층 테스트references/jwt-oauth-testing.md— JWT + OAuth 보안 테스트
작업 완료 자체 점검 (완료를 주장하기 전에 MUST 통과)
- 작업 흐름의 각 단계를 (읽기만 한 것이 아니라) 실제로 실행했습니까?
-
tool-index를 기반으로 실제 도구 경로를 사용했습니까? - 재현 가능한 증거 (명령어/스크립트/스크린샷/보고서)를 생성했습니까?
- RULES가 요구하는 Checklist 항목을 완료하고 다시 기록했습니까?