[AWS LAMP] 호스트 헤더 인젝션(Host Header Injection) 공격 방어 설정방법
Host Header 공격이란?
브라우저가 서버에 요청할 때 이런 헤더가 있습니다.
GET / HTTP/1.1
Host: 당신의 도메인주소.co.kr
그런데 공격자는 이렇게 보낼 수 있습니다.
Host: evil-site.com
Apache가 이걸 그대로 받아들이면
사이트 내부에서 잘못된 도메인으로 처리될 수 있습니다.
실제 공격 시나리오
예를 들어 사이트에서 이런 코드가 있다고 가정
$url = "https://" . $_SERVER['HTTP_HOST'] . "/reset-password";
공격 요청
Host: attacker.com
결과
https://attacker.com/reset-password
이걸 이용하면
- 비밀번호 reset 링크 변조
- 이메일 링크 변조
- SEO poisoning
가능합니다.
테스트 방법
AWS Lightsail 콘솔에서 SSH 터미널에 아래와 같은 명령어를 실행했을때 소스코드가 보인다면 바로 조치를 취해야합니다.
curl -H "Host: evil.com" https://당신의도메인주소.co.kr
위 명령어는 웹 보안 취약점 점검 시 자주 쓰이는 호스트 헤더 인젝션(Host Header Injection) 공격 테스트입니다.
웹 서버가 Host 헤더를 검증하지 않고 그대로 받아들이면, 악의적인 도메인으로 비밀번호 재설정 링크가 발송되거나 캐시가 오염되는 등의 보안 문제가 발생할 수 있습니다.
가장 확실한 방어 방법은 웹 서버(웹 서비스 데몬) 단에서 설정하는 것이며, 차선책으로 PHP 단에서 방어할 수도 있습니다.
방어가 완벽하게 적용되었다면, 정상적인 HTML 대신 다음과 같은 결과가 나와야 합니다.
- 웹 서버(Nginx)에서 444 코드로 차단한 경우:
curl: (52) Empty reply from server(응답 없이 연결 끊김) - 웹 서버(Apache)나 PHP에서 400/403으로 차단한 경우: 짧은 에러 텍스트나 기본 400/403 에러 HTML만 출력됨

웹 서버(Apache) 설정으로 막는 방법
Apache 환경에서 이 공격을 가장 직관적이고 확실하게 막는 방법은 mod_rewrite 규칙을 사용하여 허용된 도메인이 아닌 요청을 403(Forbidden) 에러로 강제 차단하는 것입니다.
#Host 헤더 차단 코드
<IfModule mod_rewrite.c>
RewriteEngine On
# Host 헤더가 도메인주소.co.kr이 아니고
RewriteCond %{HTTP_HOST} !^도메인주소\.co\.kr$ [NC]
# Host 헤더가 www.도메인주소.co.kr도 아니라면
RewriteCond %{HTTP_HOST} !^www\.도메인주소\.co\.kr$ [NC]
# 403 Forbidden 에러를 반환하고 즉시 접속 차단
RewriteRule ^ - [F,L]
</IfModule>
AWS Lightsail 콘솔에서 SSH 터미널을 엽니다.
위 코드를 아래 파일 2개에 추가해주어야 합니다.
sudo nano /opt/bitnami/apache/conf/bitnami/bitnami.conf
sudo vi /opt/bitnami/apache/conf/bitnami/bitnami-ssl.conf
에디터는 nano, vi에디터 중에 편한 방식을 사용하세요

- 파일 내용 중
<VirtualHost _default_:80>블록과<VirtualHost _default_:443>블록 안쪽에 위 차단 코드를 각각 붙여넣습니다. Ctrl + O를 눌러 저장 후Enter,Ctrl + X를 눌러 에디터를 빠져나옵니다.- Apache 서버를 재시작하여 설정을 적용합니다.
sudo /opt/bitnami/ctlscript.sh restart apache
PHP 단에서 막는 방법 (서버 설정 변경이 어려울 때)
호스팅 환경 등의 이유로 웹 서버 설정 파일을 직접 건드릴 수 없다면, 모든 페이지에서 최우선으로 로드되는 공통 파일(예: db_conn.php의 최상단)에 아래 코드를 추가하여 방어할 수 있습니다.
<?php
// 허용할 도메인 목록을 정확히 지정
$allowed_hosts = ['도메인주소.co.kr', 'www.도메인주소.co.kr'];
// HTTP_HOST 변수 가져오기 (포트 번호가 붙어올 수 있으므로 제거)
$http_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$host_parts = explode(':', $http_host);
$host_name = $host_parts[0];
// 허용된 도메인이 아니면 즉시 실행 중단
if (!in_array($host_name, $allowed_hosts)) {
// 400 Bad Request 응답 코드를 보내고 실행 종료
http_response_code(400);
die('Invalid Host Header');
}
// ... 이후 정상적인 로직 (DB 연결 등) 실행 ...
적용을 마치고 다시 curl -H "Host: evil.com" https://everhealth.co.kr 명령어를 실행했을 때, 길고 복잡한 전체 HTML 대신 짧은 403 Forbidden 에러 메시지만 출력된다면 완벽하게 방어에 성공하신 겁니다.
[연관글]
[AWS LAMP] 이미지 업로드 + PHP 조합에서 발생하는 RCE 취약점 처리 방법 : Magic Byte (MIME) 검증 및 업로드폴더 php 실행 금지 처



