① 【论跨站脚本(XSS)攻击的危害、成因及防范】跨站脚本攻击
1 引言 在Web 2.0出现以前,跨站脚本(XSS)攻击不是雀大那么引人注目,但是在Web 2.0出现以后,配合流行的AJAX技术,XSS的危害性达到了十分严重的地步。比如,世界上第一个跨站脚本蠕虫发生在MySpace网站,20小时内就传染了一百万个用户,最后导致该网站瘫痪。因此我认为,XSS是在脚本环境下的溢出漏洞,其危害性绝不亚于传统的缓冲区溢出漏洞。
2 XSS攻击的定义
跨站脚本英文名称是(Cross Site Script),为了与层叠样式表(Cascading Style Sheets)区分,故命名为XSS。
XSS攻者键击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面时,嵌入其中的脚本将被解释执行。
3 跨站脚本漏洞的成因
3.1XSS成因概括
XSS其实就是Html的注入问题,攻击者的输入没有经过严格的控制进入了数据库最
终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行Html代码,数据流程如下:攻击者的Html输入―>web程序―>进入数据库―>web程序―>用顷嫌竖户浏览器。
3.2常规跨站漏洞
我们来看一段接收评论的代码:
可以看到,从客户端输入的所有变量没有经过任何过滤就直接进入了数据库。攻击者可以在表单中输入:,点击提交后,那么其他用户在浏览该页面时就会不知不觉打开一个预先挂有木马的页面https://www.省略/muma.html,如果没打相应的补丁,就会中马。当然XSS的攻击方式还有很多,比如通过跨站将上传的图片备份直接得到WebShell、结合AJAX技术通过蠕虫攻击等,因为这不是本文的重点,在这里就不一一列举了。
3.3 UBB跨站漏洞
在很多论坛里发帖时,点击图片模样的按钮,在编辑区域就会出现[IMG][/IMG]的字样,这是采用了一种UBB编码的方式,如果攻击者输入[IMG] javascript:alert(”XSS”) [/IMG],它会默认将其转换为,通过这种方式诱发的跨站漏洞称为UBB跨站漏洞。
4 防范方法
4.1针对常规跨站漏洞
在常规的跨站漏洞中,正是因为攻击者可以不受限制地引入“>”,导致了他可以操纵一个html标记,从而诱发了XSS攻击。因此首先就要过滤掉“>”:
Replace(str,””,”>”)
4.2针对UBB跨站漏洞
UBB跨站漏洞的防范相对来说比较复杂,首先攻击者必须引入javascript或vbscript代码来达到攻击的目的,所以首先要过滤中javascript后面的冒号,将其用中文的冒号替代:
Replace(str,”:”,”:”)
但是HTML支持ASCII这样的编码,攻击者又可以通过重新达到目的(58是冒号的十进制ASCII码),所以必须过滤&符号:
Replace(str,”&”,”&”)
以上虽然已经过滤了来自标签属性的威胁,攻击者还是可以通过触发一个错误事件来达到目的。所以还需过滤掉以下字符:
Replace(str,” ”,” ”)//过滤空格
Replace(str,”=”,”=”)//过滤等号
Replace(str,””””,”"”)//过滤双引号
5 结束语
通过以上分析我们看到,XSS是一种危害较大、较难防范,并且更加隐蔽的攻击方式。其实只要明白其原理,再加上勤加思考防范的对策,就可以根治XSS漏洞。
参考文献
[1]叶子青. ASP网络开发入门与实践.人民邮电出版社,2006.
[2]韩国峰,柯华坤,王磊. ASP网站开发典型模块与实例精讲.电子工业出版社,2006.
② 如何防范XSS跨站脚本攻击测试篇
不可信数据 不可信数据通常是来自HTTP请求的数据,以URL参数、表单字段、标头或者Cookie的形式。不过从安全角度来看,来自数据库、网络服务器和其他来源的数据往往也是不可信的,也就是说,这些数据可能没有完全通过验证。 应该始终对不可信数据保持警惕,将其视为包含攻击,这意味着在发送不可信数据之前,应该采取措施确定没有攻击再发送。由于应用程序之间的关联不断深化,下游直译程序执行的攻击可以迅速蔓延。 传统上来看,输入验证是处理不可信数据的最好办法,然而,输入验证法并不是注入式攻击的最佳解决方案。首先,输入验证通常是在获取数据时开始执行的,而此时并不知道目的地所在。这也意味着我们并不知道在目标直译程序中哪些字符是重要的。其次,可能更加重要的是,应用程序必须允许潜在危害的字符进入,例如,是不是仅仅因为sql认为Mr. O'Malley名字包含特殊字符他就不能在数据库中注册呢? 虽然输入验证很重要,但这始终不是解决注入攻击的完整解决方案,最好将输入攻击作为纵深防御措施,而将escaping作为首要防线。 解码(又称为Output Encoding) “Escaping”解码技术主要用于确保字符作为数据处理,而不是作为与直译程序的解析器相关的字符。有很多不同类型的解码,有时候也被成为输出“解码”。有些技术定义特殊的“escape”字符,而其他技术则包含涉及若干字符的更复杂的语法。 不要将输出解码与Unicode字符编码的概念弄混淆了,后者涉及映射Unicode字符到位序列。这种级别的编码通常是自动解码,并不能缓解攻击。但是,如果没有正确理解服务器和浏览器间的目标字符集,有可能导致与非目标字符产生通信,从而招致跨站XSS脚本攻击。这也正是为所有通信指定Unicode字符编码(字符集)(如UTF-8等)的重要所在。 Escaping是重要的工具,能够确保不可信数据不能被用来传递注入攻击。这样做并不会对解码数据造成影响,仍将正确呈现在浏览器中,解码只能阻止运行中发生的攻击。 注入攻击理论 注入攻击是这样一种攻击方式,它主要涉及破坏数据结构并通过使用特殊字符(直译程序正在使用的重要数据)转换为代码结构。XSS是一种注入攻击形式,浏览器作为直译程序,攻击被隐藏在HTML文件中。HTML一直都是代码和数据最差的mashup,因为HTML有很多可能的地方放置代码以及很多不同的有效编码。HTML是很复杂的,因为它不仅是层次结构的,而且还包含很多不同的解析器(XML、HTML、JavaScript、VBScript、CSS、URL等)。 要想真正明白注入攻击与XSS的关系,必须认真考虑HTML DOM的层次结构中的注入攻击。在HTML文件的某个位置(即开发者允许不可信数据列入DOM的位置)插入数据,主要有两种注入代码的方式: Injecting UP,上行注入 最常见的方式是关闭现有的context并开始一个新的代码context,例如,当你关闭HTML属性时使用">并开始新的 可以终止脚本块,即使该脚本块被注入脚本内方法调用内的引用字符,这是因为HTML解析器在JavaScript解析器之前运行。 Injecting DOWN,下行注入 另一种不太常见的执行XSS注入的方式就是,在不关闭当前context的情况下,引入一个subcontext。例如,将改为 ,并不需要躲开HTML属性context,相反只需要引入允许在src属性内写脚本的context即可。另一个例子就是CSS属性中的expression()功能,虽然你可能无法躲开引用CSS属性来进行上行注入,你可以采用x ss:expression(document.write(document.cookie))且无需离开现有context。 同样也有可能直接在现有context内进行注入,例如,可以采用不可信的输入并把它直接放入JavaScript context。这种方式比你想象的更加常用,但是根本不可能利用escaping(或者任何其他方式)保障安全。从本质上讲,如果这样做,你的应用程序只会成为攻击者将恶意代码植入浏览器的渠道。 本文介绍的规则旨在防止上行和下行XSS注入攻击。防止上行注入攻击,你必须避免那些允许你关闭现有context开始新context的字符;而防止攻击跳跃DOM层次级别,你必须避免所有可能关闭context的字符;下行注入攻击,你必须避免任何可以用来在现有context内引入新的sub-context的字符。 积极XSS防御模式 本文把HTML页面当作一个模板,模板上有很多插槽,开发者允许在这些插槽处放置不可信数据。在其他地方放置不可信数据是不允许的,这是“白名单”模式,否认所有不允许的事情。 根据浏览器解析HTML的方式的不同,每种不同类型的插槽都有不同的安全规则。当你在这些插槽处放置不可信数据时,必须采取某些措施以确保数据不会“逃离”相应插槽并闯入允许代码执行的context。从某种意义上说,这种方法将HTML文档当作参数化的数据库查询,数据被保存在具体文职并与escaping代码context相分离。 本文列出了最常见的插槽位置和安全放置数据的规则,基于各种不同的要求、已知的XSS载体和对流行浏览器的大量手动测试,我们保证本文提出的规则都是安全的。 定义好插槽位置,开发者们在放置任何数据前,都应该仔细分析以确保安全性。浏览器解析是非常棘手的,因为很多看起来无关紧要的字符可能起着重要作用。 为什么不能对所有不可信数据进行HTML实体编码? 可以对放入HTML文档正文的不可行数据进行HTML实体编码,如 标签内。也可以对进入属性的不可行数据进行实体编码,尤其是当属性中使用引用符号时。但是HTML实体编码并不总是有效,例如将不可信数据放入 directlyinascript insideanHTMLcomment inanattributename <...NEVERPUTUNTRUSTEDDATAHERE...href="/test"/> inatagname 更重要的是,不要接受来自不可信任来源的JavaScript代码然后运行,例如,名为“callback”的参数就包含JavaScript代码段,没有解码能够解决。 No.2 – 在向HTML元素内容插入不可信数据前对HTML解码 这条规则适用于当你想把不可信数据直接插入HTML正文某处时,这包括内部正常标签(div、p、b、td等)。大多数网站框架都有HTML解码的方法且能够躲开下列字符。但是,这对于其他HTML context是远远不够的,你需要部署其他规则。 ...... ...... 以及其他的HTML常用元素 使用HTML实体解码躲开下列字符以避免切换到任何执行内容,如脚本、样式或者事件处理程序。在这种规格中推荐使用十六进制实体,除了XML中5个重要字符(&、<、 >、 "、 ')外,还加入了斜线符,以帮助结束HTML实体。 &-->& <-->< >-->> "-->" '-->''isnotrecommended /-->/ ESAPI参考实施 Stringsafe=ESAPI.encoder().encodeForHTML(request.getParameter("input")); No.3 – 在向HTML常见属性插入不可信数据前进行属性解码 这条规则是将不可信数据转化为典型属性值(如宽度、名称、值等),这不能用于复杂属性(如href、src、style或者其他事件处理程序)。这是及其重要的规则,事件处理器属性(为HTML JavaScript Data Values)必须遵守该规则。 content insidesinglequotedattribute 除了字母数字字符外,使用小于256的ASCII值HH格式(或者命名的实体)对所有数据进行解码以防止切换属性。这条规则应用广泛的原因是因为开发者常常让属性保持未引用,正确引用的属性只能使用相应的引用进行解码。未引用属性可以被很多字符破坏,包括[space] % * + , - / ; < = > ^ 和 |。 ESAPI参考实施 String safe = ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( "input" ) ); No.4 – 在向HTML JavaScript Data Values插入不可信数据前,进行JavaScript解码 这条规则涉及在不同HTML元素上制定的JavaScript事件处理器。向这些事件处理器放置不可信数据的唯一安全位置就是“data value”。在这些小代码块放置不可信数据是相当危险的,因为很容易切换到执行环境,因此请小心使用。
③ <script>alert('XSS')</script>
☺ <script>alert('XSS')</script> 是 js 脚本语言,在浏览器中的效果是弹窗, 弹窗内容是 'xss'; 这也是 xss 的常举示例。
④ xss注入漏洞产生的原因xss注入过程步骤是什么防范xss注入的方法有哪些
对于的用户输入中出现XSS漏洞的问题,主要是由于开发人员对XSS了解不足,安全的意识不够造成的。现在让我们来普及一下XSS的一些常识,以后在开发的时候,每当有用户输入的内容时,都要加倍小心。请记住两条原则:过滤输入和转义输出。
一、什么是XSS
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。
在WEB2.0时代,强调的是互动,使得用户输入信息的机会大增,在这个情况下,我们作为开发者,在开发的时候,要提高警惕。
二、XSS攻击的主要途径
XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。
第一种:对普通的用户输入,页面原样内容输出。
打开http://go.ent.163.com/goprocttest/test.jsp(限公司IP),输 入:<script>alert(‘xss’)</script>, JS脚本顺利执行。当攻击者找到这种方法后,就可以传播这种链接格式的链接 (http://go.ent.163.com/goprocttest/test.jsp?key=JSCODE)如:http: //go.ent.163.com/goprocttest/test.jsp?key=<script>alert(‘xss’)& lt;/script>,并对JSCODE做适当伪装,如:
http://go.ent.163.com/goprocttest/test.jsp?key=%3c%73%63%72%69%70 %74%3e%61%6c%65%72%74%28%27%78%73%73%27%29%3c%2f%73%63%72%69%70%74%3e,当其 它用户当点此链接的时候,JS就运行了,造成的后果会很严重,如跳去一个有木马的页面、取得登陆用户的COOKIE等。
第二种:在代码区里有用户输入的内容
原则就是,代码区中,绝对不应含有用户输入的东西。
第三种:允许用户输入HTML标签的页面。
用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂,如下面的四个例子,都可以在IE中运行。
1,直接使用JS脚本。
<img src=”javascript:alert(‘xss’)” />
2,对JS脚本进行转码。
<img src=”javascript:alert(‘xss’)” />
3,利用标签的触发条件插入代码并进行转码。
<img onerror=”alert(‘xss’)” />
4,使用16进制来写(可以在傲游中运行)
<img STYLE=”background-image: /75/72/6c/28/6a/61/76/61/73/63/72/69/70/74/3a/61/6c/65/72/74/28/27/58/53/53/27/29/29″>
以上写法等于<img STYLE=”background-image: url(javascript:alert(‘XSS’))”>
三、XSS攻击解决办法
请记住两条原则:过滤输入和转义输出。
具体执行的方式有以下几点:
第一、在输入方面对所有用户提交内容进行可靠的输入验证,提交内容包括URL、查询关键字、http头、post数据等
第二、在输出方面,在用户输内容中使用<XMP>标签。标签内的内容不会解释,直接显示。
第三、严格执行字符输入字数控制。
四、在脚本执行区中,应绝无用户输入。
⑤ XSS是什么
1、XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
2、恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
3、XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞。
4、另一类则是来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当要渗透一个站点,自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。
⑥ php防止sql注入以及xss跨站脚本攻击
1.post数据
封装转义函数 防sql注入 eag:addslashes($username);addslashes($password);
eag:防止sql注入函数封装
function deepslashes($data){
#判断$data的表现形式 并且需要处理空的情况
if(empty($data)){
return($data);
}
#高级简写 return is_array($data) ? array_map('deepslashes',$data) : addslashes($data);
#初级写法
if(is_array($data)){
#递归循环遍历处理多维数组
foreach ($data as $v) {
return deepslashes($v);
}
}else{
#单一变量
return addslashes($data);
}
#初级写法
}
2.get数据
指url 传参数导致sql发生改变
解决方案
①强制转换,使用函数intval 或者 数据类型 的关键字int
②隐式转换,通过运算,只需要+0即可
3.xss跨站脚本攻击
指恶意攻击向web页面插入html、js标签导致页面出现错误
解决方案
转义标签'<' '>'即可,有以下php函数可解决
htmlspecialchars 函数 和 htmlentites函数
eag:
function deepslashes($data){
#判断$data的表现形式 并且需要处理空的情况
if(empty($data)){
return($data);
}
return is_array($data) ? array_map('deepslashes',$data) : htmlspecialchars ($data);
}
⑦ 最近网上流行的XSS是什么意思
最近网上流行的XSS是小学生的恶称,骂小学生的。
一是指某些人的想法、思维方式、对事物的认知和思考能力如孩子般幼稚、单纯、天真。
二是特指某类相对于同龄的人,在游戏竞技或者社交网络中, 态度傲慢、技术水准较差、拒绝与队友沟通、独断专行、忽视团队合作、甚至喜欢恶语相向的网游玩家。
三是指对没有接触过社会或社会经验不足。
(7)xss写入一句话脚本扩展阅读:
1、小学生技术菜,爱骂人,玻璃心(说他一句就挂机送人头,不管说什么,比如:中路的你不要再送了,然后他就说“我就送”,接着就开始了。)小学生的心思就像星空,摸不着猜不透。
2、大喷子(网络中对喜欢肆意谩骂、地域黑、招黑、互黑等网友的一种广泛性定义。),不分青红皂白就开喷。
3、说话不经过大脑考虑,以自我为中心,可能是在家被宠惯了。
4、没有接触过社会大家庭或接触社会经验不足。比如:参加工作,你要是不让新人上,永远都是新人。这也是小学生。