콘텐츠 스푸핑(Content Spoofing)은 악의적인 공격자가 텍스트 삽입(Text Injection) 또는 HTML 삽입(HTML Injection) 기법을 이용해 가짜 웹사이트를 마치 정상적인 사이트처럼 보이게 만드는 공격을 의미합니다.
웹 애플리케이션이 검색 결과나 오류 메시지 등에서 사용자가 입력한 데이터를 적절하게 검증하지 않고 처리하면, 공격자는 이를 악용해 사용자가 눈치채기 어려운 추가 매개변수를 삽입할 수 있습니다. 그 결과 사용자는 원본 페이지와 거의 동일하게 보이는 다른 웹 페이지로 유도되며, 해당 페이지는 아이디, 비밀번호, 카드 정보 같은 기밀 데이터를 입력하도록 요구해 심각한 피해로 이어질 수 있습니다.
콘텐츠 스푸핑의 두 가지 기본 유형
- HTML 삽입(HTML Injection)
- 텍스트 삽입(Text Injection)
1. HTML 삽입(HTML Injection)
HTML 삽입 공격은 다음과 같은 단계로 진행됩니다.
- 공격자가 보안에 취약한 웹 애플리케이션을 탐색합니다.
- 공격자는 HTML 코드가 삽입된 조작된 URL을 주로 이메일 등의 경로로 피해자에게 전송합니다.
- 피해자가 해당 URL을 클릭하면 정상 사이트와 똑같아 보이는 공격자의 웹 페이지로 이동합니다.
- 피해자에게 아이디, 비밀번호, 카드 비밀번호(PIN) 등 민감한 정보를 입력하도록 유도합니다.
- 입력된 정보는 공격자의 서버로 전송됩니다.
공격 예시
일부 사이트는 화면에 표시할 HTML 콘텐츠를 URL 매개변수로 그대로 전달하기도 하는데, 특히 div 태그 안에 삽입되는 경우 심각한 취약점이 됩니다.
www.testing.com/siteAdcontent?divMessage=<h1>Click Here!!</h1>
공격자는 위 URL을 다음과 같이 변조할 수 있습니다.
www.testing.com/siteAdcontent?divMessage=<hack><h1>Do not Click!!</h1></hack>
이렇게 되면 페이지에는 공격자가 의도한 가짜 문구가 그대로 노출되어 사용자를 속일 수 있습니다.
2. 텍스트 삽입(Text Injection)
텍스트 삽입 공격은 다음과 같은 방식으로 진행됩니다.
- 공격자가 보안에 취약한 웹 애플리케이션을 탐색합니다.
- URL에 전달되는 매개변수 값을 임의로 변조합니다.
- 변조된 페이지 요청 링크가 생성되어 전달됩니다.
- 정상적인 웹 페이지임에도 매개변수 값에 따라 거짓 정보를 화면에 표시합니다.
- 주로 메시지가 요청 매개변수(request parameter)를 통해 전달될 때 발생합니다.
공격 예시
www.testing.com/loginAction?userName=abc&password=123
위와 같은 정상 요청 URL에 공격자는 다음과 같은 매개변수를 덧붙일 수 있습니다.
www.testing.com/loginAction?errorMessage=PasswordEmpty
이렇게 조작된 URL로 접속하면 실제로는 정상 페이지임에도 "비밀번호가 비어 있습니다" 같은 허위 오류 메시지가 표시되어 사용자에게 혼란과 불신을 줄 수 있습니다.
콘텐츠 스푸핑 예방 방법
- 사용자 입력값은 반드시 서버 측에서 검증하고, 특수문자와 HTML 태그는 이스케이프(Escape) 처리합니다.
- 화면에 표시되는 메시지는 URL 매개변수로 직접 받지 말고, 서버에 정의된 고정된 메시지만 사용합니다.
- 오류 메시지 등은 코드 값(code)만 전달하고 실제 문구는 클라이언트에서 매핑하도록 설계합니다.
- 콘텐츠 보안 정책(CSP)을 설정해 외부에서 삽입된 스크립트 실행을 차단합니다.
콘텐츠 스푸핑은 피싱(Phishing)으로 이어지기 쉬운 대표적인 웹 취약점입니다. 사용자 입장에서는 URL의 매개변수를 주의 깊게 확인하고, 의심스러운 링크는 클릭하지 않는 습관이 무엇보다 중요합니다.