ALLOWED_HOSTS正在防范的漏洞是什么?

时间:2014-07-29 14:47:24

标签: security

该示例来自Python Django框架,但适用于所有Web应用程序。 ALLOWED_HOSTS setting如何保护您的网站和用户,即如果ALLOWED_HOSTS设置为"*",恶意用户将如何处理"中毒缓存和密码重置电子邮件以及恶意链接主机"

  

ALLOWED_HOSTS默认值:[](清单)

     

表示此Django的主机/域名的字符串列表   网站可以服务。这是一种防止攻击者的安全措施   中毒缓存和密码重置电子邮件与恶意链接   通过伪造的HTTP主机头提交请求的主机,即   甚至可以在许多看似安全的Web服务器配置下使用。

     

此列表中的值可以是完全限定名称(例如   ' www.example.com'),在这种情况下,他们将匹配   请求的主机头正确(不区分大小写,不包括端口)。   以句点开头的值可以用作子域通配符:   ' .example.com的'将匹配example.com,www.example.com和任何其他   example.com的子域名。价值为' *'会匹配任何东西;在这   如果您有责任提供自己的主机验证   标题(可能在中间件中;如果是这样,则必须列出此中间件   首先在MIDDLEWARE_CLASSES中。

1 个答案:

答案 0 :(得分:5)

  

恶意用户如何“通过链接到恶意主机来中毒缓存和密码重置电子邮件”?   

缓存系统应该缓存来自与特定host header一起发送的请求的响应,以便识别URL。例如,如果有/foo的GET请求,缓存只会知道它实际上是www.example.com/foo的请求,如果它检查主机头(而不是简单的目标IP)。通过将ALLOWED_HOSTS设置保留为"*",如果输出页面包含反射的主机名并且主机头不是由缓存层或服务器检查。

e.g。如果您网站上的某个页面输出

<script src="//[hostname]/script.js"></script>

如果攻击者将attacker-site.co.uk指向您的服务器并请求该页面,则您的服务器将回复:

<script src="//attacker-site.co.uk/script.js"></script>

因此,用户和您的站点(example.com)之间的任何缓存层(例如CDN)都会对使用先前注入的主机头中毒的页面提出合法请求:

<script src="//attacker-site.co.uk/script.js"></script>

这可让攻击者在您的域上运行其恶意JavaScript,从而破坏了同源策略。例如,他们可能已经安装了一个JavaScript键盘记录器来获取密码,或者一个脚本来发送DOM的内容。

此外,如果主机名未正确输出编码,则可以直接使用它来注入脚本,即使页面上不存在外部JavaScript标记。

" /><script>alert('xss')</script>

将呈现:

<img src="//[hostname]/img.jpg" />

作为

<img src="//" /><script>alert('xss')</script>/img.jpg" />

密码重置电子邮件是一个类似的概念。说密码重置电子邮件的模板是:

You requested a password reset. Please go to https://[HOST]/reset?token=[TOKEN] in order to reset it.

并且攻击者将其域www.evil.com指向您的服务器并请求为用户重置。他们的DNS设置可以简单地使用主机文件。

然后,用户将收到一封电子邮件

You requested a password reset. Please go to https://www.evil.com/reset?token=XYZ in order to reset it.

点击链接后,由于www.evil.com的公共DNS指向攻击者的网站,攻击者会获得密码重置令牌并可以访问该帐户。

See this link了解有关此类攻击的更多细节。