반응형

SQL Injection(SQLi)은 웹 애플리케이션에서 입력값을 통해 데이터베이스 쿼리를 조작하는 공격 기법이야.

쉽게 말하면 **“웹사이트가 입력값을 그대로 DB 쿼리에 넣는 실수를 이용해 공격자가 원하는 명령을 실행하는 것”**이라고 보면 돼.


🔹 SQL Injection 개념

  1. 공격 원리
  • 웹페이지에서 사용자가 입력한 데이터를 DB 쿼리에 직접 연결할 때 발생
  • 예: 로그인 폼에서 username과 password를 입력받아 DB에서 확인
 
SELECT * FROM users WHERE username = '$input_user' AND password = '$input_pass';
  • 공격자가 input_user에 ' OR 1=1 -- 를 입력하면
 
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '';
  • 결과적으로 조건이 항상 참이 되어 로그인 우회 가능

  1. 공격 목표
  • 인증 우회 (로그인 탈취)
  • 민감 정보 조회 (개인정보, 계좌 정보 등)
  • 데이터 삭제·변경·삽입
  • 서버 내부 명령 실행, 파일 접근 가능(Advanced SQLi)

  1. SQL Injection 종류
유형설명
Classic / In-band 결과가 웹페이지에 그대로 나타나는 공격
Error-based DB 오류 메시지를 이용해 정보 획득
Blind SQLi 결과가 안 나와도 참/거짓 기반으로 정보 추출
Time-based DB 응답 시간으로 참/거짓 판별
Out-of-band 다른 채널(메일, DNS 등)로 정보 탈취

  1. 실무 방어 방법
  • Prepared Statement / Parameterized Query 사용
  • 입력값 검증(Input Validation)
  • 최소 권한 DB 계정 사용
  • 오류 메시지 노출 금지
  • WAF 규칙 적용 (SQLi 탐지/차단)
  • 정기적인 취약점 스캔 및 모니터링

🎯 한 문장 요약

SQL Injection = 웹 입력값을 조작해 데이터베이스 쿼리를 변조함으로써 정보 탈취, 조작, 권한 우회 등을 수행하는 공격.

 

공격 예시

아래는 SQL Injection 공격 예시 + 실제 Payload + WAF에서 어떻게 차단하는지를 실무자 기준으로 깔끔하게 정리한 내용이야.
(보안관제·WAF 담당자라면 바로 현업에서 쓸 수 있어.)


🔥 1. SQL Injection 공격 원리 (그림 개념)

 
[사용자 입력] → [웹 서버] → [DB 쿼리 실행] 공격자는 입력값에 SQL 구문을 섞어서 웹 서버가 DB에게 '잘못된 명령'을 실행하게 만듦

예: 로그인 화면에서
ID: ' OR 1=1 --
PW: 아무거나

→ 서버는 아래처럼 쿼리를 만듦

 
SELECT * FROM users WHERE id='' OR 1=1 --' AND pw='';

OR 1=1 때문에 항상 참 → 로그인 우회 성공


🔥 2. 실제 공격 Payload 예시

✔️ (1) 로그인 우회

 
' OR '1'='1' --

✔️ (2) 데이터 추출 (테이블/컬럼 이름 획득)

 
' UNION SELECT table_name,1,1 FROM information_schema.tables --

✔️ (3) Error-based SQLi

DB 오류 메시지를 이용해 정보를 역으로 획득

 
' AND updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) --

✔️ (4) Blind SQLi (TRUE/FALSE 기반)

 
1' AND (SELECT SUBSTRING(user(), 1, 1)='r') --

✔️ (5) Time-based Blind SQLi

응답 시간으로 데이터 추출

 
1' AND IF(1=1, SLEEP(5), 0) --

DB가 5초 후 응답 → 조건이 참


🔥 3. 공격 시 WAF 로그 예시 (실무 기준)

아래는 WAF에서 흔하게 잡히는 패턴들:

 
[SQLi] pattern: ' or 1=1 -- [SQLi] keyword: union select [SQLi] function: sleep(5) [SQLi] comment symbol: -- [SQLi] dbms: information_schema [SQLi] special char: updatexml / extractvalue

또는 이런 요청 URL:

 
/search?q=' OR 1=1 -- /login?id=admin' UNION SELECT ... /product?id=1 AND SLEEP(3)

→ 패턴 매칭, 시그니처, 머신러닝 룰로 차단됨.


🔥 4. WAF에서 막는 방법 (실무 버전)

✔️ 1) 시그니처 기반 차단

  • ' OR 1=1
  • UNION SELECT
  • SLEEP(
  • updatexml(
    등 SQLi 키워드 탐지 시 차단

✔️ 2) 입력값 검증(Normalization)

URL 인코딩 등 우회 공격 방지
예:
%27 OR 1%3d1 -- → ' OR 1=1 -- 로 정규화 후 차단


✔️ 3) 파라미터 무결성 체크

파라미터 형태가 평소와 다른 경우 차단
예: 숫자 파라미터에 문자열 삽입

 
/item?id=10 → 정상 /item?id=10' OR '1'='1 → 비정상 → 차단

✔️ 4) ML 기반 이상 행위 탐지

  • 특정 IP에서 짧은 시간에 수백 개 SQL 시도
  • User-Agent가 SQLmap
  • Union select 반복 발생

→ 이상 행위로 판단해 자동 차단


🔥 5. 개발 단계에서의 방어 코드

✔️ Prepared Statement 예시 (PHP)

 
$stmt = $conn->prepare("SELECT * FROM users WHERE id=? AND pw=?"); $stmt->bind_param("ss", $id, $pw); $stmt->execute();

✔️ Java (Spring)

 
String sql = "SELECT * FROM users WHERE id = ? AND pw = ?"; jdbcTemplate.queryForObject(sql, new Object[]{id, pw}, rowMapper);

→ 입력값이 SQL로 해석되지 못함
→ SQL Injection 완전 차단


🎯 한 문장 요약

SQL Injection = 사용자가 입력한 값을 SQL 쿼리로 잘못 연결한 취약점을 이용해 DB를 조작하는 공격이며, WAF와 개발 보안이 함께 대응해야 완벽히 방어 가능하다.

반응형

+ Recent posts