该示例来自Python框架,但适用于所有web应用程序。设置如何保护您的站点和用户,即如果ALLOWED_HOSTS被设置为"*",恶意用户将如何使用指向恶意主机的链接来“毒害缓存和密码重置电子邮件”?
ALLOWED_HOSTS默认值:空列表 表示此Django站点可以提供的主机/域名的字符串列表。这是一种安全措施,以防止攻击者通过提交带有虚假header的请求(即使在许多看似安全的web服务器配置下)提交带有恶意主机链接的缓存和密码重置电子邮件。 此列表中的值可以是完全限定的名称(例如“www.example.com”),在这种情况下,它们将与请求的主机标题完全匹配(不区分大小写,不包括端口)。以句点开头的值可以用作子域通配符:“.example.com”将匹配example.com、www.example.com和example.com的任何其他子域。值“*”将匹配任何内容;在本例中,您负责提供您自己的主机头验证(可能在中间件中;如果是,则必须首先在MIDDLEWARE_CLASSES中列出此中间件)。
发布于 2014-08-13 14:14:48
恶意用户将如何进行“中毒缓存和密码重置电子邮件与恶意主机的链接”?
缓存系统应该缓存来自特定主机标头发送的请求的响应,以识别URL。例如,如果有对/foo的GET请求,缓存只知道如果它检查主机头(而不仅仅是目标IP),它实际上是对www.example.com/foo的请求。通过将ALLOWED_HOSTS设置留给"*",如果输出页包含反射的主机名,并且缓存层或服务器不检查主机头,则将允许这个缓存被垃圾填充(即中毒)。
例如,如果站点上的页面输出
<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指向攻击者的站点,攻击者将获得密码重置令牌,并可以访问该帐户。
有关这类攻击的更多细节,请参见请参阅此链接。
https://stackoverflow.com/questions/25018250
复制相似问题