← 목록으로

SQL Injection: 원리, 탐지, 방어

[Web] Web · 작성: 2026-07-19 19:15:17 · 조회 3

SQL Injection은 사용자 입력이 검증 없이 SQL 쿼리 문자열에 그대로 합쳐질 때 발생한다. 지금도 CTF뿐 아니라 실제 서비스에서 가장 자주 나오는 취약점 중 하나다.

원리

취약한 코드는 대략 이런 식이다.

SELECT * FROM users WHERE username = '$username' AND password = '$password'

$username' OR '1'='1을 넣으면 쿼리가 다음처럼 바뀐다.

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...'

'1'='1'은 항상 참이므로 인증 로직 전체가 무력화된다. 이건 가장 고전적인 예시일 뿐이고, 실제로는 UNION 기반으로 다른 테이블 데이터를 뽑아내거나, 응답이 눈에 안 보일 때는 Blind SQLi로 참/거짓 또는 응답 시간 차이를 이용해 한 글자씩 데이터를 빼낸다.

종류

탐지 방법

  1. 모든 입력 지점(파라미터, 헤더, 쿠키까지)에 ', ", ) 같은 특수문자를 넣어 에러 반응 확인
  2. 에러가 안 보이면 AND 1=1 / AND 1=2 페어로 응답 차이 확인 (Boolean-based)
  3. 그래도 차이가 없으면 AND SLEEP(5)로 시간 지연 확인 (Time-based)
  4. sqlmap -u "<url>" --batch로 자동화하되, 어디서 어떻게 판단했는지는 직접 이해하고 있어야 오탐/false negative를 줄일 수 있다

방어

Web 카테고리의 글 (1/11)

  1. SQL Injection: 원리, 탐지, 방어
  2. XSS (Cross-Site Scripting): Stored / Reflected / DOM 차이와 방어
  3. CSRF (Cross-Site Request Forgery): 원리와 방어
  4. IDOR / BOLA: 권한 검증이 빠졌을 때
  5. SSRF (Server-Side Request Forgery): 서버가 대신 요청하게 만들기
  6. 파일 업로드 취약점: 웹쉘로 이어지는 경로
  7. 안전하지 않은 역직렬화 (Insecure Deserialization)
  8. SSTI (Server-Side Template Injection): 원리와 탐지
  9. OS Command Injection: 원리와 필터 우회
  10. JWT 취약점: alg=none부터 알고리즘 컨퓨전까지
  11. Race Condition (TOCTOU) 취약점
XSS (Cross-Site Scripting): Stored / Reflected / DOM 차이와 방어 →