也谈跨站脚本攻击与防御

网络上曾经有过关于跨站脚本攻击与防御的文章,但是随着攻击技术的进步,以前的关于跨站脚本攻击的看法与理论已经不能满足现在的攻击与防御的需要了,而且由于这种对于跨站脚本认识上的混乱,导致现在很多的程序包括现在的动网都存在着跨站脚本过滤不严的问题,希望本文能给写程序的与研究程序的带来一点思路。

还是首先看看跨站脚本漏洞的成因,所谓跨站脚本漏洞其实就是Html的注入问题,恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码,数据流程如下:

恶意用户的Html输入————>web程序————>进入数据库————>web程序————>用户浏览器

这样我们就可以清楚的看到Html代码是如何进入受害者浏览器的了,我们也就可以根据这个流程来讨论跨站脚本的攻击与防御了!

1 什么是HTml输入?

这里给出一个HTml代码的示例

<img src="http://www.loveshell.jpg" width=100 onerror=alert("载入图片错误!")>

很多的程序最终都是将用户的输入转换成这种形式的。可以看到<>是告诉浏览器这是一个Html标记,img是这个Html标记的名称,src是这个标记的第一个属性,=后面是这个属性的值,后面的width是第二个属性,onerror是标记的事件属性。大家可以看到,一个Html标记是包括很多元素的,并不是传统意义上的只有输入<>才会注入Html,事实上只要你的输入处在Html标签内,产生了新的元素或者属性,就实现了跨站脚本攻击!实际上大多数隐秘的跨站脚本攻击是不需要<>的,因为现在的Ubb标签已经让你处在了Html标记之内,很有意思,不是么?

2 哪里才是罪恶的来源?

既然我们的目标是引入代码在目标用户的浏览器内执行,那么我们来看看哪些地方可以引入HTml代码吧!如果用户可以不受限制的引入<>,那么很显然他可以完全操纵一个Html标记,譬如<script>alert('xss')</script>这样的形式,这对于追求安全的程序来说是绝对不允许的,所以首先要做转换的就是<>,通过如下代码:

过滤代码:

replace(str,"<","<")

replace(str,">",">")

好了,用户可能不能构造自己的HTml标记了,那么利用已经存在的属性如何呢?下面的代码依然可以工作得很好:

<img src="javascript:alert(/xss/)" width=100>

因为很多的Html标记里属性都支持javascript:[code]的形式,很好,很多的程序意识到了这一点,可能做了如下的转换:

过滤代码

Dim re

Set re=new RegExp

re.IgnoreCase =True

re.Global=True

re.Pattern="javascript:"

Str = re.replace(Str,"javascript:")

re.Pattern="jscript:"

Str = re.replace(Str,"jscript:")

re.Pattern="vbscript:"

Str = re.replace(Str,"vbscript:")

set re=nothing

你看,只要发现以javascript等脚本属性的形式都会被过滤掉,失去了:的脚本代码是起不了作用的!这样完美了么?事实上Html属性的值,注意是值而不是属性本身是支持&#ASCii这种形式表示的,譬如上面的代码可以换成这样:

<img src="javascript:alert(/xss/)" width=100>

代码又执行了,呵呵!看来你漏掉了点什么哦,加上这个代码吧!

replace(str,"&","&")

行了,&失去它原来的意义了,用户不能以其他方式表示Html属性值了哦!等等,这样的过滤真可以相信么?只要发现这种过滤的关键字机制,饶过就是简单的问题了:

<img src="javas cript:alert(/xss/)" width=100>

没有javascript关键字了哦!注意中间那个是tab键弄出来的!关键字被拆分了哦!这是个很麻烦的问题,很多人忘记了这些特殊的字符,呵呵!有人想到要过滤空格了,在过滤之前我们再看看其他的一些东西吧!也许我们现在所处的src属性已经无法利用了,但是我们依然可以产生自己的属性或者事件机制哦!依然是可以执行Html代码的,首先说说事件机制吧:

<img src="#" onerror=alert(/xss/)>

这样依然可以执行代码的哦!明白问题出在哪了,不是么?有的程序员仿佛明白了,注意我说的是仿佛,动网就是一个典型的例子,事件属性不是要onerror么?很多人开始用正则表达式了,发现关键的词如onerror就会做转换或者提示用户不执行,是不是没有机会了呢?

