漏洞描述
也称URL跳转、URL重定向漏洞,由于目标网站未对程序跳转的URL地址及参数做合法性判断,导致应用程序直接跳转到参数中指定的的URL地址。
攻击者可通过将跳转地址修改为指向恶意站点,即可发起网络钓鱼、诈骗甚至窃取用户凭证等。
常见应用场景
主要是业务逻辑中需要进行跳转的地方。
比如登录处、注册处、访问用户信息、订单信息、加入购物车、分享、收藏等处。
假设有一个正规网站http://nerddinner.com/,还有一个恶意网站或钓鱼网站http://nerddiner.com/(注意:这里少了个n)。
一天,小白收到了别人发的链接:http://nerddinner.com/Account/LogOn?returnUrl=http://nerddiner.com。
-
打开链接后进入了登录界面,小白输入了自己的帐号名密码进行登录。
-
登录成功后重定向到了恶意网站。
-
恶意网站是一个仿造正规网站的登录页面,并在上面提示用户名或密码错误。
-
小白按照提示重新输入了帐号密码信息。
-
恶意网站保存了客户的用户名密码,然后重定向会正规网站。
-
小白继续平时正常的操作。
漏洞危害
攻击者可能会使用Web服务器攻击其他站点;
如果对输出没有做严格限制,将可能导致反射性XSS漏洞;
黑产将利用此漏洞,从信任网站跳转到攻击者构造的恶意网站用来进行钓鱼、诈骗等行为;
配合 XSS
-
恶意用户在正规网站下挂了跳转到恶意网站的脚本。
-
普通用户访问到含恶意脚本的页面会跳转到恶意网站。
-
恶意网站是一个仿造正规网站的登录页面,并在上面提示需要重新登录。
-
小白按照提示重新输入了帐号密码信息。
-
恶意网站保存了客户的用户名密码,然后重定向会正规网站。
注:这种方式每次访问含恶意脚本的页面都会跳转到恶意网站(提示重新登录),而开放重定向只会提示用户名密码错误一次,相对而言,开放重定向的无感知效果要好一点。
修复建议
严格控制将要跳转的域名,如果某个业务事先已经确定将要跳转的网站,最稳妥的方式是将其直接编码在源代码中,通过URL中传入的参数来映射跳转网址。
严格验证跳转URL参数的有效性、合法性。
校验传入的URL参数是否为可信域名
后端校验代码
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
//Your logon logic here.
FormsAuthentication.SetAuthCookie(model.UserName, false);
if (!string.IsNullOrEmpty(returnUrl)
&& Url.IsLocalUrl(returnUrl) //Comment out this code will cause open redirection
)
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}
提示用户
很多软件,比如知乎,简书,如果跳转的是外部链接,会提示用户注意个人隐私安全。
这其实是一个不错的处理方式。