Tomcat 防止 Improper-Input-Handling 攻击的虚拟主机
Tomcat Virtual Host to prevent Improper-Input-Handling attack
我目前正在尝试修复站点漏洞,基本上它是 "Improper Input Handling" 攻击的一种类型。
假设我的网站是 www.mywebsite.com
还有黑客的网站 www.hacker.com
每当有请求发送到 www.mywebsite.com 并修改“Host
” header 指向 www.hacker.com,我的站点将创建一个重定向到 www.mywebsite.com 以及 url 的任何内容。
例如
正常:
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 "%r" %s %b" />
</Host>
<Host name="defaultlocalhost" >
</Host>
所以,我的问题是,我是否在正确的轨道上防止这种攻击?如果是,我做错了什么仍然无法正常工作? (最终目标是,如果传入的不是合法的Host,请求应该是discard/ignored/return 404而不是重定向302)
提前谢谢你。
这里有更多关于攻击的参考资料:
http://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html
http://projects.webappsec.org/w/page/13246933/Improper%20Input%20Handling
哦,好吧,最后回答我自己的问题。
加入Tomcat用户邮件列表后(订阅邮箱:users@tomcat.apache.org)。
有个叫安德烈的人帮我解决了这个问题:
基本上我做错的是 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>
虽然在提出这个问题时它不存在,Tomcat 7.0.87 introduced a new property allowHostHeaderMismatch
on the connector (cf. documentation)。如果将其设置为 false
(自 Tomcat 9.0 以来的默认设置),每当 Host
header 与请求行不匹配:
<Connector port="8080" allowHostHeaderMismatch="false" />
我目前正在尝试修复站点漏洞,基本上它是 "Improper Input Handling" 攻击的一种类型。
假设我的网站是 www.mywebsite.com 还有黑客的网站 www.hacker.com
每当有请求发送到 www.mywebsite.com 并修改“Host
” header 指向 www.hacker.com,我的站点将创建一个重定向到 www.mywebsite.com 以及 url 的任何内容。
例如
正常:
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 "%r" %s %b" />
</Host>
<Host name="defaultlocalhost" >
</Host>
所以,我的问题是,我是否在正确的轨道上防止这种攻击?如果是,我做错了什么仍然无法正常工作? (最终目标是,如果传入的不是合法的Host,请求应该是discard/ignored/return 404而不是重定向302)
提前谢谢你。
这里有更多关于攻击的参考资料: http://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html
http://projects.webappsec.org/w/page/13246933/Improper%20Input%20Handling
哦,好吧,最后回答我自己的问题。
加入Tomcat用户邮件列表后(订阅邮箱:users@tomcat.apache.org)。 有个叫安德烈的人帮我解决了这个问题:
基本上我做错的是 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>
虽然在提出这个问题时它不存在,Tomcat 7.0.87 introduced a new property allowHostHeaderMismatch
on the connector (cf. documentation)。如果将其设置为 false
(自 Tomcat 9.0 以来的默认设置),每当 Host
header 与请求行不匹配:
<Connector port="8080" allowHostHeaderMismatch="false" />