必威体育手机端:Web安全相关

简介
  CS帕杰罗F(Cross-site request forgery跨站乞请假造,也被叫作“One Click Attack”也许Session Riding,平时缩写为CS翼虎F恐怕XS奔驰M级F,是意气风发种对网址的恶心使用。就算听上去像跨站脚本(XSS),但它与XSS非常例外,何况攻击格局差不离相左。XSS利用站点内的信任用户,而CS本田CR-VF则透过伪装来自受信任顾客的倡议来行使受信任的网址。与XSS攻击比较,CSEscortF攻击往往十分的小流行(因此对其开展堤防的财富也一定罕有)和麻烦防卫,所以被感到比XSS更具危急性。

转发博客:

场景

(一)MVC Html.AntiForgeryToken() 防止CSRF攻击

      某技术员大神God在某在线银行Online Bank给她的敌人Friend转账。

MVC中的Html.AntiForgeryToken()是用来卫戍跨站诉求假造(CSEnclaveF:Cross-site request forgery)攻击的贰个格局,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不一致,XSS平常是使用站内信任的顾客在网站内插入恶意的剧本代码实行攻击,而CS大切诺基F则是老婆当军成受信任顾客对网址开展抨击。

  必威体育手机端 1

举个大概例子,举个例子整个系统的布告在网站首页呈现,而那个布告是从后台提交的,笔者用最简便易行的写法:网址后台(Home/Index页面)设置首页布告内容,提交到HomeController的Text Action

  必威体育手机端 2

@using (Html.BeginForm("Text","Home",FormMethod.Post))  
{  
    @:网站公告:<input type="text" name="Notice" id="Notice" />  
    <input type="submit" value="Submit" />  
}  

  转账后,出于好奇,大神God查看了网址的源文件,以至捕获到转会的伏乞。

HomeController的Text Action

   必威体育手机端 3

[HttpPost]  
 public ActionResult Text()  
 {  
     ViewBag.Notice = Request.Form["Notice"].ToString();  
     return View();  
 } 

  必威体育手机端 4

填写完文告,提交,展现

  大神God开采,那一个网址并未有做幸免CS路虎极光F的秘技,而且她协调也许有三个有早晚访谈量的网站,于是,他布置在协和的网址上内嵌一个潜伏的Iframe杜撰诉求(每10s发送叁回),来等待鱼儿Fish上钩,给自个儿转账。

必威体育手机端 5

  网址源码:

那儿提供给了跨站攻击的狐狸尾巴,CS福睿斯F平常依据多少个标准

 1 <html>
 2 <head>
 3     <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
 4     <title></title>
 5 </head>
 6 <body>
 7 <div>
 8     我是一个内容丰富的网站,你不会关闭我!
 9 </div>
10 
11 <iframe name="frame" src="invalid.html" sandbox="allow-same-origin allow-scripts allow-forms"  style="display: none; width: 800px; height: 1000px;"> </iframe> 
12 <script type="text/javascript">
13     setTimeout("self.location.reload();", 10000);
14 </script>
15 </body>
16 </html>

(1)攻击者领悟受害者所在的站点

   诬捏诉求源码:

(2)攻击者的指标站点具有漫长化授权cookie恐怕被害者具备当前会话cookie

 1 <html>
 2 <head>
 3     <title></title>
 4 </head>
 5 <body>
 6 <form id="theForm" action="http://localhost:22699/Home/Transfer" method="post">
 7     <input class="form-control" id="TargetUser" name="TargetUser" placeholder="用户名" type="text" value="God" />
 8     <input class="form-control" id="Amount" name="Amount" placeholder="转账金额" type="text" value="100" />
 9 </form>
10 
11 <script type="text/javascript">
12     document.getElementById('theForm').submit();
13 </script>
14 </body>
15 </html>

(3)指标站点未有对客商在网址作为的第二授权那时候

   必威体育手机端 6

切实参见

  鱼儿Fish展开了大神God的网址,在上头浏览五花八门的原委。当时假冒诉求的结果是这样的(为了演示效果,去掉了掩盖):

现即使自身晓得自己要攻击的网址的地址,譬喻是,且也满足2,3的图景。

   必威体育手机端 7

于是乎作者新建二个AntiForgeryText.html文件,内容如下:

  因为鱼儿Fish未有登录,所以,杜撰需要从来非常的小概施行,一贯跳转回登入页面。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" >  
<head>  
    <title></title>  
</head>  
<body>  
    <form name="badform" method="post" action="http://localhost:6060/Home/Text">  
        <input type="hidden" name="Notice" id="Notice" value="你的网站被我黑了。。" />  
        <input type="submit" value="黑掉这个网站" />  
    </form>  
</body>  
</html>  

  然后鱼儿Fish想起了要登陆在线银行Online Bank查询内容,于是她登入了Online Bank。

在这里个html中加了一个隐讳的字段,Name和Id和网址要接收的参数名相通。

  那时候假冒央浼的结果是如此的(为了演示效果,去掉了隐敝):

本人点击了“黑掉那个网站”,显示如下

   必威体育手机端 8

必威体育手机端 9

  鱼儿Fish每10秒会给大神God转账100元。

那个正是应用了缺欠把首页的布告给改了,这便是一个简易的跨站攻击的例证。

   必威体育手机端 10

MVC中经过在页面上接收 Html.AntiForgeryToken()同盟在对应的Action上加码[ValidateAntiForgeryToken]特征来防护跨站攻击。

 

把地点的代码改成

防止CSRF

  CS昂CoraF能成功是因为同三个浏览器会分享Cookies,也便是说,通过权限认证和验证是回天乏术防护CS奇骏F的。那么相应怎么着制止CS翼虎F呢?其实幸免CS中华VF的方式非常的粗略,只要确认保障需要是同心同德的站点发出的就可以了。那怎么确认保障央浼是发泄于本身的站点呢?ASP.NET以Token的款型来判定哀告。

  我们须求在大家的页不熟知成三个Token,发央求的时候把Token带上。管理要求的时候须求验证Cookies+Token。

  必威体育手机端 11

  必威体育手机端 12

  当时假冒央浼的结果是那样的(为了演示效果,去掉了藏匿):

  必威体育手机端 13

@using (Html.BeginForm("Text","Home",FormMethod.Post))  
{  
    @Html.AntiForgeryToken()  
    @:网站公告:<input type="text" name="Notice" id="Notice" />  
  <input type="submit" value="Submit" />  
}  

$.ajax

  倘若笔者的乞求不是通过Form提交,而是经过Ajax来交付,会怎么呢?结果是验证不通过。

  必威体育手机端 14

  为啥会那标准?大家回头看看加了@Html.AntiForgeryToken()后页面和央浼的变化。

  1. 页面多了贰个掩瞒域,name为__RequestVerificationToken。

  必威体育手机端 15

  2. 伸手中也多了三个字段__RequestVerificationToken。

  必威体育手机端 16

  原本要加这么个字段,小编也加三个不就能够了!

  必威体育手机端 17  

  啊!为何依旧不行...逼自身放大招,钻探源码去!

  必威体育手机端 18

  噢!原本token要从Form里面取。可是ajax中,Form里面并不曾东西。那token如何做吧?小编把token放到碗里,不对,是放置header里。

   js代码:

 1 $(function () {
 2             var token = $('@Html.AntiForgeryToken()').val();
 3 
 4             $('#btnSubmit').click(function () {
 5                 var targetUser = $('#TargetUser').val();
 6                 var amount = $('#Amount').val();
 7                 var data = { 'targetUser': targetUser, 'amount': amount };
 8                 return $.ajax({
 9                     url: '@Url.Action("Transfer2", "Home")',
10                     type: 'POST',
11                     data: JSON.stringify(data),
12                     contentType: 'application/json',
13                     dataType: 'json',
14                     traditional: 'true',
15                     beforeSend: function (xhr) {
16                         xhr.setRequestHeader('__RequestVerificationToken', token);
17                     },
18                     success:function() {
19                         window.location = '@Url.Action("Index", "Home")';
20                     }
21                 });
22             });
23         });

   在服务端,参照他事他说加以考察ValidateAntiForgeryTokenAttribute,编写三个AjaxValidateAntiForgeryTokenAttribute:

 1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
 2     public class AjaxValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
 3     {     
 4         public void OnAuthorization(AuthorizationContext filterContext)
 5         {
 6             if (filterContext == null)
 7             {
 8                 throw new ArgumentNullException("filterContext");
 9             }
10 
11             var request = filterContext.HttpContext.Request;
12 
13             var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
14             var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
15             var formToken = request.Headers["__RequestVerificationToken"];
16             AntiForgery.Validate(cookieValue, formToken);
17         }
18     }

   然后调用时把ValidateAntiForgeryToken替换来AjaxValidateAntiForgeryToken。

   必威体育手机端 19

  马到成功,好有成就感!

对应的Action

大局管理

  假如持有的操作央浼都要加一个ValidateAntiForgeryToken恐怕AjaxValidateAntiForgeryToken,不是挺麻烦呢?能够在有个别地点联合管理呢?答案是足以的。

  ValidateAntiForgeryTokenAttribute承袭IAuthorizationFilter,那就在AuthorizeAttribute里做统风流洒脱管理啊。

  ExtendedAuthorizeAttribute:

 1 public class ExtendedAuthorizeAttribute : AuthorizeAttribute
 2     {
 3         public override void OnAuthorization(AuthorizationContext filterContext)
 4         {
 5             PreventCsrf(filterContext);
 6             base.OnAuthorization(filterContext);
 7             GenerateUserContext(filterContext);
 8         }
 9 
10         /// <summary>
11         /// http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages
12         /// </summary>
13         private static void PreventCsrf(AuthorizationContext filterContext)
14         {
15             var request = filterContext.HttpContext.Request;
16 
17             if (request.HttpMethod.ToUpper() != "POST")
18             {
19                 return;
20             }
21 
22             var allowAnonymous = HasAttribute(filterContext, typeof(AllowAnonymousAttribute));
23 
24             if (allowAnonymous)
25             {
26                 return;
27             }
28 
29             var bypass = HasAttribute(filterContext, typeof(BypassCsrfValidationAttribute));
30 
31             if (bypass)
32             {
33                 return;
34             }
35 
36             if (filterContext.HttpContext.Request.IsAjaxRequest())
37             {
38                 var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
39                 var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
40                 var formToken = request.Headers["__RequestVerificationToken"];
41                 AntiForgery.Validate(cookieValue, formToken);
42             }
43             else
44             {
45                 AntiForgery.Validate();
46             }
47         }
48 
49         private static bool HasAttribute(AuthorizationContext filterContext, Type attributeType)
50         {
51             return filterContext.ActionDescriptor.IsDefined(attributeType, true) ||
52                    filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(attributeType, true);
53         }
54 
55         private static void GenerateUserContext(AuthorizationContext filterContext)
56         {
57             var formsIdentity = filterContext.HttpContext.User.Identity as FormsIdentity;
58 
59             if (formsIdentity == null || string.IsNullOrWhiteSpace(formsIdentity.Name))
60             {
61                 UserContext.Current = null;
62                 return;
63             }
64 
65             UserContext.Current = new WebUserContext(formsIdentity.Name);
66         }
67     }

   然后在FilterConfig注册一下。

  必威体育手机端 20  

  FAQ:

  1. BypassCsrfValidationAttribute是怎么鬼?不是有个AllowAnonymousAttribute吗?

  要是有一点操作你无需做CS库罗德F的拍卖,譬如附属类小部件上传,你能够在相应的Controller或Action上增加BypassCsrfValidationAttribute。

  AllowAnonymousAttribute不独有会绕过CSRAV4F的拍卖,还有或然会绕过证实和认证。BypassCsrfValidationAttribute绕过CS福特ExplorerF但不绕过注解和验证,

也正是BypassCsrfValidationAttribute功用于那个登入或授权后的Action。

 

  2. 为啥只管理POST诉求?

  笔者付出的时候有几个法则,查询都用GET,操功能POST,而对于查询的诉求未有须要做CS奥迪Q5F的处理。大家能够按自个儿的须要去布置!

  

  3. 笔者做了全局管理,然后还在Controller或Action上加了ValidateAntiForgeryToken大概AjaxValidateAntiForgeryToken,会冲突吧?

  不会冲突,只是验证会做三回。

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult Text()  
{  
    ViewBag.Notice = Request.Form["Notice"].ToString();  
    return View();  
}  

源码下载

  为了方便使用,作者未有使用此外数据库,而是用了四个文件来积存数据。代码下载后方可直接运维,不供给配置。

  下载地址:

 

随笔转发自:

那样子小编在AntiForgeryText.html中式茶食"黑掉那个网站",就能够情不自禁

必威体育手机端 21

与上述同类就制止了跨站攻击。

 

页面上的Html.AntiForgeryToken()会给访谈者二个私下认可名字为__RequestVerificationToken的cookie
为了说飞鹤(Beingmate)个源于form post,还亟需在对象action上扩展[ValidateAntiForgeryToken]特色,它是三个证实过滤器,
它至关心重视要检查

(1)诉求的是还是不是包蕴四个约定的AntiForgery名的cookie

(2)恳求是不是有一个Request.Form["约定的AntiForgery名"],约定的AntiForgery名的cookie和Request.Form值是或不是相称

 

里面重视涉及到System.Web.WebPages.dll中的静态类AntiForgery
Html.AntiForgeryToken()调用了AntiForgery静态类的GetHtml方法,它发出三个私下值然后各自存款和储蓄到客户端cookie和页面包车型客车hidden 田野同志中,

(1)Request.Cookies[antiForgeryTokenName](默许也是Request.Cookies["__RequestVerificationToken"])

(2)页面上的hidden田野

<input name="__RequestVerificationToken" type="hidden" value="9rUlMYvsH6eMcFN9tn/wRwAG07eROraVaeTn9hHMXKkMmDbR8jLw5DKdVnZBJ9siQHeGyl1w4rSB141LnxMp2ahV0qP1lElPeukqfcUFYoxrm/EfpSJjZavykmzn15VeGFMKkmgFj5a1UFhZFaW2aZgeN38x9lt0OFSoca7eMVU=" />  

中间cookie的key的名字和页面hidden 田野(field)的名字是同意气风发的,暗中同意都以"__RequestVerificationToken",借使有提供ApplicationPath的话,那就是由"__RequestVerificationToken"和透过管理后的ApplicationPath组成。

 

Controller端则经过在Action上平添[ValidateAntiForgeryToken]特征来注脚,
ValidateAntiForgeryTokenAttribute承接了FilterAttribute和IAuthorizationFilter,通过传递佚名委托方法,

委托调用AntiForgery类的Validate方法来促成认证。

Validate方法中驷不及舌验证Request.Cookies[antiForgeryTokenName]和<input name=antiForgeryTokenName ...>五个的值是或不是相似,

要是页面未有<input name=antiForgeryTokenName ...>,也许多少个值不对等,就能抛出至极。

(二)关于CS景逸SUVF攻击及mvc中的施工方案 [ValidateAntiForgeryToken]

一.CSRF是什么?

  CS大切诺基F(Cross-site request forgery),粤语名称:跨站须要虚构,也被叫做:one click attack/session riding,缩写为:CSLANDF/XS牧马人F。

二.CS昂科拉F能够做怎么样?

  你那足以那样通晓CSLX570F攻击:攻击者盗用了您的身份,以你的名义发送恶意央浼。CSCRUISERF能够做的作业包罗:以你名义发送邮件,发音信,盗取你的账号,以致于购买商品,设想货币转账......变成的标题包蕴:个人隐衷走漏甚至资金财产安全。

三.CSTiggoF漏洞现状

  CS陆风X8F这种攻击方式在二〇〇一年已经被海外的莱芜职员提出,但在境内,直到06年才起头被关心,08年,国内外的多个巨型社区和交互网站独家爆出CSENCOREF漏洞,如:NYTimes.com(London时报)、Metafilter(一个特大型的BLOG网址),YouTube和百度HI......而前段时间,互联英特网的居多站点仍对此毫无防备,甚至于安全产业界称CS卡宴F为“沉睡的圣人”。

四.CSRF的原理

必威体育手机端 22

 

从上海教室能够见见,要瓜熟蒂落一遍CS奥迪Q5F攻击,受害者必得逐项达成四个步骤:

  1.登陆受信赖网址A,并在该地生成Cookie。

  2.在不登出A的情事下,访谈危急网址B。

  见到这里,你或然会说:“要是本人不知足上述多个标准中的二个,笔者就不会遭遇CS奥德赛F的抨击”。是的,确实如此,但您不能够保障以下情况不会爆发:

  1.你不可能保障你登入了三个网站后,不再张开贰个tab页面并访谈别的的网址。

  2.您无法确认保证你关闭浏览器了后,你本地的Cookie登时过期,你上次的对话已经收尾。(事实上,关闭浏览器不能够甘休一个会话,但大多数人都会错误的以为关闭浏览器就等于退出登入/停止会话了......)

  3.上航海用体育地方中所谓的抨击网址,也许是三个设有其余漏洞的可相信的日常被人拜候的网址。

 

以上内容转自:

 

具体步骤:

1、在Html表单里面使用了@Html.AntiForgeryToken()就足以阻挡CSEscortF攻击。

2、相应的大家要在Controller中也要投入[ValidateAntiForgeryToken]过滤特性。该性情表示检查实验服务器伏乞是或不是被曲解。注意:该天性只可以用来post诉求,get乞求无效。

3、至于JS,大家的品类中援用的是<script src="@Url.Content("~/Content/js/jqueryToken-1.4.2.js")" type="text/JavaScript"></script>在JS时要动用: $.ajaxAntiForgery才行,如:

$.ajaxAntiForgery({
            type: "post",
            data: { GroupName: $("#GroupName").val(), GroupPhones: $("#GroupPhones").val() },
            dataType: "json",
            url: "/Event/Mass/AddGroup",
            success: function (data) {
                if (data) {

                    alert("添加成功 ");
                    $.unblockUI();
                }
                else {
                    alert("添加失败 ");
                }
         }
 })

注:对数码开展增加和删除改时要严防csrf攻击!

(三)BeginFormAntiForgeryPost

Orchard1.6中,Module.txt文件中的设置AntiForgery:enable及页面中BeginFormAntiForgeryPost的意义也是风流倜傥致的,不再赘言!

(四)参谋网站

本文由必威官方最新下载发布于联系我们,转载请注明出处:必威体育手机端:Web安全相关

您可能还会对下面的文章感兴趣: