一般通用web程序是如果想知道网站域名不是一件简单的事情,如果用一个固定的URI来作为域名会有各种麻烦。开发人员一般是依赖HTTP Host header(比如在php里是_SERVER[“HTTP_HOST”] ),而这个header很多情况下是靠不住的。而很多应用是直接把这个值不做html编码便输出到了页面中,比如:
<link href="http://_SERVER['HOST']" (Joomla)
还有的地方还包含有secret key和token,
<a href="http://_SERVER['HOST']?token=topsecret"> (Django, Gallery, others)
这样处理问题一般会很容易遭遇到两种常见的攻击:缓存污染和密码重置。缓存污染是指攻击者通过控制一个缓存系统来将一个恶意站点的页面返回给用户。密码重置这种攻击主要是因为发送给用户的内容是可以污染的,也就是说可以间接的劫持邮件发送内容。
0x01 密码重置污染攻击
拿 Gallery 这个站来做例子。当我们进行密码重置的时候,网站会给我们发送一个随机的key:
$user -> hash = random::hash() ;
$message -> confirm_url = url::abs_site("password/do_reset?key=$user->hash") ;
当用户点击重置密码的链接时,肯定可以说明点的是自己的账户。
这个地方的漏洞