该示例来自Python Django框架,但适用于所有Web应用程序.该ALLOWED_HOSTS
设置如何保护您的站点和用户,即如果ALLOWED_HOSTS
设置为"*"
恶意用户如何"中毒缓存和密码重置电子邮件与恶意主机的链接"?
ALLOWED_HOSTS默认值:[](空列表)
表示此Django站点可以提供的主机/域名的字符串列表.这是一种安全措施,可以通过使用伪造的HTTP主机标头提交请求来防止攻击者通过链接到恶意主机来中毒缓存和密码重置电子邮件,即使在许多看似安全的Web服务器配置下也是如此.
此列表中的值可以是完全限定名称(例如"www.example.com"),在这种情况下,它们将与请求的主机标头完全匹配(不区分大小写,不包括端口).以句点开头的值可用作子域通配符:'.example.com'将匹配example.com,www.example.com和example.com的任何其他子域.值'*'将匹配任何内容; 在这种情况下,您有责任提供自己的Host头验证(可能在中间件中;如果是这样,则必须首先在MIDDLEWARE_CLASSES中列出此中间件).
SilverlightF.. 5
恶意用户如何"通过链接到恶意主机来中毒缓存和密码重置电子邮件"?
缓存系统应缓存来自使用特定主机头发送的请求的响应,以便识别URL.例如,如果有一个GET请求/foo
缓存只会知道它实际上是一个请求,www.example.com/foo
如果它检查主机头(而不是简单的目标IP).如果输出页面包含反射的主机名并且缓存层或服务器未检查主机头,则将该ALLOWED_HOSTS
设置保留"*"
为允许此缓存填充垃圾(即中毒).
例如,如果您网站上的页面输出
如果攻击者指向attacker-site.co.uk
您的服务器并请求该页面,您的服务器将响应:
因此,用户和您的站点(example.com)之间的任何缓存层(例如CDN)都会对使用先前注入的主机头中毒的页面提出合法请求:
这使攻击者可以在您的域上运行其恶意JavaScript,从而违反同源策略.例如,他们可能已经安装了一个JavaScript键盘记录器来获取密码,或者一个脚本来发送DOM的内容.
此外,如果主机名未正确输出编码,则可以直接使用它来注入脚本,即使页面上不存在外部JavaScript标记也是如此.
" />
将呈现:
如
/img.jpg" />
密码重置电子邮件是一个类似的概念.说密码重置电子邮件的模板是:
You requested a password reset. Please go to https://[HOST]/reset?token=[TOKEN] in order to reset it.
并且攻击者将其域指向www.evil.com
您的服务器并请求为用户重置.他们的DNS设置可以简单地使用hosts文件.
然后,用户将收到一封电子邮件说
You requested a password reset. Please go to https://www.evil.com/reset?token=XYZ in order to reset it.
单击链接后,作为www.evil.com
攻击者站点上的点的公共DNS ,攻击者将获得密码重置令牌并可以访问该帐户.
有关这些类型的攻击的更多详细信息,请参阅此链接.
恶意用户如何"通过链接到恶意主机来中毒缓存和密码重置电子邮件"?
缓存系统应缓存来自使用特定主机头发送的请求的响应,以便识别URL.例如,如果有一个GET请求/foo
缓存只会知道它实际上是一个请求,www.example.com/foo
如果它检查主机头(而不是简单的目标IP).如果输出页面包含反射的主机名并且缓存层或服务器未检查主机头,则将该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设置可以简单地使用hosts文件.
然后,用户将收到一封电子邮件说
You requested a password reset. Please go to https://www.evil.com/reset?token=XYZ in order to reset it.
单击链接后,作为www.evil.com
攻击者站点上的点的公共DNS ,攻击者将获得密码重置令牌并可以访问该帐户.
有关这些类型的攻击的更多详细信息,请参阅此链接.