当然不是的,事件只是让代码运行的一种方法而不是所有的,可以定义事件了那么也就可以实现自己弄出自己的属性了,试试下面的:

<img src="#" style="Xss:expression(alert(/xss/));">

呵呵,还是执行了哦!在做关键字过滤之后有人发现是不是属性之间分隔要用到空格,好,他们把空格堵死了(这样认为的人很多,呵呵)!将空格转成 是个很普遍的方法?是么?甚至还可以让别人无法关键字拆分,不要太自信了,试试下面的代码看看如何:

<img src="#"/**/onerror=alert(/xss/) width=100>

嘿嘿,Good Work!这好象是利用了脚本里注释会被当作一个空白来表示造成的!那怎么办呢?上面提到的好象一直都是在进行被动的攻击防御,为什么不抓住他的本源出来呢?哪里出了问题哪里堵上!

3 本质

上面的问题好象本质上就是一个东西,那就是用户超越了他所处的标签,也就是数据和代码的混淆,对付这种混淆的办法就是限制监牢,让用户在一个安全的空间内活动,这通过上面的分析大家也可能已经知道,只要在过滤了<>这两个人人都会去杀的字符之后就可以把用户的输入在输出的时候放到""之间,现在的一般的程序都是这样做的,譬如将会转化成<img src="http://www.loveshell.net">这是个好的安全习惯,然后呢?就要让用户的输入处在安全的领域里了,这可以通过过滤用户输入里""实现,但是不要忘记了,这个标签本身也是不安全的,过滤掉空格和tab键就不用担心关键字被拆分饶过了,然后就是用文章中提到的办法过滤掉script关键字,最后就是防止用户通过&#这样的形式饶过检查,转换掉&吧!

4 困惑

在文章中开始提到的图里可以看到,数据的转换和过滤是可以在3个地方进行转换的,在接受数据的时候可以转换下,在进入数据库的时候可以转换下,在输出数据的时候也可以转换下,但是困惑在哪里呢?不得不面对一个问题就是许多时候程序员舍不得为安全做出那么大的应用上的牺牲,安全是要有代价的,譬如现在邮箱的就不愿意舍弃html标签,因为需要支持多资多彩的页面,所以他们侧重于XSS的IDS检测的性质,只要发现不安全的东西就会转化,但是攻击是无法预知的,漂亮的东西总是脆弱的,有限制,肯定就有人会饶过,呵呵。本文没什么技术含量,只是希望搞安全的脚本人员能更加的了解Xss,跨站,不是那么简单滴!

时间: 2024-09-23 10:07:05

也谈跨站脚本攻击与防御的相关文章

也谈跨站脚本攻击与防御_木马相关

网络上曾经有过关于跨站脚本攻击与防御的文章,但是随着攻击技术的进步,以前的关于跨站脚本攻击的看法与理论已经不能满足现在的攻击与防御的需要了,而且由于这种对于跨站脚本认识上的混乱,导致现在很多的程序包括现在的动网都存在着跨站脚本过滤不严的问题,希望本文能给写程序的与研究程序的带来一点思路. 还是首先看看跨站脚本漏洞的成因,所谓跨站脚本漏洞其实就是Html的注入问题,恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码,数据流

从开发角度浅谈CSRF攻击及防御

  什么是CSRF CSRF可以叫做(跨站请求伪造),咱们可以这样子理解CSRF,攻击者可以利用你的身份你的名义去发送(请求)一段恶意的请求,从而导致可以利用你的账号(名义)去--购买商品.发邮件,恶意的去消耗账户资源,导致的一些列恶意行为.CSRF可以简单分为Get型和Post型两种. Get型CSRF: 看到这个名字,很明显是发送GET请求导致的.我这里简单的说一下:GET型的CSRF利用非常简单,通常只要发送一段HTTP请求.简单的说,如果一个网站某个地方的功能,比如(用户修改自己邮箱)是

《XSS跨站脚本攻击剖析与防御》—第6章6.1节参 考 文 献

参 考 文 献 XSS跨站脚本攻击剖析与防御 [1] <精通 JavaScript> (美)John Resi /陈贤安(译) [2] <JavaScript核心技术> (美)Shelley Powers /苏敬凯(译) [3] <XSS Attacks: Cross Site Scripting Exploits and Defense>Seth Fogie/Jeremiah Grossman/Robert Hansen/Anton Rager/Petko D. Pe

