URL跳转漏洞

$redirect_url = $_GET['url'];
header('Location: ' . $redirect_url);

一个很普遍的应用场景:
用户访问你的网站 页面A,而 页面A 必须登录之后访问。
所以等用户访问 页面A 时候,程序发现用户未登录,则跳转至登录页面B,待用户登录之后,再回跳到页面A。
上述代码,可能就出现在你的登录验证脚本($_GET[‘url’] 是页面A,A跳B时GET过去的,相当于记忆登录前的URL,登录后回到那个页面)

于是我们就可以通过类似下面的URL,跳转到一个恶意网站上,而那个网站上可能有一段CSRF的代码在等着你,或是一个钓鱼网站。
[url]http://im.qq.com/redirect?url=http://im.qq.net[/url]

这种攻击具有的迷惑性在于,用户看到的 [url]http://im.qq.com[/url],以为是一个合法网站,于是就点了这个链接,结果通过这个合法网站,把用户带到了一个恶意网站,而这个恶意网站上可能把页面做得跟这个合法网站一模一样,你还以为访问的是正确的地方,结果就被钓鱼了。

解决这个问题很简单,你需要在你的后台判断一下传过来的URL的域名是不是你自己的域名。

大家可以看看 Google 和 Baidu 搜索引擎的链接跳转,
百度的跳转链接是被加密过的,
而Google的网站链接很长,里面有网站的明文,但是会有几个加密过的参数,如果你把那些参数移除掉,Google会显示一个重定向的提醒页面。
(我个人觉得还是Google做得好)

最新文章

Return Top