← 블로그 목록
작성일: 2026-05-14 SQL Injection보안WAF

웹 서버 로그에서 SQL Injection 공격 패턴 찾는 방법

SQL Injection(SQLi)은 OWASP Top 10에 매년 등장하는 치명적인 웹 취약점입니다. 공격이 시도된 흔적은 데이터베이스가 아닌 웹 서버 액세스 로그에 먼저 나타납니다. 로그 분석만으로도 공격 시도를 탐지하고 사전에 차단할 수 있습니다.


SQL Injection이 로그에 남기는 패턴

공격자는 URL 파라미터나 POST 바디에 SQL 구문을 삽입합니다.

`` GET /api/users?id=1+UNION+SELECT+table_name+FROM+information_schema.tables-- HTTP/1.1 GET /search?q='+OR+1=1+-- GET /product?sku=1;+DROP+TABLE+products;-- GET /login?user=admin'--&pass=x `

URL 인코딩된 패턴

` GET /api/data?id=1%27%20OR%20%271%27=%271 HTTP/1.1 GET /page?id=1%20UNION%20SELECT%20null,null,null-- HTTP/1.1 `

%27은 작은따옴표('), %20은 공백입니다.


주요 탐지 키워드


grep으로 SQLi 시도 탐지

`bash grep -iE "(union.select|or.1=1|drop.table|information_schema|sleep\(|benchmark\(|load_file|xp_cmdshell)" \ /var/log/nginx/access.log `

URL 인코딩 포함:

`bash grep -iE "(%27|%22|%3b|union|select|insert|delete|drop|exec)" \ /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn `


공격 시도의 단계별 패턴

1단계: 취약점 탐지

` GET /product?id=1' GET /product?id=1" `

오류 메시지 유발을 통해 SQL 파서 반응 확인

2단계: 컬럼 수 파악

` GET /product?id=1+ORDER+BY+1-- GET /product?id=1+ORDER+BY+5-- `

3단계: 데이터 추출

` GET /product?id=0+UNION+SELECT+1,database(),3,4-- GET /product?id=0+UNION+SELECT+1,username,password,4+FROM+users-- `


애플리케이션 코드 레벨 대응

SQL Injection의 근본적 해결은 파라미터 바인딩입니다.

취약한 코드 (PHP 예시):

`php $query = "SELECT * FROM users WHERE id = " . $_GET['id']; `

안전한 코드 (PDO 파라미터 바인딩):

`php $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$_GET['id']]); `


MITRE ATT&CK 매핑

패턴설명
------------
UNION SELECT다른 테이블 데이터 추출 시도
OR 1=1항상 참이 되는 조건으로 우회
information_schemaDB 메타데이터 조회 시도
DROP TABLE테이블 삭제 시도
SLEEP(, BENCHMARK(시간 기반 블라인드 SQLi
LOAD_FILE(, INTO OUTFILE파일 시스템 접근 시도
xp_cmdshellMSSQL 명령 실행 시도
공격 유형MITRE 기법설명
----------------------------
SQL InjectionT1190Exploit Public-Facing Application
DB 덤프 추출T1005Data from Local System
xp_cmdshell 실행T1059Command and Scripting Interpreter

정리

SQL Injection 공격은 로그에 UNION SELECT, OR 1=1` 같은 특징적인 문자열이 그대로 기록됩니다. 로그 모니터링으로 조기 탐지하고, 앱 코드에서 파라미터 바인딩으로 근본적인 방어를 갖추는 것이 핵심입니다.