•
개요
SQL 인젝션(SQL Injection)은 웹 애플리케이션에서 사용자 입력을 제대로 검증하지 않아 발생하는 보안 취약점 중 하나이다. 공격자는 웹 애플리케이션에 SQL 쿼리를 삽입해 데이터베이스에 악의적인 명령을 실행할 수 있다. 이 공격을 통해 공격자는 데이터베이스에서 정보를 탈취하거나 삭제하고, 심지어 관리자의 권한을 획득할 수도 있다.
•
공격 탐지 규칙 확인 및 설정 (Suricata & Zeek)
◦
Suricata
1.
Detection - “+”
Detection 메뉴 이동 및 “+”버튼 클릭, 룰 추가 메뉴 진입
2.
룰 작성
▪
Language : Suricata
▪
License : GPL-2.0-only
▪
Signature
alert http $EXTERNAL_NET any -> $HTTP_SERVERS any (msg:"SQL Injection Attempt - Dangerous SQL Keywords"; flow:established,to_server; http.uri; pcre:"/or|=|--|`/i"; fast_pattern; classtype:bad-unknown; sid:1000025;)
Plain Text
복사
•
룰 내용 (Signature):
◦
alert http: HTTP 프로토콜에 대한 경고를 발생시키는 룰입니다. 공격 탐지가 일어나면 해당 프로토콜을 감시합니다.
◦
$EXTERNAL_NET any: 외부 네트워크에서 발생하는 모든 트래픽을 대상으로 합니다. $EXTERNAL_NET 변수는 외부 네트워크를 의미하고, any는 모든 포트나 주소를 의미합니다.
◦
>: 트래픽의 방향을 나타내며, 외부 네트워크에서 HTTP 서버로 향하는 트래픽을 감시한다는 뜻입니다.
◦
$HTTP_SERVERS any: 감시 대상이 되는 HTTP 서버들로 향하는 모든 트래픽을 대상으로 합니다. $HTTP_SERVERS는 HTTP 서버를 정의한 변수이고, any는 모든 포트를 의미합니다.
◦
(msg:"SQL Injection Attempt - Dangerous SQL Keywords"): 경고 메시지로, 탐지된 패턴이 SQL 인젝션 시도로 감지되었을 때 "SQL Injection Attempt - Dangerous SQL Keywords"라는 메시지가 로그에 기록됩니다.
◦
flow:established,to_server: 연결이 성립된 상태에서 서버로 향하는 트래픽을 감시합니다. 이는 서버로 들어오는 요청을 대상으로 탐지를 진행한다는 의미입니다.
◦
http.uri;: HTTP 요청의 URI(Uniform Resource Identifier)를 대상으로 감시하는 옵션입니다. SQL 인젝션이 URI에 포함되어 있는지 확인합니다.
◦
pcre:"/or|=|--|/i": Perl Compatible Regular Expressions(PCRE) 기반으로 탐지할 패턴을 정의합니다. 여기서는 "or", "=", "--" 같은 SQL 키워드가 포함된 URI를 감시합니다. /i는 대소문자를 구분하지 않도록 설정합니다.
◦
fast_pattern: 탐지할 때 사용할 패턴을 빠르게 찾아내기 위해 사용하는 옵션입니다. 검색 속도를 향상시키기 위해 패턴의 일부를 먼저 탐색합니다.
◦
classtype:bad-unknown: 탐지된 공격의 유형을 분류합니다. 여기서는 bad-unknown으로, 알려지지 않은 나쁜 행위로 분류됩니다.
◦
sid:1000025: 이 경고의 고유 식별자(Snort ID)를 지정합니다. 다른 룰과 구분할 수 있도록 고유 번호를 부여합니다.
•
공격 지표 확인 및 경고 필터링 (Kibana&zeek)
◦
suricata
▪
알람 발생 확인
◦
kibana & zeek
▪
Alert 로그 발생 확인
▪
Document
▪
하단에서 자세히 확인 (message)
•
대응 방안
◦
입력값 검증 및 필터링
◦
Prepared Statements 사용
◦
ORM (Object-Relational Mapping) 사용
◦
데이터베이스 권한 최소화
◦
웹 애플리케이션 방화벽 (WAF) 설정
◦
에러 메시지 노출 방지
◦
로그 및 모니터링