怎样过滤跨站恶意跨站脚本攻击击

怎样过滤跨站恶意脚本攻击(XSS) - 释迦&牟尼 - 博客园
随笔 - 192, 文章 - 0, 评论 - 6, 引用 - 0
什么是XSS?XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web
application中的计算机安全漏洞。XSS通过在用户端注入恶意的可运行脚本,若服务器端对用户输入不进行处理,直接将用户输入输出到浏览器,则浏览器将会执行用户注入的脚本。例如:有一个input输入框,要求用户输入名字,用户输入lily&script&alert("hello
world")&/script&,服务器接收到用户的输入,并且直接将用户输入输出到页面上,则会有hello world
的alert对话框出现。如果说这是XSS黑客的自娱自乐,那么盗取用户信息的XSS就不那么友好了。如果用户通过注入脚本,盗取你的用户信息如cookie的内容,仿冒正常用户,进行相应的操作,则危害会更大。获取用户的cookie信息非常简单,只需要使用js获取document.cookie,即可以得到。为了便于分析,我们将在用户输入名字框中输入:lily&script&alert(document.cookie)&/script&,则你就可以看到你的cookie信息显示在alert对话框中了。XSS的分类根据XSS造成的影响,可以将XSS分为非持久型和持久型。1.非持久型,也叫反射型XSS。通过GET和POST方法,向服务器端输入数据。用户输入的数据通常被放置在URL的query
string中,或者是form
数据中。如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接呈现给客户,则可能会造成反射型XSS。反射型XSS是比较普遍的XSS,其危害程度通常被认为较小。但是某些反射型XSS造成的后果会很严重,如在输入框的name中输入&meta
http-equiv="refresh" content="5"
/&,服务器不加处理,将name的值直接送到浏览器,则浏览器会每5秒自动刷新一次。严重者会导致服务器崩溃。2.持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现在浏览器上。则该XSS跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会被触发,用于盗取其他用户的私人信息。常用XSS方式分为以下几种:1. 输入框中直接输入恶意脚本,如:&&&&&&&script&alert(document.cookie)&/script&2. 输入框中输入html标签,在标签中嵌入恶意脚本,如src,href,css style等。&IMG SRC="javascript:alert('XSS');"&;&BODY BACKGROUND="javascript:alert('XSS')"&&STYLE&li {list-style-image: url("javascript:alert('XSS')");}&/STYLE&&UL&&LI&XSS&/br&3.将恶意脚本注入在event事件中,如onClick,onBlur,onMouseOver等事件。&a onmouseover="alert(document.cookie)"&xxs link&/a&4. 在remote style sheet,javascript中,如&LINK REL="stylesheet" HREF="javascript:alert('XSS');"&&SCRIPT/SRC=""&&/SCRIPT&5. META 标签,如&meta http-equiv="refresh" content="5" /&&META HTTP-EQUIV="Set-Cookie" Content="USERID=&SCRIPT&alert('XSS')&/SCRIPT&"&如何预防以上两种XSS攻击?1. 在输入流中截住form data中的恶意脚本&&&&&研究两种XSS攻击,如反射型和存储型XSS攻击,其恶意脚本都是来自用户的输入。因此,可以使用过滤用户输入的方法对恶意脚本进行过滤。对简单的HTTP请求,一般使用GET和POST方法。当使用GET时,用户输入的数据将被放入地址栏的URL中,如:…..。其中,URL之后会放入键值对,对应name1的值为value1,name2的值为value2,等等。而对于POST方法,则用户输入数据仍然以name1=value1&name2=value2.。。。,但是数据键值对不会放进URL之后,而是放进了request的body中。因此,我们得到一个结论,所有的数据都存储在request中,我们可以截下进入server的每一个request,对用户的输入数据进行恶意脚本清理。其中有效的一个方法就是使用spring的filter。代码示例如下,在web.xml中加入以下代码段:&filter&&&&&&&&&&filter-name&XSS&/filter-name&&&&&&&&&&filter-class&com.springapp.domain.XssFilter&/filter-class&&&&&&/filter&&&&&&filter-mapping&&&&&&&&&&filter-name&XSS&/filter-name&&&&&&&&&&url-pattern&/*&/url-pattern&&&&&&/filter-mapping&其中XssFilter为自定义的class,该类必须实现Filter类,在XssFilter类中实现doFilter函数。public class XssFilter implements Filter {&&&&private FilterConfig filterC&&&&@Override&&&&public void init(FilterConfig filterConfig) throws ServletException {&&&&&&&&this.filterConfig = filterC&&&&}&&&&@Override&&&&public
void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {&&&&&&&&chain.doFilter(new RequestWrapper((HttpServletRequest) request), new ResponseWrapper((HttpServletResponse) response));&&&&}&&&&@Override&&&&public void destroy() {&&&&&&&&this.filterConfig =&&&&}}&&&&&那么我们怎样对每个request都进行过滤操作呢?怎么样对用户输入的数据进行操作呢?form数据都存储在什么地方传给servlet的呢?&&&&&通常情况下,可以通过调用request.getParameter来获得单个对应name对应的value。若form的传入参数中,一个name值对应多个value,则可以使用request.getParameterValues来获得name值的多个对应值。少数情况下,当你需要raw
request的适合,可以使用getReader和getInputStream。&&&&&但是我们可以发现,直接对httpServletRequest的parameter进行set操作会报错,因此需要使用HttpServletRequestWrapper。HttpServletRequestWrapper允许我们重写servletRequest的各种方法,以便对request进行直接操作。&&&&&因此,我们可以在自定义的RequestWrapper中,对getParameter和getParameterValues进行重写,从而达到对各个用户输入的form参数的值进行过滤,滤掉form data中的恶意脚本。以下为示例代码:public String[] getParameterValues(String parameter) {&&&&&&&&String[] values = super.getParameterValues(parameter);&&&&&&&&if (values==null)
{&&&&&&&&&&&&&&&&&&&&}&&&&&&&&int count = values.&&&&&&&&String[] encodedValues = new String[count];&&&&&&&&for (int i = 0; i & i++) {&&&&&&&&&&&&encodedValues[i] = xssClean(values[i]);&&&&&&&&}&&&&&&&&return encodedV&&&&}public String getParameter(String parameter) {&&&&&&&&String value = super.getParameter(parameter);&&&&&&&&if (value == null) {&&&&&&&&&&&&&&&&&&&&}&&&&&&&&return xssClean(value);&&&&}2. 在输入流中检测滤掉来自其他网站的URL中的恶意脚本&&&&&当用户不小心点击了被其他黑客提供的假冒URL,则可能在该URL中注入恶意脚本。因此,也需要对这种情况进行处理。因此为确保其他在header中的恶意脚本,需要对request.getHeader进行重写。以下为例子:public String getHeader(String name) {&&&&&&&&String value = super.getHeader(name);&&&&&&&&if (value == null)&&&&&&&&&&&&&&&&&&&&return xssClean(value);&&&&}3. xssClean函数怎样实现才可以过滤掉恶意脚本呢?如果是java语言,推荐使用antisamy。使用antisamy进行XSS清理非常简单,只需要简单的几个步骤即可达到目的。&&&&&1‘. 在pom.xml文件中加入antisamy的dependency,&&&&&&dependency&&&&&&&&&&&&&&groupId&org.owasp.antisamy&/groupId&&&&&&&&&&&&&&artifactId&antisamy&/artifactId&&&&&&&&&&&&&&version&1.5.3&/version&&&&&&&&&&/dependency&&&&&&2’.
加入了dependency之后,就可以在xssClean中加入antisamy对恶意脚本进行清理。其中policy.xml是白名单,policy.xml中规定了各个html元素所必须满足的条件。antisamy的精髓之处在于,使用policy文件来规定你的过滤条件,若输入字符串不满足policy文件中的条件,则会过滤掉字符中的恶意脚本,返回过滤后的结果。具体代码如下:private String xssClean(String value) {&&&&&&&&AntiSamy antiSamy = new AntiSamy();&&&&&&&&try {&&&&&&&&&&&&final CleanResults cr = antiSamy.scan(value, Policy.getInstance("policy.xml"), AntiSamy.SAX);&&&&&&&&&&&&return cr.getCleanHTML();&&&&&&&&} catch (ScanException e) {&&&&&&&&&&&&e.printStackTrace();&&&&&&&&} catch (PolicyException e) {&&&&&&&&&&&&e.printStackTrace();&&&&&&&&}&&&&&&&&&&&&}这样,我们就将client端用户输入的request,在server端进行了拦截,并且进行了过滤。对于输出端,XSS的防御将在下一篇文章中进行详细介绍。转载请注明出处,谢谢。【图文】跨站脚本攻击_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
跨站脚本攻击
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
跨站脚本攻击(Cross Site Scripting,简称XSS,亦翻为跨网站的入侵字串)又有新的攻击语法!此次触发恶意脚本不需要用到script 标签(譬如&script&alert(1)&/script&),也不用javascript 协定(譬如javascript:alert(1)),而是8 月26 日所揭露的
&isindex type=image src=1 onerror=alert(1)&
<isindex type=image src=1 onerror=alert(1)>
&isindex&是一个很早就有但普遍少用的标签,其功能与&form&、&input&、&textarea&,以及&select&类似,都可供使用者输入资料。onerror属性也是鲜为人知。
各家浏览器在实现HTML的支援度不尽相同,各国语系又对编码有所差异,这些都使得跨站脚本攻击(XSS)的攻击语法千变万化,也让骇客更能规避掉不少治标的防护机制,像是WAF解决方案,毕竟新的攻击手法就要新的规则(好加在我们家的WAF可以帮你生规则,请参考你期望的WAF是? XD),源码检测才是治本的作法阿,从Web应用程式端利用编码、过滤等方式让这些奇奇怪怪的攻击语法全部缴械!(请参考谈源码检测: CodeSecure的架构与技术) 我们在各个常见浏览器平台(Microsoft Internet Explorer、Mozilla Firefox、Opera,以及Google Chrome)的测试结果是,这个跨站脚本攻击(XSS)新攻击语法仅适用于IE系列的浏览器(含最新的IE8)。注:我们在下列示范中所采用的alert(1)字串可换成各种恶意脚本,而并非跨站脚本攻击(XSS)只能做到跳出一个视窗打招呼。
&isindex type=image src=1 onerror=alert(1)&
<isindex type=image src=1 onerror=alert(1)>
稍加调整甚至不需要定义src属性也可成功:
&isindex type=image onerror=alert(1) src=&攻击语法
<isindex type=image onerror=alert(1) src=>攻击语法
跨站脚本攻击(XSS)不亏是名列最新 OWASP Top 年OWASP十大Web资安漏洞)的榜首,「简单好用、防不胜防」!
简单来说,跨站脚本攻击(XSS)的基本精神就是骇客在HTML文件中安插网页脚本语言(譬如JavaScript或VBScript),让受骇方的浏览器在浏览网页时进而去执行。这延伸两个讨论议题:
1.为何骇客能够在HTML文件中安插这些脚本?
在Web 2.0的时代,大部分的网页或多或少都需要产生动态内容,都需要与使用者互动,一旦使用者所提供的资料(譬如恶意脚本字串)有机会成为动态输出的HTML内容的一部份时,这样恶意脚本就被成功地安插进原本合法无恶意的HTML文件了。这也是为何许多客户最后选择从源码检测着手,揪出这些进入点与输出点,治本地解决跨站脚本攻击(XSS)。
2.为何浏览器会去执行这些脚本?
浏览器只是如实地遵循W3C (World Wide Web Consortium)所制定的 HTML标准(目前最新版本为 HTML 4.01),正确地支援各语法标签应表现的样式与行为,因此当应该执行脚本时,就会执行这些脚本,尽管他们可能是恶意的,包括偷取Cookie、置换网页、转址、攻击其他网站等。
本文摘自网络由攻防研究室(www.91ri.org) 小组收集整理.转载本文请著名原文地址及原作者版权信息。如何防御跨站脚本攻击
跨站脚本攻击(XSS)是web应用程序中最危险和最常见的安全漏洞之一。安全研究人员发现这个漏洞在最受欢迎的网站,包括谷歌、Facebook、亚马逊、PayPal,和许多其他网站。如果你看看bug赏金计划,大多数报告的问题属于 XSS。为了防止跨站脚本攻击,浏览器也有自己的过滤器,但安全研究人员总是想方设法绕过这些过滤器。这个漏洞是通常用于执行cookie窃取、恶意软件传播,会话劫持,恶意重定向。在这种攻击中,攻击者将恶意JavaScript代码到网站,这样由攻击者在脚本中执行的操作。该漏洞是容易找到但很难修补。这就是为什么它可以发现在任何网站如果你尝试。
在这篇文章,我们会看到什么跨站脚本攻击是和如何创建一个筛选器来防止它。我们还将看到几个开放源码库,将帮助您在您的 web 应用程序中的跨站点脚本漏洞修补。
什么是跨站脚本攻击?
跨站点脚本攻击是攻击者尝试注入恶意的脚本在受信任的网站上执行恶意操作的一种攻击方法。在跨站脚本攻击中,恶意代码在浏览器端上执行对用户影响。跨站点脚本也称为是 XSS 攻击。第一个问题是记住的是为什么我们称之为“XSS”而不是“CSS。答案很简单,知道谁在web开发工作的人。在网页设计中,我们有级联样式表CSS。所以跨站点脚本被称为 XSS,所以它不会不混乱CSS。
现在,回到 XSS。当 web 应用程序中执行一个脚本,攻击者提供给用户,就会发生跨站脚本攻击。这个缺陷可以在一个应用程序任何地方发现,用户输入了不正确的编码。。如果输入不正确编码并过滤,这种注入恶意脚本将发送给用户。一个浏览器没办法知道它不应该相信一个脚本。当浏览器执行的脚本时,在客户端上执行恶意操作。大多数时间,XSS 用来窃取 cookie 和执行会话劫持偷取有效用户会话令牌。
XSS 的几个例子:
你几乎在所有的网站上看到了一个搜索框。在此搜索框中,您可以搜索到网站上任何可用的东西。这个搜索表单看起来这样
&form action="search.php" method="get"&
&input type="text" name="q" value="" /&
&input type="submit" value="send" /&
在php网页上显示的搜索结果,同时它也列出了在“关键字”的搜索结果。
web页面上,它通常编码如下:
&h3&You Searched for: &!--?php echo($_GET['q']) ?--&
不管一个人搜索什么,它将显示搜索结果在网页上。现在想想如果一个攻击者尝试注入恶意脚本,这边会发生什么。
“&&script&alert(‘XSS injection’)&/script&
如果 web 应用程序中没有对输入编码和过滤恶意脚本,它将会输入,当被访问时,它将被调用输出到网页上。所以,在关键字的地方,它类似于:
&h3& You Searched for: “&&script&alert(‘XSS injection’)&/script&
它将由浏览器执行,将显示一个警告框,提示"XSS 注入"。
假设有一个网站有消息传递功能。在这个网站上,用户可以发送邮件到他们的联系人。基本表单将会看起来像这样:
&form action="sendmessage.php" method="post'"&
&textarea name="message"& &/textarea&
&input type="submit" value="send" /&
当提交此表单时,该邮件将会存储在数据库中。他从收件箱打开邮件时,另一人将看到消息。假设攻击者已经在消息中发送一些 cookie 窃取的脚本。此脚本将作为一条消息存储在网站上。当别人试图读取消息时,将执行该 脚本窃取cookie 和他会话 id ,现在是攻击者的一面。用一个有效的会话 id,攻击者可以劫持其他人的帐户。
跨站脚本攻击的类型
没有标准的分类,但大部分专家将XSS分为 三种类型: 非持久性 XSS、 持久性 XSS 和基于 DOM 的 XSS。
非持久性跨站脚本攻击
非持久性 XSS 也称为是反射跨站漏洞。它是最常见的 XSS 类型。在这,注入数据反射给攻击者。如果你看看我们有上面的例子,第一个 XSS 列子是非持续的攻击。典型的非持久性 XSS 包含与 XSS 的链接。
持久性跨站脚本攻击(存储性)
持久性跨站脚本是存储跨站点脚本。当它发生时 XSS 变量存储在网站的数据库,每当用户打开网页时执行。每次用户打开浏览器,脚本执行。在上述示例中,网站消息的第二个例子是持久的 XSS 攻击。持久性 XSS 比非持久性 XSS更有害,因为每当用户打开要查看的内容的网页时,将自动执行该脚本。谷歌的 orkut 是脆弱的持久性 xss 攻击,破坏网站名誉。
基于DOM的跨站脚本攻击
基于 DOM 的 XSS 有时也称为"type-0 XSS"。它发生时, XSS 变量执行由 DOM 修改用户的浏览器网页的结果。在客户端的 HTTP 响应不会更改,但以恶意的方式执行的脚本。这这是最先进和最知名的type-0 XSS。大多数情况下,这个漏洞之所以存在是因为开发商不了解它是如何工作。
跨站脚本攻击出现的原因
跨站脚本攻击的主要原因是用户对开发商的信任。开发者很容易认为用户将不会执行什么错误,所以他们创建应用程序而无需使用任何额外的努力,阻止用户输入任何恶意活动。另一个原因是,这种攻击有许多变种。有时,正确地尝试过滤任何恶意脚本的应用程序获取混淆,并允许脚本。在过去的几个月里,我们已经看到了许多种不同的XSS的变体,可以绕过大部分可用的XSS过滤器。
所以我们不能说一个网站是完全保护。但我们可以尽力过滤大部分的事情,因为特别的变量主要来自负责安全的人员,他们也会帮助你,修补并使你的过滤器更智能。
如何创造一个良好的XSS过滤器阻止大部分XSS Vectors
在我们开始创建一个XSS过滤之前,我想说一件重要的事情:我们不要求有一个完善的XSS过滤器。研究人员一直觉得奇怪的方法来绕过过滤器。但我们可以努力使一个过滤器,可以过滤容易和著名的XSS vectors。至少你将成为安全的脚本小子。
如果你没有理解你不能修补的XSS。你应该有一个想法,攻击者注入脚本。你应该有XSS vectors知识。
让我们从基本的过滤器:
有一个简单的规则您需要遵循:编码用户指定的每个数据。如果数据不是用户指定的但通过 GET 参数提供,编码这些数据。即使表单可以包含xss vectors。所以,每次你要在网站上使用一个变量的值,请尝试清除XSS。
这些都是在您的网站在使用之前必须被正确过滤的主要数据。
HTTP引用对象
从表单中获取参数
表单 POST 的参数
window.location
document.referrer
document.location
document.url
document.urlunencoded
cookie数据
数据库中的数据,如果没有正确地验证用户的输入
首先,对所有的 &&,进行编码。这应该是您的 XSS 过滤的第一步。请参见编码如下:
‘ –& '
/ –& /
为此,您可以在 PHP 中使用htmlspecialchars()函数。所有 HTML 标记和特殊字符,然后对它进行都编码。
$input = htmlspecialchars($input, ENT_QUOTES);
如果 $input was= “&&script&alert(1)&/script&
此函数将转换它&&&script&prompt(1)&/script&
通过解码它在某个地方使用的编码值时,还可以帮助这行:
$input = str_replace(array(‘&’,'&’,'&’), array(‘&’,'&’,'&’), $input);
一个变量可以使用 HTML 字符,所以你应该也来过滤这些。添加此规则:
$input= preg_replace(‘/(&#*\w+)[\x00-\x20]+;/u’, ‘$1;’, $data);
$data = preg_replace(‘/(&#x*[0-9A-F]+);*/iu’, ‘$1;’, $input);
但仅靠这些是不会帮你的。有很多地方的输入不需要脚本标签。攻击者可以注入一些事件的函数来执行脚本。有许多方法,攻击者可以绕过这个过滤器。因此,我们需要考虑所有的可能性,并添加一些其他的东西,使滤波器增强。不只是JavaScript,你也需要摆脱串联样式表和XML数据以防止XSS。
此外上 OWASP 可用来防止 XSS 的完整详细的指南。
开放源码库,用于防止 XSS 攻击
PHP AntiXSS
这是一个不错的 PHP 库,可以帮助开发人员从跨站脚本漏洞添加额外的一层保护。它会自动检测编码,必须经过过滤的数据编码。库的使用是很容易的。你可以阅读更多关于它在这里: https://code.google.com/p/php-antixss/
xss_clean.php filter
这是一个强的XSS过滤器,清除各种URF编码和嵌套的利用。开发人员在分析了各种来源之后建功能。这种编码的功能是可以免费从GitHub。请看这里:https://gist.github.com/mbijon/1098477
HTML Purifier
这是一个标准的HTML过滤库编写的PHP。这将删除所有恶意代码的输入和防止XSS攻击网站。它也是作为大多数 PHP 框架的插件用。
在这里阅读更多关于HTML器:http://htmlpurifier.org/
xssprotect
xssprotect 是另一个很好的库,给开发者提供了一个方法来清除XSS攻击
vectors。此库的工作原理通过创建网页的 HTML 标签树。然后它将分析页面相匹配的所有标记。之后,它要求过滤器接口来过滤不当的 HTML 属性和 XSS 攻击。此库是 Java 编写的。
阅读更多关于此库:https://code.google.com/p/xssprotect/
XSS HTML Filter
这是Java的另一个XSS过滤器。这是一个简单的实用工具,可以用来正确的跨站脚本和恶意的 HTML 代码注入的用户输入。
阅读更多关于此库:http://finn-no.github.io/xss-html-filter/
xss是最危险的网站安全漏洞之一。它以各种方式破坏用户使用网站。主要是它用于执行会话劫持攻击。我们也道修补 XSS 是可能的但我们不能 100%肯定没有人能打破我们的过滤规则。黑客总是找到办法,打破过滤规则安全。如果你真的想要制作一个难XSS 过滤规则,研究大多数可用的 XSS vectors。然后进行的不同种类的攻击模式的列表。分析列表和代码的功能识别攻击模式和阻止攻击。我也增添了几个开放源代码可用库,如果你不知道如何修补该漏洞,以及如何保护您的网站。您可以使用。
作为网站所有者或 web 开发人员,它是你的责任,创造一个安全的应用程序,保护用户的数据,所以你必须找到并修补危险 web 应用程序漏洞。
如果您创建了一个函数,可以筛过滤XSS vectors函数,您可以共享您通过下面的注释框中的函数。发表评论,表达你的意见。
本文由小安攻防研究室翻译,如有翻译错误,请联系管理员,谢谢,希望此文对你有所帮助
原文:tp://resources.infosecinstitute.com/how-to-prevent-cross-site-scripting-attacks/
Pavitra Shandkhdhar 是一个工程研究生和安全研究员。他感兴趣的领域是 web 渗透测试。他喜欢在他的空闲时间在网站和玩计算机游戏中找到的漏洞。他目前是与信息安全研究所研究员。
本文来自:,永久链接:
WP Cumulus Flash tag cloud by
9 or better.
文章总数:146 篇
评论总数:13 篇</li
标签总数:31 个
友链总数:6 个
建站日期:日
运行时间:1995 天
最后更新:日}

我要回帖

更多关于 跨站脚本过滤 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信