웹사이트 보안 이야기: 로그와 방어 전략

밤을 새우며 작업하다 보니, 늙은 나이임에도 잠을 미루게 되었다. 어차피 아침에 못 일어날 것 같으니 글이나 하나 쓰고 자야겠다는 생각에, 현재 운영 중인 naver.how의 로그를 살펴보게 되었다. 시작 소재가 매거진 주제를 결정한다고 하니, 이참에 보안 매거진에 잠시나마 글을 남겨두려 한다.

웹사이트 로그로 보는 해킹 시도

로그 파일을 보니 방글라데시에서 봇을 이용한 로그인 시도가 끊임없이 이어지고 있다. 이런 무차별적인 로그인 시도는 웹사이트 운영에서 흔히 마주치는 보안 위협이다. 전문가들이 흔히 알려주는 대응 방법으로는 로그인 페이지의 URL을 변경하는 방법이 있다. 특히 해시 코드 페이지로 바꾸면 봇들이 접근하기 어려워진다. 사이트 업데이트가 더 이상 필요 없어지는 시점이 오면 그렇게 해볼 계획이다.

SQL 인젝션: 고전적이지만 여전히 위험한 공격 기법

SQL 인젝션은 1998년경 처음 발견된 이후 20년이 넘게 지난 지금까지도 OWASP Top 10 웹 애플리케이션 보안 위험 목록에 계속 이름을 올리고 있는 고전적이면서도 치명적인 공격 기법이다. 이 공격의 핵심은 웹 애플리케이션이 사용자 입력을 적절히 검증하지 않은 채 데이터베이스 쿼리에 직접 포함시킬 때 발생한다.

SQL 인젝션의 작동 원리

간단한 예를 들어보자. 다음과 같은 로그인 쿼리가 있다고 가정해보자:

SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password'

공격자는 username 필드에 admin' --와 같은 값을 입력할 수 있다. 이 경우 쿼리는 다음과 같이 변형된다:

SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'anything'

여기서 --는 SQL의 주석 처리 구문으로, 이후의 모든 코드를 무시하게 만든다. 따라서 비밀번호 확인 절차가 완전히 우회되고, 관리자 계정으로의 무단 접근이 가능해진다.

더 심각한 경우, 공격자는 '; DROP TABLE users; --와 같은 입력을 통해 데이터베이스 테이블을 삭제하거나, '; UPDATE users SET password='hacked' WHERE username='admin'; --와 같은 코드로 관리자 비밀번호를 변경할 수도 있다.

SQL 인젝션 방어 전략

개인용 PC에 카스퍼스키 같은 보안 솔루션을 설치하듯이, 웹사이트에도 전문 방어 솔루션을 설치하면 대부분의 SQL 인젝션 공격은 효과적으로 방어할 수 있다. 그러나 근본적인 해결을 위해서는 다음과 같은 방어 전략이 필수적이다:

  1. 매개변수화된 쿼리(Prepared Statements) 사용: 사용자 입력을 SQL 문의 매개변수로 처리하여 실행 컨텍스트와 데이터를 분리한다.
// 취약한 코드
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

// 안전한 코드 (PHP PDO 사용)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
  1. ORM(Object-Relational Mapping) 사용: Django, Hibernate, Entity Framework 같은 ORM은 SQL 쿼리를 직접 작성하지 않고 객체 지향적 방식으로 데이터베이스에 접근하게 해준다.
  2. 입력 검증 및 필터링: 모든 사용자 입력에 대해 타입, 형식, 길이, 범위를 검증하고, 특수 문자를 이스케이프 처리한다.
  3. 최소 권한 원칙 적용: 웹 애플리케이션의 데이터베이스 계정은 필요한 최소한의 권한만 가져야 한다.
  4. WAF(Web Application Firewall) 사용: WAF는 SQL 인젝션을 포함한 일반적인 웹 공격 패턴을 탐지하고 차단할 수 있다.

흥미로운 점은 평판이 좋은 웹사이트 이름을 사칭하며 공격이 이루어지는 경우가 많다는 것이다. 서비스를 운영하는 담당자나 회사 대표들은 이런 상황을 자세히 알지 못하는 경우가 많다. 과거를 돌이켜보면, 학교 컴퓨터실이나 PC방에서 매크로를 돌리던 사람들도 실제 시설 소유주가 아니었던 것처럼 말이다.

방화벽과 IP 추적

내 서버는 작지만, 보안 솔루션 외에도 방화벽에 특별한 규칙을 적용해 두었다. 잦은 접속 시도를 자동으로 차단하는 규칙이 그것이다. 또한 모든 접속 시도는 IP 주소가 로그에 기록된다.

IP 주소는 생각보다 많은 정보를 담고 있다. KT와 같은 통신사에서 고정 IP를 할당받은 사용자라면, 그 사용자를 100% 특정할 수 있다. 일반 가정용 인터넷의 경우에도 IP 대역을 통해 대략적인 위치(아파트 동 단위)까지는 추적이 가능하다.

더 나아가 내 웹사이트에 로그인 기능을 추가하면(사실 워드프레스 솔루션에는 이미 기본으로 포함되어 있다) 사용자를 더욱 정확하게 특정할 수 있다. 회사를 운영할 때 계약했던 PASS 같은 본인인증 서비스를 연동하면 누가 접속했는지 100% 확인할 수 있게 된다.

개인정보 보호의 중요성

이처럼 인터넷상의 개인 정보는 기술적으로는 개인 웹사이트 운영자도 수집할 수 있는 상황이다. 물론 이와 관련된 법규가 있어 무분별한 개인정보 수집은 제한되어 있지만, 기술적으로는 가능하다는 점이 중요하다. 대부분의 사람들이 온라인 쇼핑몰에 가입할 때 이러한 개인정보 수집에 대해 꼼꼼히 따져보지 않고 동의하는 경우가 많다.

더 심각한 사례도 있다. 얼마 전 의뢰를 받아 내용을 공개했던 레플리카(가품) 사이트의 경우, 사용자 정보를 수집하여 중국에 판매하는 일까지 벌어지고 있었다. 이미 수많은, 아마도 한국인의 개인정보가 이런 경로로 판매되었을 것이다.

미래의 보안 대책

해외에서는 이러한 문제에 대응하기 위해 AI 자동응답 시스템을 활용하여 스팸과 불법적인 정보 수집을 차단하고 있다. 우리나라도 이런 기술의 도입이 시급한 상황이다.

디지털 세상에서 개인정보와 웹사이트 보안은 더 이상 전문가만의 영역이 아니다. 웹사이트를 운영하거나 단순히 인터넷을 사용하는 모든 이들이 기본적인 보안 지식을 갖추는 것이 중요한 시대가 되었다.

밤샘 작업 끝에 떠오른 이런 생각들을 적다 보니 어느새 아침이 다가오고 있다. 잠시 눈을 붙이러 가야겠다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다