Java HTTP Host 头攻击原理以及如何防御

JAVA herman 719浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

很对微信群里的网友,我都称他们为老铁,从来不称兄道弟的,因为我觉得不真实。不向某东,说一套做一套。

其实你只要认真对待大家,大家都会看在心里,你们说是不是!

host 漏洞

对于 Java 程序员来说,一个服务器上跑多个程序是非常常见的现象。

但是这样做后会有一个问题,那就是容易造成 Host 头攻击。这也是之前微信群里一个网友遇到的问题。今天我在这里给大家扯一扯。

host 头(host header或称主机头)攻击,非常常见。比如,在 jsp 中,我们通常可能存在类似下面的代码。

<script type="text/javascript" src="<%=path%>/js/zcms/zDrag.js"></script>
<script src="<%=request.getContextPath() %> /manage/test.js"></script> 
<script type="text/javascript" src="${pageContext.request.contextPath }/scripts/a.js"></script>

上面的几种加载路径,背后都是通过 host 取得 url 地址,再拼接上固定的内容。

这个时候,假如我把你的 host 头给改掉了,比如改成我的 www.xttblog.com。然后这时你在加载的 js 文件,可能就来源于我的网站中已做好陷阱的 js 文件了。

这样,黑客就能拿到你的 cookie、用户名、密码等关键数据。这就是著名的 host 头攻击。

更有甚者,在你的网站上放入病毒,挖矿等代码。而你还不知道你被利用了。

代码规范

那么该怎么解决这类问题呢?很简单,下面我们以 Nginx 为例,只需要修改一下配置文件即可。Apache 我就不举例了。

server {
   listen 8888 default;
   server_name _;
   location / {
        return 403;
   }
}

添加一个默认 server,当 host 头被修改匹配不到 server 时会跳到该默认 server,该默认 server 直接返回 403 错误。

重启 nginx 即可。

除了这种做法,也可以在目标 server 添加检测规则。比如下面的 if 判断配置。

server {
  server_name  192.168.0.171;
  listen       8888;
  if ($http_Host !~*^192.168.0.171:8888$){
    return 403;
  }
  include /etc/nginx/default.d/*.conf;
  location / {
    root /www/dvwa;
    index index.php index.html index.htm;
  }
}

另外,在 Tomcat 的配置文件,我们也可以直接配置 Host 的 name 为具体的 ip 地址,不要配置 localhost。

<Host name="localhost"  appBase="webapps"  
            unpackWARs="true" autoDeploy="true"  
            xmlValidation="false" xmlNamespaceAware="false"> 
          <Alias>10.1.8.158</Alias><!--10.1.8.158 本地局域网-->  
   <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
              prefix="localhost_access_log." suffix=".txt"  resolveHosts="false"  
              pattern="%a %A %b %B %h %H %l %m %p %s %S %t %u %U %v %D %T" />  
</Host>

说白了,这个漏洞是因为你使用了 Host 而没验证它。

String path = request.getContextPath();
String basePath = request.getScheme() + "://" 
  + request.getServerName() 
  + ":" + request.getServerPort() 
  + path + "/";

目前,绿盟、burpsuite、360 等工具都可以对这一漏洞进行检测!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Java HTTP Host 头攻击原理以及如何防御