【问题标题】:Tomcat Virtual Host to prevent Improper-Input-Handling attackTomcat 虚拟主机以防止不当输入处理攻击
【发布时间】:2017-10-18 16:07:02
【问题描述】:

我目前正在尝试修复站点漏洞,基本上它是一种“输入不当”攻击。

假设我的网站是 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

破解:

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 

我的网站在 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>

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

提前谢谢你。

这里有更多关于攻击的参考: http://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html

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

【问题讨论】:

  • 我使用你的代码,但它总是给我响应 200 OK。
  • 你可能想发布你的配置,没有更多细节,我不能肯定地说出了什么问题。

标签: security tomcat tomcat7


【解决方案1】:

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

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

基本上我做错的是在我的defaultlocalhost 中缺少appBase

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

  </Host>

每当发送非法请求时,上述配置成功返回 404 状态。原因是当你不设置 appbase 时,它总是默认为 webapps 所以它基本上没有对我原来的配置做任何事情。

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

2020 年 7 月 10 日更新 可以通过添加 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>

【讨论】:

  • 我们需要做什么来发送 403(未授权)响应而不是 404(未找到)?
【解决方案2】:

虽然在提出这个问题时它并不存在,但Tomcat 7.0.87 在连接器上引入了一个新属性allowHostHeaderMismatch(参见documentation)。如果将其设置为 false(自 Tomcat 9.0 起默认设置),只要 Host 标头与请求行不匹配,Tomcat 就会返回 400 Bad Request 错误:

<Connector port="8080" allowHostHeaderMismatch="false" />

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2021-06-19
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2023-03-04
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多