Tomcat虚拟主机可防止不正确的输入处理攻击

Cha*_*esC 9 security tomcat tomcat7

我目前正在尝试修复网站漏洞,基本上它是一种"错误的输入处理"攻击.

假设我的网站是 www.mywebsite.com ,还有黑客的网站www.hacker.com

每当有请求发送到www.mywebsite.com并且修改后的" Host"标题指向www.hacker.com时,我的网站将创建一个重定向到www.mywebsite.com以及它的网址.例如

正常:

Host: www.mywebsite.com 
GET  www.mywebsite.com/get/some/resources/
Reponse 200 ok
Run Code Online (Sandbox Code Playgroud)

哈克:

Host: www.hacker.com (#been manually modified) 
GET  www.mywebsite.com/get/some/resources/
Response 302 
Send another Redirect to www.hacker.com/get/some/resources 
Run Code Online (Sandbox Code Playgroud)

我的网站是在Tomcat 7上运行的,我尝试了一些解决方案,通过将未知主机设置为虚拟主机defaultlocalhost,假设什么都不做.但它仍然出于某种原因发送重定向.

这附件是我的server.xml主机配置:

<Engine name="Catalina" defaultHost="defaultlocalhost" jvmRoute="jvm1">  
<Host name="www.mywebsite.com"  appBase="webapps"
        unpackWARs="true" autoDeploy="false" deployOnStartup="true">

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Host>

  <Host name="defaultlocalhost"  >

  </Host>
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,我是否在正确的轨道上防止这种攻击?如果是的话,我做错了什么仍然无效?(最终目标是,如果它不是传入的合法主机,请求应该被丢弃/忽略/返回404但不能重定向302)

先感谢您.

有关此次攻击的更多参考资料:http: //www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html

http://projects.webappsec.org/w/page/13246933/Improper%20Input%20Handling

Cha*_*esC 4

哦,好吧,最后回答我自己的问题。

加入Tomcat用户邮件列表后(订阅邮箱地址:users@tomcat.apache.org)。有一个叫安德烈的人帮助我解决了这个问题:

基本上我做错的事appBase在我的defaultlocalhost

  <Host name="defaultlocalhost" appbase="whatever" >

  </Host>
Run Code Online (Sandbox Code Playgroud)

每当发送非法请求时,上述配置都会成功返回 404 状态。原因是,每当您不设置它时,appbase它总是默认为webapps,因此它基本上没有对我的原始配置执行任何操作。

希望这可以帮助任何遇到类似问题的人。

更新 7/10/2020 可以通过添加 RemoteAddrValve 并阻止所有 ip 来返回 403。该示例基于 Tomcat 9。 http://tomcat.apache.org/tomcat-9.0-doc/config/host.html#Request_Filters

<Host name="defaultlocalhost" appbase="whatever">
           <!-- deny all remote addresses to this host -->
            <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                    deny="\d+\.\d+\.\d+\.\d+"/>
</Host>
Run Code Online (Sandbox Code Playgroud)