.NET MVC CSRF/XSRF 漏洞

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

背景:

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

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

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

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

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

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

640?wx_fmt=jpeg

 

现在有请漏洞登场!

大家好!我叫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。

这个玩意是这样运作的:

640?wx_fmt=png

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

 

简单描述就是

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

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

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

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

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

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

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

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

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

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

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

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

下面介绍关键代码:

1
@Html.AntiForgeryToken()

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

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

最后变成Html长介样儿:

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

 那一球乱糟糟的就是Token

那么这玩意怎么用呢?

Type 1,Form Request:

1
@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?!!

 640?wx_fmt=jpeg

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

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

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

 

另外附加一个连接:

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

 

原文地址:https://www.cnblogs.com/caligula/p/9492675.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj5057-[GDSOI2017模拟4.13]炮塔【网络流,最大权闭合图】

正题 题面链接:https://gmoj.net/senior/#main/show/5057 题目大意 n∗mn*mn∗m的网格上有一些炮和敌军&#xff0c;每个炮可以攻击在它方向上一个敌军&#xff0c;但是要求炮弹的轨迹不能交叉。求最多打死多少敌军。 解题思路 我们先把炮分成两类&#xff0c;一类是横着打&a…

【最大流】牛棚安排(jzoj 1259)

牛棚安排 jzoj 1259 题目大意&#xff1a; 有nnn头牛和mmm个牛棚&#xff0c;每头牛有自己第1喜欢&#xff0c;第2喜欢……第mmm喜欢的牛棚&#xff08;开心度分别为m,m−1,m−2……1m,m-1,m-2……1m,m−1,m−2……1&#xff09;&#xff0c;然后读入mmm个数表示第iii个牛棚…

牛客算法周周练2

文章目录A 相反数B Music ProblemC 完全平方数D 小H和游戏E 水题(water)A 相反数 题解 B Music Problem 题解 C 完全平方数 题解 D 小H和游戏 题解 E 水题(water) 题解

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

正文ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性&#xff0c;今天主角就是 ApiControllerAttribute。0. ApiControllerAttribute 继承自 ControllerAttributeASP.NET Core MVC 已经有了ControllerAttribute&#xff0c;这个用来标注一个类型是否是Controller。…

新的UWP和Win32应用程序分发模型

自2005年引入ClickOnce技术以来&#xff0c;.NET就支持应用程序自动升级。在ClickOnce模型中&#xff0c;WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本。但是&#xff0c;由于微软试图模仿iOS应用商店模型&#xff0c;所以&#xff0c;该模型未能延续到UWP。微…

[2020.11.25NOIP模拟赛]下棋【dp】

正题 题目链接:https://www.luogu.com.cn/problem/U142297?contestId37766 题目大意 nnn个白棋mmm个黑棋排成一排&#xff0c;要求没有任何一段黑白棋的个数差大于ttt。求方案数。 解题思路 设fi,j,k,lf_{i,j,k,l}fi,j,k,l​表示已经摆了iii个白棋jjj个黑棋&#xff0c;所有…

【结论题(QAQ)】SSL新年欢乐赛暨BPM退役赛 A 送分题(luogu U102372)

送分题 luogu U102372 题目大意 你一开始在xxx轴的原点处&#xff0c;现在给你mmm个命令&#xff0c;分别是向左一位和向右一位&#xff0c;对于所有命令&#xff0c;你可以不走也可以按命令走&#xff0c;问你最后你可能在的位置有所少个 输入样例 4 LRLR输出样例 5数据…

牛客网 【每日一题】4月15日 Treepath

文章目录题目描述题解&#xff1a;代码&#xff1a;传送时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 给定一棵n个点的树&#xff0c;问其中有多少条长度为偶数的路径。路径…

.net core grpc 实现通信(一)

现在系统都服务化&#xff0c;.net core 实现服务化的方式有很多&#xff0c;我们通过grpc实现客户端、服务端通信。grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff0c;使用HTTP/2协议&#xff0c;…

【数学】数列(jzoj 2752)

数列 jzoj 2752 题目大意&#xff1a; 给你一个正整数n&#xff08;有多组数据&#xff09;&#xff0c;让你把它分为一个连续的正整数列之和&#xff08;长度大于1&#xff09;&#xff0c;然你求着个数列最短的长度&#xff0c;如果这个序列不存在&#xff0c;那输出-1 输…

NOIP提高组复赛 知识点整理

枚举、模拟、贪心、递推、排序&#xff08;快排&#xff09; 高精度&#xff1a; 加法&#xff0c;减法&#xff0c;乘法&#xff08;应该只会有高精乘单精&#xff09;&#xff0c;高精度除单精 分治: 二分查找 整体二分 CDQ分治 三分 搜索: dfs、剪枝 bfs、双向bfs 启发式搜索…

子序列

牛客网题目 题目描述 给出一个长度为n的序列&#xff0c;你需要计算出所有长度为k的子序列中&#xff0c;除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行两个整数N&#xff0c;k&#xff0c;含义…

P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P5341 题目大意 给出一个字符串&#xff0c;求出现次数恰好为kkk的子串中&#xff0c;出现最多的长度。 解题思路 先根据TTT构建一个SAMSAMSAM&#xff0c;对于一个endposendposendpos类中&#xff0c;所有出现串的长度一定…

横向扩展你的ASP.NET Core SignalR 应用

前言最近项目要用signalr来做实时通信&#xff0c;在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客&#xff0c;和大家分享一下原文连接地址负载均衡当你把你的应用部署到生产环境时&#xff0c;你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服…

P3181-[HAOI2016]找相同字符【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3181 题目大意 两个字符串&#xff0c;求有多少个(l1,r1,l2,r2)(l_1,r_1,l_2,r_2)(l1​,r1​,l2​,r2​)使得字符串l1∼r1l_1\sim r_1l1​∼r1​的子串与l2∼r2l_2\sim r_2l2​∼r2​的子串相等。 解题思路 SAMSAMSAM做法 …

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…

牛客网【每日一题】4月16日题目精讲 逆序对

文章目录题目描述题解&#xff1a;代码传送时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数&#xff1a; 设第i位和第j位分别…

[BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

首先&#xff0c;我们求出树的重链&#xff0c;然后对于每一条链&#xff0c;建一颗线段树 树大概长这样&#xff1a; &#xff08;其中用红边连起来的是一条条重链&#xff09; 在线段树上&#xff0c;我们维护&#xff1a; Opt(u)&#xff1a;经过 u节点代表的链的其中一段 …

【dfs】树(jzoj 2753)

树 jzoj 2753 题目大意&#xff1a; 给你一棵树&#xff0c;每一个点都一个值&#xff0c;现在问你有多少条路径可以满足以下条件&#xff1a; 1、方向都是向下 2、路径上的点的值总和为S 输入样例 3 3 1 2 3 1 2 1 3输出样例 2数据范围 对于30%数据&#xff0c;N⩽100N…

ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了:ASP.NET Core 2.1 做APIIdentity Server 4Angular 6Angular Material这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…