最近我跟一个漏洞还有一群阿三干起来了……

背景:

我的客户是一个世界知名的药企,最近这个客户上台了一位阿三管理者,这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍。由于我们的客户关系维护的非常好,直接对口人提前透露给我们这个管理者就是想让一个阿三公司垄断他们的软件供应,并且表示了非常鄙视。我们表示了理解,毕竟任意一家公司只要进去一个阿三,慢慢的。。。慢慢的。。。就变成满屋都是阿三。。。

然后某一家阿三公司就暗地里中标了,然后我们就面临KT。由于我们维护着12个高活跃系统,所以KT的工作量也是非常的大。

BUT! 阿三的牛逼之处就在这时候体现出来了,他会从各个维度找你的事儿,其中一个就是找漏洞(自己找了一家阿三的漏洞检测公司免费做)报给客户并威胁说解决不完不接手,用以拉长KT的周期(本来KT只有三周时间)。

然后客户的阿三头头就同意了。。。

这个漏洞本来就有,客户一直表示不想处理,因为大多数网站太老旧了,很多都不是我们一手开发的。

但是这回看来是不干不行了,还好客户表示会付费,行吧。。。 那就整

现在有请漏洞登场!

大家好!我叫CSRF,全名是 Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet

这是我的简历:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Viewstate_.28ASP.NET.29

(Google Translate 了解一下)

这个玩意说白了就是一个伪装攻击,伪装工具是Cookie。

这个玩意是这样运作的:

(请不要在意这个丑逼的图。。。)

简单描述就是

其他网站用你的身份(Cookie)假装是你干了你不知道的事儿,这时候请想想你在网上银行转账的时候

那么这里面就出现一个重大的疑点:

为啥WebSiteB发过来的请求WebSiteA会收到呢? IIS吃了脏东西不管事儿了?

因为我们的网站支持跨域请求!(是不是看着贼扎眼!画重点了啊)

现在毛病基本OK了,剩的就是出方案。

对与CSRF这个东西知名度还是很高的,网上一搜一大把

.NET MVC就自带了解决方案,此方案只针对常规的MVC项目,前后端分离的绕行,以后我要是解决了我再回来写。。。

解决方案也很粗暴,一句话来说就是:

我们的服务器只接收来自我们自己页面发过来的请求

放到实现上就是:每个页面都按照一定规则生成一个Token,然后再发请求的时候带过去,服务器先看Token再干别的

这时候有人说了:要是别的网站伪造Token怎么办?

有道是孔子曰:不怕贼偷就怕贼惦记,他要是就想搞你,你早晚是防不住的啊,兄die

下面介绍关键代码:

@Html.AntiForgeryToken()

这个是cshtml的页面的代码,aspx的差不多

这东西的作用是会在页面上生成一个 Hidden,Value就是Token

最后变成Html长介样儿:

<input name="__RequestVerificationToken"
type="hidden" value="MbnNdB3T64quXYviXLsvoi_FlbM2SihwiiPCgSzaWAL0duMy7H6SbuF0lkUAxOD-DwF4P_4kxlyravohGXsQ_ERVPm5f3Oa3owG6LZ26WRw1" />

 那一球乱糟糟的就是Token

那么这玩意怎么用呢?

Type 1,Form Request:

@using (Html.BeginForm("Action", "Controller", null, FormMethod.Post, new { id = "formId" }))
{
@Html.AntiForgeryToken();
Other Code......
}

  

Type 2,Ajax Request:

var token = $('@Html.AntiForgeryToken()').val();
var headers = {};
headers["__RequestVerificationToken"] = token; $.ajax({
type: "post",
headers: headers,
url: "@Url.Action("Action","Controller")",
data: { },
dataType: "json",
success: function (response) { }
});

  

说到底就是页面上生成了Token之后,想尽一切办法发到后台去,不拘泥与形式

form就是直接包到里面了,后台直接用name拿就ok了,Ajax是放在header里了。

接下来就是后台验证,由于绝大多数Action都需要堵这个漏洞,所以直接写了一个Filter

    using System.Net;
using System.Web.Helpers;
using System.Web.Mvc; public class ExtendedValidateAntiForgeryToken : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var request = filterContext.HttpContext.Request;
if (request.HttpMethod != WebRequestMethods.Http.Post) return;
if (request.IsAjaxRequest())
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
//从cookies 和 Headers 中 验证防伪标记
//这里可以加try-catch
//try
//{
AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
//}
//catch (Exception e)
//{
// //filterContext.Result = new RedirectResult("/Account/Login?returnUrl=" +
// // HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.ToString()));
// ContentResult result = new ContentResult();
// result.Content = "<div style='text-align:center;padding:1em;' >当前已经处于退出状态,请重新登录</div>";
// filterContext.Result = result;
//}
}
else
{
//try
//{
new ValidateAntiForgeryTokenAttribute().OnAuthorization(filterContext);
//}
//catch (Exception ex)
//{
// //
//}
}
}
}

  里面代码核心就是验证Token的有效性,用的是官方API方法,但是要区别一个事儿,就是前文提到了咱们Ajax和Form带Token的方式不一样,所以需要判断是不是AJAX Request,走两个分支。

