原文地址: https://www.zhuyilong.fun/tech/handel_httphost_attack.html
漏洞描述
為了方便的獲得網站域名,開發人員一般依賴於HTTP Host header。例如,在php里用_SERVER["HTTP_HOST"]。但是這個header是不可信賴的,如果應用程序沒有對host header值進行處理,就有可能造成惡意代碼的傳入。
解決辦法
web應用程序應該使用SERVER_NAME而不是host header。
在Apache和Nginx里可以通過設置一個虛擬機來記錄所有的非法host header。在Nginx里還可以通過指定一個SERVER_NAME名單,Apache也可以通過指定一個SERVER_NAME名單並開啟UseCanonicalName選項。
具體步驟
項目代碼
程序編寫中避免使用HTTP_HOST,如有需要使用SERVER_NAME替代
nginx配置
- 配置文件中server_name上設置具體域名.eg:
server_name example.com;
- 在nginx上設置一個default_server處理其他域名來處理默認的請求.即,非設置域名返回一個http status code 4xx 的代碼
server{
listen 80 default_server;
server_name _;
return 400;
}
Apache配置
- 方法一: 修改\conf\httpd.conf配置文件中server_name,設置具體域名.eg:
ServerName example.com:80 # 指定域名和端口號
添加下列行
UseCanonicalName On # 使用指定的域名和端口號
- 方法二: 修改\conf\httpd.conf文件,參考以下配置添加:
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
ServerName 127.0.0.1
<Location />
Order Allow,Deny
Deny from all # 拒絕直接通過IP地址的任何訪問
</Location>
</VirtualHost>
<VirtualHost 127.0.0.1>
DocumentRoot "C:\www\example"
ServerName example.com # 僅允許通過域名訪問
</VirtualHost>
- 方法三: 修改\conf\httpd.conf文件,找到"#LoadModule rewrite_module modules/mod_rewrite.so"去除前面的"#"號,添加類似以下配置:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^127.0.0.1$ [NC]
RewriteRule ^(.*)$ /error.html
配置修改后都需要重啟nginx/apache