sqlmap 원리

agnusdei·2025년 6월 8일

CTF

목록 보기
19/185

sqlmap 파라미터 분석 + 원리 설명 + FUZZ 방식과 차이

예시 명령어

sqlmap -u "http://example.com/page.php?id=1" \
  --tor --tor-type=SOCKS5 \
  --columns \
  -c ./SecLists/Discovery/Web-Content/common-columns.txt

이 명령어의 의미

옵션설명
-u대상 URL (파라미터 포함)
id=1SQL 인젝션을 시도할 대상 파라미터 + 값
--columns특정 DB/테이블에서 컬럼명 추출 시도
-c사용할 컬럼 이름 워드리스트 지정
--torTor 네트워크를 통해 익명으로 공격
--tor-type=SOCKS5Tor 프록시의 유형 지정 (기본은 127.0.0.1:9050)

id=1은 꼭 있어야 할까?

네, 있어야 합니다.

  • sqlmap은 SQL 페이로드를 주입할 수 있는 위치가 있어야 동작합니다.
  • id=1처럼 값이 명확해야, 1 AND 1=1, 1 AND 1=2 같은 페이로드로 서버 응답 차이를 분석할 수 있습니다.
  • 이 값은 FUZZ 자리처럼 단순 치환이 아니고, 자동 페이로드 삽입 타겟 위치를 의미합니다.

sqlmap의 작동 원리 요약

  1. 파라미터 분석: URL에서 id=1 같은 파라미터를 추출
  2. 인젝션 테스트: 다양한 SQL 페이로드 자동 삽입
    • 예: id=1', id=1 AND 1=1, id=1 AND 1=2
  3. 응답 비교: 정상/비정상 응답을 비교해 인젝션 여부 판단
  4. DBMS 감지: MySQL, MSSQL, Oracle 등 종류 자동 감지
  5. DB 구조 수집: --dbs, --tables, --columns 등으로 정보 수집
  6. 브루트포싱 가능: --common-tables, --common-columns 등으로 이름 추측 가능

--common-tables, --common-columns 역할

이 옵션들은 대상 DB에서 테이블/컬럼 이름을 모를 때 유용합니다.

  • --common-tables: 자주 쓰이는 테이블 이름 리스트로 브루트포싱
  • --common-columns: 자주 쓰이는 컬럼 이름 리스트로 브루트포싱

브루트포싱할 워드리스트는 SecLists 같은 데이터셋에서 사용:

-c ./SecLists/Discovery/Web-Content/common-columns.txt

FUZZ와의 차이점 (ffuf, wfuzz와 비교)

항목sqlmapffuf / wfuzz
공격 위치 지정파라미터 값에서 자동 탐지FUZZ 키워드로 명시적으로 지정
페이로드 방식SQL 인젝션 페이로드 자동 삽입사용자 정의 단어 리스트 삽입
목적SQL 인젝션 자동화디렉토리, 파라미터, 값 등 브루트포싱
주입 위치URL, POST, Cookie 등 자동 분석사용자가 FUZZ로 지정
워드리스트기본 제공 + 사용자 지정 가능보통 SecLists 사용

sqlmap 실제 요청 흐름 예시

원래 요청

GET /page.php?id=1 HTTP/1.1

sqlmap이 주입 시도하는 페이로드 예시

GET /page.php?id=1'-- HTTP/1.1
GET /page.php?id=1 AND 1=1-- HTTP/1.1
GET /page.php?id=1 AND 1=2-- HTTP/1.1
GET /page.php?id=1' OR '1'='1-- HTTP/1.1

이렇게 다양한 페이로드로 테스트해서 응답의 차이(diff)를 분석하고, 차이가 생기면 “여기 인젝션 가능!”이라고 판단합니다.

어린이 버전 요약

sqlmap은 웹사이트한테 “숫자 대신 이상한 쿼리를 살짝 넣어볼게~” 하고 장난치는 도구야. id=1은 그 장난칠 자리야. FUZZ는 “여기다가 단어집 뒤져서 하나씩 넣어볼게” 하는 방식이고, sqlmap은 자동으로 페이로드 주입하고, DB에서 뭘 뽑아낼지까지 알려줘.

결론

  • id=1 같은 파라미터와 값은 sqlmap이 주입할 위치를 찾는 데 필수
  • FUZZ는 위치를 직접 지정해서 브루트포싱하는 반면, sqlmap은 값이 있는 파라미터에 SQL 페이로드를 자동 삽입
  • --columns, --common-* 옵션은 정보 수집 또는 이름 추측을 위한 브루트포싱용
  • 둘은 비슷한 듯 완전히 다른 목적과 동작 원리
profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글