zoukankan      html  css  js  c++  java
  • 重新整理 .net core 实践篇————重定向攻击[三十九]

    前言

    简单介绍一下重定向攻击。

    正文

    攻击思路:

    看着上面挺复杂的,其实是一些很简单的步骤。

    1. 攻击者通过某些手段,让用户打开了一个好站点,打开的这个地址里面带有重定向信息,重定向信息就是自己伪造的站点。

    这是因为我们一般不知道网站从哪个页面而来,登录后会返回伪造的站点,也就是我们的后台会利用重定向信息。

    1. 然后用户就输入了正确的账户密码,然后重定向到伪造的站点,这个伪造的站点也是一个登录页面,和真实站点一模一样。

    2. 这个时候用户以为自己账户密码输入错误,然后再输入一遍,这个时候攻击者就拿到了用户的账户密码,然后再跳转到官方站点。

    3. 因为跳转到官方站点了,然后用户是可以正常操作的,用户就以为一切操作正常,然后就很开心的买买买了。

    上述攻击步骤大体是这样。

    攻击的必要条件:

    1. 我们的站点没有验证重定向的地址

    2. 用户访问了伪造站点

    第二点基本上没有解决方案,因为我们不知道会遇上什么样的用户。

    重定向方案:

    1. 使用localRedirest 来处理重定向

    2. 验证重定向的目标域名是否合法

    那么下面就看下这两种防范方式。

    [HttpGet]
    public async Task<IActionResult> CookieLogin(string userName,string returnUrl)
    {
    	var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
    	identity.AddClaim(new Claim("Name", userName));
    	await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
    	return Redirect(returnUrl);
    }
    

    看到了吧,上面就直接通过Redirect(returnUrl);来跳转。

    那么可以通过这样:return LocalRedirect(returnUrl);

    这样就是只能跳转到同域名的网址下面。

    LocalRedirect 会有验证,然后抛出异常,然后就被我们的未处理异常处理了,然后就进入404这样子。

    那么这里希望处理一下。

    public async Task<IActionResult> CookieLogin(string userName,string returnUrl)
    {
    	var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
    	identity.AddClaim(new Claim("Name", userName));
    	await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
    	// return Redirect(returnUrl);
    	try
    	{
    		return LocalRedirect(returnUrl);
    	}
    	catch
    	{
    		return Redirect(returnUrl);
    	}
    }
    

    如果发现异常,跳转到首页,避免用户认为我们的网站崩溃现象。

    那么如果我们有子站点就是和当前登录页面不是同一域名的情况呢?那么这个时候就需要我们自己验证,尤其是现在的授权认证独立出来服务后。

    Uri uri = new Uri(returnUrl);
    // 验证一下
    // 自我验证,根据数据库列表验证,根据配置验证等
    return Redirect(returnUrl);
    

    下一节防跨站脚本攻击。

     
  • 相关阅读:
    wcf连接数据库用sqlhelper,连接数一直没有释放反而增加
    Assembly.GetManifestResourceStream为null
    webapi <Message>已拒绝为此请求授权。</Message>
    未找到与名为“xxx”的控制器匹配的类型。
    Eclipse Ctrl+鼠标左键不能查看源代码
    WEB API 用MemoryStream流做下载功能
    mysql繁字体报错,Incorrect string value: 'xE9_' for column 'UserName' at row 1
    学信网模拟登录2
    选择排序
    mysql学习笔记
  • 原文地址:https://www.cnblogs.com/wl-blog/p/15000966.html
Copyright © 2011-2022 走看看