分享

什么是跨站点脚本攻击

 吴雨虹2kzpi83a 2020-08-18

  

各位在做软件漏扫,尤其是Web应用系统漏扫时,可能会遇到系统存在跨站点脚本攻击(XSS)漏洞的警告,那今天就聊一下它。

概述

跨站点脚本攻击(Cross Site Scripting简称XSS)是一种常见的攻击行为,它是指恶意攻击者在应用系统的Web页面里插入恶意代码,当用户浏览该页面时,嵌入其中Web里面的恶意代码会被执行,从而达到攻击的目的。从原理上讲,跨站点脚本攻击与前面讲的SQL注入攻击一样,都是利用系统对用户输入检查不严格的漏洞,将用户数据变成了可执行的代码。一个完整的XSS过程是这样的:

1.        攻击者想办法在应用系统页面中嵌入了恶意脚本代码;

2.        攻击者想办法让目标用户打开页面链接或浏览页面;

3.        应用系统将含有恶意脚本的页面返回给用户浏览器;

4.        浏览器解析运行恶意脚本。

举个例子:

我们打开一个网址,用Burp Suite这个工具对数据包进行拦截修改,在user参数插入69388%22%3balert(1)%2f%2f755,上述操作相当于实现了XSS攻击的前两步,如下图。

点击Forward按钮图片1
,浏览器弹出如下对话框。

由此可见,注入的脚本“alert(1)”被浏览器执行,攻击行为得手。在XSS攻击过程中,注入的脚本代码被叫做载荷(payload)。

类型

上述使用BurpSuite工具的过程是为了验证目标Web页面是否存在XSS漏洞,真正发起XSS攻击时当然不可能用到它。大体来说,XSS的攻击行为分以下三种:

l 存储型XSS:这种攻击是一种持久性的攻击。XSS脚本作为页面数据的一部分存储在服务器或数据库中,用户访问该页面的时候就会触发代码执行。比如在论坛、博客和留言板系统中,攻击者在发文的过程中将恶意脚本注入到所发文章内容中,随着文章被服务器存储下来,恶意脚本也被存放在服务器或数据库中,当其他用户浏览了被注入恶意脚本的文章时,恶意脚本会在他们的浏览器中得到执行。这种XSS比较危险,容易造成蠕虫,Cookie盗取等。

l 反射型XSS:这种攻击是非持久化攻击。攻击者构造一个链接,链接指向的内容包含了XSS脚本。攻击者通过欺骗等手段(如发送伪造的邮件)诱使用户点击链接触发XSS代码。反射型XSS大多数是用来盗取用户的Cookie信息。上面的例子就属于反射型XSS.

l DOMXSS:这种攻击也属于反射型XSS。它利用了Web页面的文档对象模型(Document ObjectModel,DOM)的特性来执行脚本。因此DOMXSS不经过服务器端,只发生在客户端。

防范

知道了跨站点脚本攻击的原理,也就知道了如何去防范了。整体思路是对用户的输入(URL参数)进行过滤,对输出进行HTML编码。也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行HTML编码,使脚本无法在浏览器中执行。比如,针对前文的例子,可以这样的输入过滤处理:

在前端页面引入RegularValidator控件和一个隐藏文本框,并使用正则表达式"^([^\<\>\"\'\%\;\)\(\&]*)$"判断用户输入是否含有非法字符。

<asp:RegularValidatorID="revun" runat="server"

ControlToValidate="txtInput" ErrorMessage="非法输入"Font-Overline="True"             Validation="^([^\<\>\"\'\%\;\)\(\&]*)$"></asp:RegularValidator>

<asp:TextBox ID="txtInput"runat="server"CausesValidation="True"></asp:TextBox>

相应在后端代码将用户输入内容赋值给隐藏文本框,并验证文本框内容是否含有非法字符:

txtInput.Text =Me.Request.Form("username") + Me.Request.Form("password") +Me.Request.Form("sig") + Me.Request.Form("txt") +Me.Request.Form("logintype")

   revun.Validate()

 If Not revun.IsValid Then

   Me.Response.Write("<script>alert('用户输入可能存在恶意代码!');</script>")

     Exit Sub

 End If

要注意的是,上面的过滤方法采用了黑名单过滤,即符合条件的就被过滤。黑名单过滤虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险。而白名单过滤则相反,符合条件的才不被过滤,白名单虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格过滤的。

至于HTML编码,就是指对这些特殊字符进行编码,以便浏览器直接原样展示而不是处理它们,比如下面的函数:

htmlEncodeByRegExp:function (str){ 

                      var s = "";

                      if(str.length == 0) return "";

                      s = str.replace(/&/g,"&");

                      s = s.replace(/</g,"<");

                      s = s.replace(/>/g,">");

                      s = s.replace(/ /g," ");

                      s = s.replace(/\'/g,"'");

                      s = s.replace(/\"/g,""");

                      return s; 

                   }

由于Web页面和脚本语言的复杂性,实际中XSS攻击的方法多种多样。本文只是从最基本的角度介绍了跨站点脚本攻击的原理和防范思路,在具体应用中,还需要大家根据实际情况应对和解决。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多