1. 程式人生 > 實用技巧 >http host頭攻擊漏洞

http host頭攻擊漏洞

原文地址: 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配置

  1. 配置檔案中server_name上設定具體域名.eg:
    server_name example.com;
  1. 在nginx上設定一個default_server處理其他域名來處理預設的請求.即,非設定域名返回一個http status code 4xx 的程式碼
server{
    listen       80  default_server;
    server_name  _;
    return       400;
}

Apache配置

  1. 方法一
    : 修改\conf\httpd.conf配置檔案中server_name,設定具體域名.eg:
    ServerName example.com:80  # 指定域名和埠號

新增下列行

    UseCanonicalName On # 使用指定的域名和埠號
  1. 方法二: 修改\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>
  1. 方法三: 修改\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