1. Host header

服务器的域名(用于虚拟主机 ),以及服务器所监听的传输控制协议端口号。如果所请求的端口是对应的服务的标准端口,则端口号可被省略。

自超文件传输协议版本1.1(HTTP/1.1)开始便是必需字段。

以上是维基百科中对于Host头部的说明。可以看到Host头部并非是用于区别发送到哪台主机的字段。而是用于区分一台主机上不同的虚拟主机。(可以在Apache和Nginx中配置相应Host对应的虚拟主机。

利用PHP可以在 $_SERVER['HTTP_HOST'] 字段中获取到该字段的值

var_dump($_SERVER['HTTP_HOST']);

当没有配置虚拟主机或者匹配不到对应的Host主机时,webserver就会发送请求到默认的目录中去解析

从而Host头部就变成了一个可控的字段,当一些应用程序没有对$SERVER[‘HTTP_HOST’]字段进行处理,过分信任时,就会产生一些安全问题

2. Diff of win/linux

这里用的测试环境分别是

win10下的 phpstudy

ubuntu 18.04中默认安装的nginx和apache2

在1.php中会输出$_SERVER[‘HTTP_HOST’]变量

2.1 Windows

可以任意修改apache中的值,服务器都会默认接受

甚至可以插入两个Host头部,在win下会用,将两个头部相连

Host: localhost

Host:123468

Nginx

nginx中对于任意脏字符都是允许修改的

但是在插入两个Host头部的时候只会获取到第二个Host值

Host: localhost

Host: 'select user();

2.2 Linux

但是在linux中又会有些不同

Apache

linux下的apache就有着较为严格的限制,只允许修改对应的ip数字

插入一些脏字符就会返回400的错误

Host: 192.168.85.145'

两个头部也是一样的情况,即使头部是合法的

Host: 192.168.85.145

Host: 192.168.85.145

Nginx

linux下nginx中对于Host的处理类似于win中的就不过多介绍

从而网上有一些防御手段就变成了设置虚拟主机(virtual host),从而可以确保Host字段不会被更改,因为一旦修改了Host字段就不会解析到对应的目录当中。

3. Virtual Host

但即使配置了虚拟主机之后,所接受的Host字段就是可以信任的么?

在Apache、Nginx中会呈现不同的状态

测试环境为

Apache/2.4.29 (Ubuntu)

nginx/1.14.0 (Ubuntu)

PHP 7.2.10-0ubuntu0.18.04.1

至于虚拟主机配置的部分就不过多介绍,在网上可以找到很多配置的文章

至于域名,可以买一个域名修改解析,或者直接修改host文件

然后在/var/www目录下新建了三个文件夹

html 默认主目录

apache Apache的虚拟主机目录

nginx Nginx的虚拟主机目录

3.1 Apache

可以看到,在配置了虚拟主机之后,访问对应的域名就会访问到对应的目录中

Host: localhost.ba123.top

当遇到一个不认识的域名的时候,就会解析到默认目录下(当然,假如默认目录下没有1.php这个文件就会返回一个404

Host: localhost.ba123.to

那想攻击Apache中的虚拟主机时Host字段就不能添加别的脏字符了么?目前找到的可以添加的就只有通过冒号:分割开的端口号

只要是一个合法的端口就可以发起正常的请求

Host: localhost.ba123.top:23333

但是当想插入一些字符或者端口号过大的时候,都会拒绝请求,返回一个400,更不会允许两个Host头部的请求

Host: localhost.ba123.top:23333'select

总体来说,Apache对于Host字段的限制还是比较严格的,在开启了虚拟主机之后,几乎比较难以插入脏字符。

3.2 Nginx

在nginx中似乎有着更多的攻击手法

对于未知的主机名,处理方式还是与apache中一致,会解析到默认目录中

Host: localhost.ba123.to'select

但是这里假如利用冒号:的形式分割之后,冒号后面的port部分会直接被nginx给抛弃,从而可以插入任意的字符

Host: localhost.ba123.top'select sleep(5);

甚至在nginx中可以传入两个Host头部,Nginx将以第一个为准传送到对应的虚拟主机处理,而PHP-FPM将以第二个为准给$_SERVER[‘HTTP_HOST’]赋值。

Host: localhost.ba123.top

Host:'select sleep(5);

但是在apache中传入两个Host头部的时候,就会直接返回400

由此可见,在ngin中对于Host的并没有做过多的限制,从而可以比较容易的进行Host头部攻击。

windows上的虚拟主机原谅我确实没怎么遇到过,就没测试了,感兴趣的可以自己测试下。

4. Summary

可以看到Host头部,在不同的情况下会呈现出不同的状态,因此在编写程序的时候一定要将Host这个值设置为不可信任的,对其进行一些正则或者转义的一些过滤。否则极易引发安全问题。

在windows下对于这种头部的限制比较松,apache和nginx都能比较轻松的绕过去。

而在两个服务器相比,Apache对于数据的解析更加严谨,尤其是在linux的环境中,极大的限制了非法的请求。

Nginx则甚至会出现Nginx与PHP-FPM解析不一致的情况,有时这种解析不一样甚至会带来更多的危害。

5. Reference

https://www.leavesongs.com/PENETRATION/some-tricks-of-attacking-lnmp-web-application.html

php host头攻击,Apache/Nginx中Host头攻击的一些差异相关推荐

  1. apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名

    2019独角兽企业重金招聘Python工程师标准>>> 前两天做了个项目,让同事拿去投标,为了给用户演示,需要外网访问,于是配置了apache代理.随之问题就来了,外网访问的时候,r ...

  2. php 头bom_关于php中bom头的简介

    关于php中bom头的简介 发布时间:2020-06-30 17:48:12 来源:亿速云 阅读:99 作者:清晨 这篇文章主要介绍关于php中bom头的简介,文中示例代码介绍的非常详细,具有一定的参 ...

  3. oracle监听host配置,监听器listener.ora中HOST参数配置

    4.Host使用IP地址 下面使用IP地址配置Host的情况,修改listener.ora文件. [Oracle@SimpleLinux admin]$ cat listener.ora # list ...

  4. c语言头文件和源文件_C语言头文件防卫式声明

    C语言一般提供三种预处理功能:宏处理.文件包含.条件编译.头文件防卫式申明中会用到条件编译中 #ifndef.#define.#endif 的用法.所以,首先价绍下条件编译. 1 条件编译 一般情况下 ...

  5. 硅谷来信丨一招阻击恶意软件攻击:沙箱集成MITRE ATTCK攻击框架

    现今的网络威胁不断地演化,攻击的类型和数量每年都在急剧增长.越来越多的企业和组织发生了被黑客侵入的事件. 每当被入侵以后,组织或企业的安全管理员都会问,"攻击者是怎么进来的"?&q ...

  6. 检测到目标URL存在http host头攻击漏洞(中风险)

    漏洞描述 为了方便的获得网站域名,开发人员一般依赖于HTTP Host header.例如,在php里用_SERVER["HTTP_HOST"].但是这个header是不可信赖的, ...

  7. nginx中proxy_set_header Host $host的作用

    http://4856809.blog.51cto.com/4846809/1188931 nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块.其中proxy_ ...

  8. http响应Last-Modified和ETag以及Apache和Nginx中的配置

    基础知识 1) 什么是"Last-Modified"? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属 ...

  9. Nginx 提示host not found in upstream 错误解决方法

    Nginx 提示host not found in upstream 错误解决方法 参考文章: (1)Nginx 提示host not found in upstream 错误解决方法 (2)http ...

最新文章

  1. 互联网技术的技术名词
  2. Securing Session State
  3. ETH网络要爆炸,未来Token的最佳选择注定是BCH
  4. IOS-webService
  5. HJ106 字符逆序
  6. 百练162:Post Office
  7. 二叉树前序、中序、后序遍历求法
  8. 京东最新点击率预估模型论文学习和分享
  9. 损失函数,梯度下降与牛顿法
  10. Visual Studio 内存泄漏检测方法
  11. 循环、格式化输出、数据统计
  12. scrapy —— ImagePipeline
  13. 6位数密码C++破解程序,并附上时间
  14. 初学“深入浅出MFC”之零篇
  15. bitvise SSH 打开代码中文显示乱码的问题
  16. 实现一个二维码支持微信和支付宝同时收付款
  17. 如何制作出漂亮精致的思维导图?MindNow来帮你
  18. 计算机技术论文搜索引擎,垂直搜索引擎核心技术研究及展望论文
  19. WES分析7-VCF
  20. win10安装配置JDK11

热门文章

  1. 更换group.id时kafka从哪开始消费
  2. 修改Intelij IDEA的maven下载地址为国内阿里云镜像
  3. ACE_Reactor(二)ACE_Dev_Poll_Reactor
  4. 论文笔记:Inception v1
  5. codeforces654题解_[codeforces 1374A] Magical Sticks 棍子拼接
  6. python 多分类 recall_python实现二分类和多分类的ROC曲线教程
  7. 210串口控制台-210移植printf不好使
  8. STM32启动BOOT0 BOOT1设置方法 [
  9. FreeRtos 那点事
  10. [ BZOJ 2456 ] Mode