前言

简单整理一下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这个类里面。

下一节重定向攻击。

重新整理 .net core 实践篇————cookie 安全问题[三十八]的更多相关文章

  1. 重新整理 .net core 实践篇————重定向攻击[三十九]

    前言 简单介绍一下重定向攻击. 正文 攻击思路: 看着上面挺复杂的,其实是一些很简单的步骤. 攻击者通过某些手段,让用户打开了一个好站点,打开的这个地址里面带有重定向信息,重定向信息就是自己伪造的站点 ...

  2. 重新整理 .net core 实践篇——— UseEndpoints中间件[四十八]

    前言 前文已经提及到了endponint 是怎么匹配到的,也就是说在UseRouting 之后的中间件都能获取到endpoint了,如果能够匹配到的话,那么UseEndpoints又做了什么呢?它是如 ...

  3. 重新整理 .net core 实践篇—————Mediator实践[二十八]

    前言 简单整理一下Mediator. 正文 Mediator 名字是中介者的意思. 那么它和中介者模式有什么关系呢?前面整理设计模式的时候,并没有去介绍具体的中介者模式的代码实现. 如下: https ...

  4. 重新整理 .net core 实践篇—————配置系统之间谍[八](文件监控)

    前言 前文提及到了当我们的配置文件修改了,那么从 configurationRoot 在此读取会读取到新的数据,本文进行扩展,并从源码方面简单介绍一下,下面内容和前面几节息息相关. 正文 先看一下,如 ...

  5. 重新整理 .net core 实践篇—————领域事件[二十九]

    前文 前面整理了仓储层,工作单元模式,同时简单介绍了一下mediator. 那么就mediator在看下领域事件启到了什么作用吧. 正文 这里先注册一下MediatR服务: // 注册中间者:Medi ...

  6. 重新整理 .net core 实践篇————缓存相关[四十二]

    前言 简单整理一下缓存. 正文 缓存是什么? 缓存是计算结果的"临时"存储和重复使用 缓存本质是用空间换取时间 缓存的场景: 计算结果,如:反射对象缓存 请求结果,如:DNS 缓存 ...

  7. 重新整理 .net core 实践篇—————异常中间件[二十]

    前言 简单介绍一下异常中间件的使用. 正文 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } 这样写入中间件哈,那么在env环 ...

  8. 重新整理 .net core 实践篇————配置应用[一]

    前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...

  9. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. suse11sp3、suse12 安装 zabbix-agent

    1.添加repo源 suse11SP3zypper addrepo http://download.opensuse.org/repositories/server:/monitoring/SLE_1 ...

  2. VMware安装RedHat7、CentOS7后无网卡解决办法

    由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置,网卡类型etherne ...

  3. 如何访问pod --- service(7)

    一.通过service访问pod 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller ...

  4. 【备忘】ffmpeg推流命令

    1 组播推流 ffmpeg -re -i "D:\\OTT\\adghg2323.mp4" -vcodec libx264 -vprofile baseline -level 30 ...

  5. 2.1 CPU 上下文切换(上)

    cpu上下文与切换 进程在竞争 CPU 的时候并没有真正运行,为什么还会导致系统的负载升高呢?CPU 上下文切换就是罪魁祸首. 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量 ...

  6. Jmeter(四十六) - 从入门到精通高级篇 - Jmeter之网页图片爬虫-下篇(详解教程)

    1.简介 上一篇介绍了爬取文章,这一篇宏哥就简单的介绍一下,如何爬取图片然后保存到本地电脑中.网上很多漂亮的壁纸或者是美女.妹子,想自己收藏一些,挨个保存太费时间,那你可以利用爬虫然后批量下载. 2. ...

  7. Springboot2.x入门——helloWorld

    Springboot2.x入门--helloWorld 一.简介 1.1 Springboot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的 ...

  8. Java基础之概述

    1. 什么是程序 程序是计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 2. Java三大版本 Java SE 标准版 Java EE 企业版 Java ME 小型版 3. Java重要 ...

  9. GO学习-(33) Go实现日志收集系统2

    Go实现日志收集系统2   一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中我们agent的实现用到的内容 关于zookeeper+kaf ...

  10. eclipse自动格式化代码

    前段时间在Eclipse里面设置了java文件保存时自动格式化,在java->Code Style->Formatter里设置了自定义的格式化的样式,这样每次保存后都会自动格式化代码,用了 ...