ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

重新整理 .net core 实践篇————cookie 安全问题[三十八]

2021-07-08 08:03:45  阅读:170  来源: 互联网

标签:core AuthenticationScheme public 重新整理 cookie new options string


前言

简单整理一下cookie的跨站攻击,这个其实现在不常见,因为很多公司都明确声明不再用cookie存储重要信息,不过对于老站点还是有的。

正文

攻击原理:

这种攻击要达到3个条件:

  1. 用户访问了我们的站点。

  2. 用户通过cookie存储和传递身份信息

  3. 用户访问了坏站点

1和3根本控制不了,那么控制的就只有2,就是不使用cookie。

但是有些站点改动太大,那么是否还有其他方式呢?

防御方式:

  1. 不使用cookie存储和传输身份认证

  2. 使用antiforgerytoken,anti-forgery 防伪。

  3. 避免使用Get作为业务操作的请求方式

那么从上面看可以在2上做文章,因为3只是说让低级黑客被阻挡。

同样antiforgerytoken 方式也有两种:

  1. validateAntiForgeryToken
  2. AntoValidateAntiforgeryToken

那么就来演示一下:

下面问我们的站点,提供的cookie身份认证方式:

var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]));
services.AddSingleton(securityKey);
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
	.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
	{

	}).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
	{
		options.TokenValidationParameters = new TokenValidationParameters
		{
			ValidateIssuer = true,
			ValidateAudience = true,
			ValidateLifetime = true,
			ClockSkew = TimeSpan.FromSeconds(30),
			ValidateIssuerSigningKey = true,
			ValidAudience = "localhost",
			ValidIssuer = "localhost",
			IssuerSigningKey = securityKey
		};
	});

上面是cookie和jwt的认证方式哈。

那么下面这个是cookie登录:

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

那么有一个接口是购买接口:

[ApiController]
[Route("[controller]")]
public class OrderController : Controller
{
	[HttpPost]
	[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme+","+CookieAuthenticationDefaults.AuthenticationScheme)]
	public IActionResult Pay()
	{
		return Content(User.FindFirst("name").Value+"买买买");
	}
}

上面认证方式有cookie和jwt了。

那么我们先使用cookie进行登录一下,调用CookieLogin这个接口。

https://localhost:5001/Account?username=aomaomao

以看到前台有cookie信息。

在另外一个站点有这样一个东西:

<form action="https://localhost:5001/order" method="post">
    <label>打折购买:</label>
    <label>1块钱</label>
    <input type="submit" value="提交"/>
</form>

那么点击一下这个提交后:

可以看到这样就被攻击了。

那么可能有人就会说,如果自己看了一眼网站地址应该就不会出现问题吧。

其实一般攻击站点一般不给你点击的机会。

<script>
  document.form[0].submit()
</script>

这一段代码在进入网站的时候就自动帮你点击了。

services.AddAntiforgery(options =>
{
	options.HeaderName = "X-CSRF-TOKEN";
});
services.AddMvc(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));

上面这个代码进行Antiforgery验证,通过header里面的X-CSRF-TOKEN的值。options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()是自我判断是否应该验证的机制。

可以看下AutoValidateAntiforgeryTokenAttribute的源码:

public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
  return (IFilterMetadata) serviceProvider.GetRequiredService<AutoValidateAntiforgeryTokenAuthorizationFilter>();
}

那么继续看AutoValidateAntiforgeryTokenAuthorizationFilter:

  internal class AutoValidateAntiforgeryTokenAuthorizationFilter : ValidateAntiforgeryTokenAuthorizationFilter
  {
    public AutoValidateAntiforgeryTokenAuthorizationFilter(
      IAntiforgery antiforgery,
      ILoggerFactory loggerFactory)
      : base(antiforgery, loggerFactory)
    {
    }

    protected override bool ShouldValidate(AuthorizationFilterContext context)
    {
      if (context == null)
        throw new ArgumentNullException(nameof (context));
      string method = context.HttpContext.Request.Method;
      return !string.Equals("GET", method, StringComparison.OrdinalIgnoreCase) && !string.Equals("HEAD", method, StringComparison.OrdinalIgnoreCase) && (!string.Equals("TRACE", method, StringComparison.OrdinalIgnoreCase) && !string.Equals("OPTIONS", method, StringComparison.OrdinalIgnoreCase));
    }
  }

看ShouldValidate,里面说明了get,head,trace,options都不会进行验证,post delete等其他的才会验证。

如果你怕这个把握不住的话,那么你可以设置属性:

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme+","+CookieAuthenticationDefaults.AuthenticationScheme)]
public IActionResult Pay()
{
	return Content(User.FindFirst("name").Value+"买买买");
}

直接在方法上加入ValidateAntiForgeryToken即可。

那么我们还是按照前面的方法进行演示一下。

这里表示的就是400了,bad request。

先这样,细节篇会介绍是具体是如何验证的,在DefaultAntiforgery这个类里面。

下一节重定向攻击。

标签:core,AuthenticationScheme,public,重新整理,cookie,new,options,string
来源: https://www.cnblogs.com/aoximin/p/14984428.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有