一、host头攻击介绍
1、介绍(这段介绍是从网上copy的,关于它的处理是我自己总结,整理的)
这个Host头是在客户端的请求头中的,是由客户端提供的,也就是说客户端可以修改这个值。那么,只要是能被客户端修改的值,都是不可信任的。
当Host头部被修改为无效Host头会发生什么情况?大多数web服务器配置为将无法识别的Host头传送给列表中的第一台虚拟主机或者返回错误信息。因此,这使得把携带有任意Host头的请求发送到第一台虚拟主机上是可能的。
很多应用直接把Host值不做html编码便输出到了页面中,比如:
//触发一个get请求 //触发POST请求当Host字段被修改为攻击者构造的恶意地址,这时,就会触发恶意请求。
这样处理问题一般会很容易遭遇到两种常见的攻击:缓存污染和密码重置。缓存污染是指攻击者通过控制一个缓存系统来将一个恶意站点的页面返回给用户。密码重置这种攻击主要是因为发送给用户的内容是可以污染的,也就是说可以间接的劫持邮件发送内容。
2、危害
为了方便的获得网站域名,开发人员一般依赖于HTTP Host header,但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。甚至来说,如果不处理的话,host头中也会存在xss漏洞。
二、host头攻击的处理
1、web服务器方面(这里以nginx为例)的处理
nginx(它的配置如图):设置server_name,同时,不要忘记配置一个默认的server,让其放在第一个,因为如过host头没有匹配到server(server_name)的话,会隐性的将第一个server作为默认server,之前没注意到default_server这点,导致即使是绑定了server_name后,也一直存在这个问题。
这里大家可以通过访问 242244.cn,001148.cn,自定义host(如下图)来看效果
apache和tomcat的话,也需要注意下配置下默认的绑定域名。
2、代码上的处理
这里可以自定义一个全局的过滤器(顺序放在其他过滤器的前面,优先执行)来处理这个,过滤器中进行的处理如下:
首先需要自定义host白名单,定义在配置文件,或者是数据库中都可以,在每次请求过来之前,优先将请求的host (获取方式:request.getHeader(“Host”))与白名单中的host列表(出于性能考虑,可以将白名单放到缓存,或者是读取后将其用静态变量来接收,避免每次请求都读取文件或者数据库,以提升性能)进行比较,如果在白名单中,则放行,如果不在白名单中,可以进行拦截的操作,返回错误页面,403啥的都可以。注意一点:采用这种方式的话,如果是非前后端分离的项目(大多为之前的老项目),不仅仅需要对action/controller接口做过滤, 同时也要对css,js文件进行host头过滤。