然后就是把Filter挂到Action上就行了。

好了,漏洞堵上了,用时2天,客户贼开心,正在准备去找阿三干仗的时候出岔子了。

细心的老铁可能发现了,上面的解决方案都是POST请求啊,GET呢?

这个就是个事儿了,从网上调查的时候得知,这个CSRF全是针对POST的,压根就不管GET。

比如这个文章:

https://stackoverflow.com/questions/35473856/asp-net-mvc-csrf-on-a-get-request

阿三哪个什么漏洞检测公司发回来一堆GET的URL。。。

在跟客户说明原委之后,客户炸了。。。 要干阿三,然后就发了一系列言辞犀利的邮件,也CC了他们哪个阿三头头

最后阿三们看有点失控,一个是我们POST改的太快了(47处),第二个是,没想到客户的IT急眼了。。。

这时的阿三很尴尬,在邮件里回:我们有很丰富的修改漏洞的经验

WTF?!!

还没等我们说话,客户直接回了一句:好!我现在约一个会,你们说说GET请求是怎么回事儿

行了。。。 我去帮客户干仗了。。。

想想跟印度人、韩国人、澳大利亚人加上我一个中国人开英语的会我就脑仁儿疼。。。。。。

另外附加一个连接:

https://weblogs.asp.net/dixin/anti-forgery-request-recipes-for-asp-net-mvc-and-ajax

.NET MVC CSRF/XSRF 漏洞的更多相关文章

  1. ASP.NET MVC CSRF (XSRF) security

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  2. ABP官方文档翻译 6.7 CSRF/XSRF保护

    CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...

  3. CSRF/XSRF 跨站请求伪造

    CSRF/XSRF 跨站请求伪造 CSRF(Cross Site Request Forgery, 跨站域请求伪造)也称 XSRF, 是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安 ...

  4. Web安全相关(二):跨站请求伪造(CSRF/XSRF)

    简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对 ...

  5. 跨站请求伪造 CSRF / XSRF<一:介绍>

    跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一 ...

  6. CSRF+XSRF+SSRF简单介绍

    CSRF 使用DVWA靶机,选择low级别,然后更改密码 伪造网页连接 http://localhost:8083/DVWA-master/vulnerabilities/csrf/?password ...

  7. 跨站请求伪造 CSRF / XSRF<二:应用>

    防御的方法主要有两种<java示例> 1.检查Referer字段 HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址.在处理敏感数据请求时,通常来说,Referer字 ...

  8. 一个csrf实例漏洞挖掘带你了解什么是csrf

    [-]CSRF是个什么鬼? |___简单的理解: |----攻击者盗用了你的身份,以你的名义进行某些非法操作.CSRF能够使用你的账户发送邮件,获取你的敏感信息,甚至盗走你的财产. |___CSRF攻 ...

  9. 2、Web应用程序中的安全向量 -- CSRF/XSRF(跨站请求伪造)

    CSRF的概念可以分为两类:XSS和混淆代理. 混淆代理中的"代理"是指用户的浏览器.CSRF是基于浏览器的工作方式运作的.用户登录到一个站点后,用户的信息将会存储在cookie中 ...

随机推荐

  1. 第八章 高级搜索树 (b2)B-树:结构

  2. 注册google账号 解决国内手机注册失败的问题

    1. PC端下载夜神安卓模拟器.安装,启动. 2. 在模拟器里的市场应用里下载qq邮箱. 3. 启动邮箱,选择gmail,注册.后续一切顺利. 这是迄今为止,唯一注册顺利的方法.其他方法,手机验证一关 ...

  3. 如何搭建hibernate框架

    我写这篇博客,主要是想让大家能够快速上手hibernate,本人建议学习框架,应该一个框架一个框架学习,别一上手就三大框架整合,学习之类的.这里只是单独搭建hibernate框架,让大家 能够更好的上 ...

  4. PAT L2-005 集合相似度(模拟集合set)

    给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...

  5. 【校招面试 之 C/C++】第30题 C++ 11新特性(一)之auto关键字

    1.自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推断,可以大大简化我们的编程工作.下面是一些使用auto的例子. #include <ve ...

  6. JS 图片切换

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="zzzz.aspx.cs&quo ...

  7. .net VS2008 时间加减,时间段,时间格式化到秒

    举个例子: DateTime time1 = DateTime.Now; DateTime time2 = time1.AddDays(1); time1是当前时间,time2比当前时间多一天.也就是 ...

  8. php加速缓存器opcache,apc,xcache,eAccelerator

    一.opcache opcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销.   PHP 5. ...

  9. SoapUI Script Library

    Environment Get active environment via groovy script log.info testRunner.testCase.testSuite.project. ...

  10. 向文件写入一个数据块---write

    函数原型:ssize_t write(int fd,const void *buf,size_t count); 参数说明:fd:文件描述符,buf:写入数据的缓冲区,count:写入数据的最大长度. ...