各位在做软件漏扫,尤其是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按钮 由此可见,注入的脚本“alert(1)”被浏览器执行,攻击行为得手。在XSS攻击过程中,注入的脚本代码被叫做载荷(payload)。 类型 上述使用BurpSuite工具的过程是为了验证目标Web页面是否存在XSS漏洞,真正发起XSS攻击时当然不可能用到它。大体来说,XSS的攻击行为分以下三种: l 存储型XSS:这种攻击是一种持久性的攻击。XSS脚本作为页面数据的一部分存储在服务器或数据库中,用户访问该页面的时候就会触发代码执行。比如在论坛、博客和留言板系统中,攻击者在发文的过程中将恶意脚本注入到所发文章内容中,随着文章被服务器存储下来,恶意脚本也被存放在服务器或数据库中,当其他用户浏览了被注入恶意脚本的文章时,恶意脚本会在他们的浏览器中得到执行。这种XSS比较危险,容易造成蠕虫,Cookie盗取等。 l 反射型XSS:这种攻击是非持久化攻击。攻击者构造一个链接,链接指向的内容包含了XSS脚本。攻击者通过欺骗等手段(如发送伪造的邮件)诱使用户点击链接触发XSS代码。反射型XSS大多数是用来盗取用户的Cookie信息。上面的例子就属于反射型XSS. l DOM型XSS:这种攻击也属于反射型XSS。它利用了Web页面的文档对象模型(Document ObjectModel,DOM)的特性来执行脚本。因此DOM型XSS不经过服务器端,只发生在客户端。 防范 知道了跨站点脚本攻击的原理,也就知道了如何去防范了。整体思路是对用户的输入(和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攻击的方法多种多样。本文只是从最基本的角度介绍了跨站点脚本攻击的原理和防范思路,在具体应用中,还需要大家根据实际情况应对和解决。 |
|
来自: 吴雨虹2kzpi83a > 《密码学》