《XSS跨站脚本攻击剖析与防御》目录—导读

内容提要 XSS跨站脚本攻击剖析与防御 本书是一本专门剖析XSS安全的专业书,总共8章,主要包括的内容如下. 第1章 XSS初探,主要阐述了XSS的基础知识,包括XSS的攻击原理和危害.第2章 XSS利用方式,就当前比较流行的XSS利用方式做了深入的剖析,这些攻击往往基于客户端,从挂马.窃取Cookies.会话劫持到钓鱼欺骗,各种攻击都不容忽视.第3章 XSS测试和利用工具,介绍了一些常见的XSS测试工具.第4章 发掘XSS漏洞,着重以黑盒和白盒的角度介绍如何发掘XSS漏洞,以便帮助读者树立安全

《XSS跨站脚本攻击剖析与防御》—第6章6.4节利用Flash进行XSS攻击剖析

6.4 利用Flash进行XSS攻击剖析 XSS跨站脚本攻击剖析与防御 利用嵌入Web页面中的Flash进行XSS有一个决定因素:allowScriptAccess属性.allowScriptAccess是使用或 下面是一个简单的示例: allowScriptAccess属性控制着Flash与HTML页面的通信,可选的值有3个: always:允许随时执行脚本操作 never:禁止所有脚本执行操作 samedomain:只有在Flash 应用程序来自与HTML页相同的域时才允许执行脚本操作 其属

《XSS跨站脚本攻击剖析与防御》—第6章6.2节 Flash安全模型

6.2 Flash安全模型XSS跨站脚本攻击剖析与防御Adobe的Flash技术已经变得越来越流行了,现在该软件不仅用于创建动画和广告,而且还用来开发复杂的应用程序.借助于ActionScript,Flash具备了与服务器的交互功能,当然,不可避免地成为漏洞和后门程序的主攻之地,越来越多的黑客开始着力发掘Flash安全漏洞,基于Flash的客户端攻击日渐密集,包括我们熟知的XSS.CSRF等. 自Flash7.0问世以来,Flash的安全模型(Security Model)就开始运行,主要提供以

《XSS跨站脚本攻击剖析与防御》—第6章6.3节Flash客户端攻击剖析

6.3 Flash客户端攻击剖析XSS跨站脚本攻击剖析与防御对Flash的基础概念和安全模型进行详细介绍后,现在我们来讨论一些比较实际.也是大家最关心的问题--Flash的安全漏洞. 最早研究Flash漏洞的安全人员要算是Stefano Di-Paola,当时他在OWASP发布了几篇论文,详细介绍了Flash的众多安全漏洞,以及如何利用这些漏洞执行XSS.CSRF之类的攻击,下面让我们一步步进行讨论. 6.3.1 getURL() & XSS在Flash中被利用最多是 XSS漏洞.第一个Flas

《XSS跨站脚本攻击剖析与防御》—第6章6.5节利用Flash进行CSRF

6.5 利用Flash进行CSRFXSS跨站脚本攻击剖析与防御Flash在客户端提供了两个控制属性:allowScriptAccess属性和allowNetworking属性,其中AllowScriptAccess控制Flash与HTML页面的通信,如果设置不恰当会导致XSS:而AllowNetworking控制Flash与外部网络的通信,如果设置不当会导致CSRF. CSRF的中文名称是"跨站请求伪造",和XSS一样是一种常见的Web程序漏洞(攻击手段),CSRF能够做的事情是以你的

面对跨站脚本攻击XSS的安全防御的有价值的建议

此文章主要阐述的是面对跨站脚本攻击XSS的安全防御的相关建议,你如果对跨站脚本攻击XSS的安全防御的相关建议有兴趣的话你就可以点击以下的文章进行观看了,以下就是文章的详细内容介绍,望大家借鉴.XSS攻击作为Web业务的最大威胁,危害的不仅仅是Web业务本身,对访问Web业务的用户也会带来直接的影响,如何防范和阻止XSS攻击,保障Web站点的业务安全呢? 首先我们就要了解什么是XSS攻击.第 1 页 面对跨站脚本攻击XSS的安全防御建议XSS攻击作为Web业务的最大威胁之一,不仅危害Web业务本身