[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로 참/거짓 또는 응답 시간 차이를 이용해 한 글자씩 데이터를 빼낸다.
SLEEP(5) 같은 구문을 넣어 응답 지연 유무로 판단 — 응답 내용이 전혀 달라지지 않을 때 마지막 수단', ", ) 같은 특수문자를 넣어 에러 반응 확인AND 1=1 / AND 1=2 페어로 응답 차이 확인 (Boolean-based)AND SLEEP(5)로 시간 지연 확인 (Time-based)sqlmap -u "<url>" --batch로 자동화하되, 어디서 어떻게 판단했는지는 직접 이해하고 있어야 오탐/false negative를 줄일 수 있다