该示例来自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中。
答案 0 :(得分:5)
恶意用户如何“通过链接到恶意主机来中毒缓存和密码重置电子邮件”?
缓存系统应该缓存来自与特定host header一起发送的请求的响应,以便识别URL。例如,如果有/foo
的GET请求,缓存只会知道它实际上是www.example.com/foo
的请求,如果它检查主机头(而不是简单的目标IP)。通过将ALLOWED_HOSTS
设置保留为"*"
,如果输出页面包含反射的主机名并且主机头不是},则允许此缓存填满垃圾(即中毒) em>由缓存层或服务器检查。
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了解有关此类攻击的更多细节。