安全矩阵

 找回密码
 立即注册
搜索
查看: 1048|回复: 0

详细配置,轻松防止Host头攻击

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-9-15 22:33:05 | 显示全部楼层 |阅读模式
MC思变安全 MC思变 2023-09-07 18:27 发表于河南

一、什么是Host头
在http请求包里,可以看到其中一个header是Host,这个字段是HTTP/1.1新增字段。
当访问URL为https://github.com时,可以看到Host是github.com,当访问URL为https://domain.com:8080/test时,Host为domain.com:8080。


广为人知的是,http请求属于应用层,其中的headers可被应用更改,也可以按照需要自定义headers。而Host,则是定义了客户端访问的的主机名和端口号,如此就可以根据host来定位应用,从而实现虚拟主机技术。
举个简单例子,如果想要在一台服务器上独立运行2个应用,就可以使用Host来将流量转发给不同的应用 如下图,当Host为siteA.com时,转发给A应用,Host为siteB.com时,转发给B应用

二、Host头攻击方式
受Host头攻击影响的站点,必然是站点中的功能,需要用到Host头的内容,举几个例子
  • localhost权限过大:网站后端允许host为localhost的流量进行任意操作操作,如增删改查
  • 302跳转:网站在进行302跳转时,使用了Host头
  • 链接拼接:网站进行链接生成时使用了Host头
当然,根据Host在网站功能上的作用不同,还会有其他的攻击方式,这个漏洞,每一个网站都有可能存在。
三、Host头攻击防御
对于Host头攻击的防御,大致分为两个方向:应用检测Host头、应用前置检测Host头。应用前置指的是逻辑上前置,并非物理上前置,也就是说HTTP请求应先到达前置,再到达应用。
[size=1em]1、修复核心——白名单
Host头攻击的利用,是将Host内容修改为非预期的Host,那防御目的也就成了防止非预期Host,因此,需要设置一个Host白名单,HTTP请求的Host如果在白名单中,则请求正常进行,否则将返回一个错误提示。
同时,如果设置白名单错误(如白名单中配置了www.testA.com,实际上正确域名是www.test.com),那么所有正常的请求都将被拒绝,整个网站的服务都将异常。
[size=1em]2、应用检测Host头
应用检测Host头,一般是在代码层面进行,通过代码提取HTTP请求包中的Host字段,与白名单进行匹配,这就需要各位开发大佬定位代码位置,添加关键代码了。
通过修改代码来检测Host头,难度较大,不建议使用。
[size=1em]3、应用前置检测Host头
在HTTP请求从互联网进入到内网之后,往往会经过很多设备的转发,而比较适合配置Host头检测的,就是Apache/Nginx,这两个中间件应用范围极广,配置白名单也较为简单。当然,如果网站使用了TongWeb,TongWeb自带有Host头检测模块,可以直接使用。
Apache配置Host检测配置方法一
  1. #修改ServerName为允许的Host
  2. ServerName www.domain.com:8080   

  3. #添加多个允许的Host
  4. ServerAlias a.com b.com   

  5. #使用规范的服务器名,当HTTP请求的Host不存在以上配置的名单里,则修改Host为www.domain.com:8080
  6. UseCanonicalName On
复制代码

配置方法二
  1. LoadModule rewrite_module modules/mod_rewrite.so
  2. RewriteEngine On

  3. #正则匹配
  4. RewriteCond %{HTTP_HOST} !^example\.com$ [NC]   

  5. #不符合RewriteCond的正则匹配时,拒绝请求
  6. RewriteRule ^ - [F]
复制代码


Nginx配置Host检测配置方法一
指定了有效的 server_name,只有请求的主机头是 example.com 或 www.example.com 才会被接受
  1. server {
  2.     listen 80;
  3.     server_name example.com www.example.com;

  4.     # 其他配置...
  5. }
复制代码

配置方法二
通过Nginx的if语句进行匹配,可以使用正则表达式,更加灵活,且返回的403验证码也更利于验证
  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     if ($http_host !~* "^example\.com$") {
  5.         return 403;
  6.     }

  7.     # 其他配置...
  8. }
复制代码
由于Host头的便利性,很多网站仍存在在网站功能中使用Host头的情况,使用Host的场景不同,造成的危害也有大有小。总之,这是一个值得修复的漏洞。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 07:38 , Processed in 0.013212 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表