【asp精品源码栏目提醒】:网学会员在asp精品源码频道为大家收集整理了“跨站脚本攻击解析 - 其它资料“提供大家参考,希望对大家有所帮助!
跨站脚本攻击解析1 前言 跨站脚本攻击(XSS)就是常见的Web攻击技术之一,由于跨站脚本漏洞易于出现且利用成本低,所以被OWASP列为当前的头号Web安全威胁。
本文将从跨站脚本漏洞的产生原理、攻击手法、检测方法和防御手段四个方面出发,全面的介绍跨站脚本漏洞的方方面面,为开发人员、安全测试人员以及对Web安全感兴趣的同学提供一份跨站脚本漏洞的技术参考手册。
2 跨站脚本漏洞介绍2.1 什么是跨站脚本漏洞 跨站脚本漏洞(Cross Site Scripting,常简写作XSS)是Web应用程序在将数据输出到网页的时候存在问题,导致攻击者可以将构造的恶意数据显示在页面的漏洞。
因为跨站脚本攻击都是向网页内容中写入一段恶意的脚本或者HTML代码,故跨站脚本漏洞也被叫做HTML注入漏洞(HTML Injection)。
与SQL注入攻击数据库服务器的方式不同,跨站脚本漏洞是在客户端发动造成攻击,也就是说,利用跨站脚本漏洞注入的恶意代码是在用户电脑上的浏览器中运行的。
2.2 跨站脚本漏洞的危害 跨站脚本攻击注入的恶意代码运行在浏览器中,所以对用户的危害是巨大的——也需要看特定的场景:跨站脚本漏洞存在于一个无人访问的小站几乎毫无价值,但对于拥有大量用户的站点来说却是致命的。
最典型的场景是,黑客可以利用跨站脚本漏洞盗取用户Cookie而得到用户在该站点的身份权限。
据笔者所知,网上就有地下黑客通过出售未公开的GMail、雅虎邮箱及hotmail的跨站脚本漏洞牟利。
由于恶意代码会注入到浏览器中执行,所以跨站脚本漏洞还有一个较为严重的安全威胁是被黑客用来制造欺诈页面实现钓鱼攻击。
这种攻击方式直接利用目标网站的漏洞,比直接做一个假冒网站更具欺骗性。
另外,控制了用户的浏览器,黑客还可以获取用户计算机信息、截获用户键盘输入、刺探用户所处局域网信息甚至对其他网站进行GET Flood攻击。
目前互联网已经有此类利用跨站脚本漏洞控制用户浏览器的黑客工具出现。
当然,虽然跨站脚本攻击是在客户端浏览器进行,但是最终也是可以攻击服务器的。
笔者就曾在安全测试过程中就利用某Blog程序的跨站脚本漏洞得到网站管理员身份并最终控制Web服务器。
2.3 跨站脚本漏洞的产生 跨站脚本漏洞是如何产生的呢? 大部分Web漏洞都源于没有处理好用户的输入,跨站脚本也不例外。
请看以下一段PHP代码: ltPHP echo quot欢迎您,quot._GETname gt 稍微解释一下,这段PHP代码的意思是在页面输出字符串“欢迎您,”和URL中name参数的值,比如用浏览器访问这个文件:http://localhost/test23.phpnamelakehu,页面上就会出现“欢迎您,lakehu”字样。
其中lakehu是我们通过URL中的参数name传入的,name的值就是用户的输入。
我们知道,浏览器对网页的展现是通过解析HTML代码实现的,如果我们传入的参数含有HTML代码呢?对,浏览器会解析它而不是原封不动的展示——这个就与Web应用程序的设计初衷相反吧。
这样通过参数访问刚才的PHP页面:http://localhost/test23.phpnamelakeltsgthult/sgt,你将看到HTML标记被浏览器解释了: 变本加厉的,如果传入一段脚本ltscriptgtcodelt/scriptgt,那么脚本也会执行。
用这样的URL将会执行JavaScript的alert函数弹出一个对话框:http://localhost/test.phpnamelakeltscriptgtalert123456lt/scriptgt 通过上面简单的示例我们已经知道,Web应用程序在处理用户输入的时候没有处理好传入的数据格式就会导致脚本在浏览器中执行,这就是跨站脚本漏洞的根源。
2.4 跨站脚本漏洞的分类2.4.1 非持久型XSS 非持久型XSS(Non-persistent)又叫做反射XSS(Reflect XSS),它是指那些浏览器每次都要在参数中提交恶意数据才能触发的跨站脚本漏洞。
前一节演示的XSS漏洞属于这种类型,因为每次我们都是需要向参数name中提交恶意数据来实现跨站脚本攻击。
一般来说,凡是通过URL传入恶意数据的都是非持久型XSS。
当然,也有通过表单POST的XSS例子: ltPHP echo quot欢迎您,quot._POSTname gt Web应用程序获取的参数name已经由GET变为POST了,要触发这个XSS漏洞就要稍微复杂一点,我们需要写一个网页: ltform actionquothttp://localhost/test.phpquot methodquotpostquotgt ltinput namequotnamequot valuequotltscriptgtalert123456lt/scriptgtquot typequothiddenquot /gt ltinput namequotssquot typequotsubmitquot valuequotXSS提交测试quot /gt lt/formgt 点击“XSS提交测试”按钮,你就又会看到浏览器弹出了可爱的对话框2.4.2 持久型XSS 持久型XSS(Persistent)又叫做存储XSS(Stored XSS),与非持久型XSS相反,它是指通过提交恶意数据到存储器(比如数据库、文本文件等),Web应用程序输出的时候是从存储器中读出恶意数据输出到页面的一类跨站脚本漏洞。
看个例子。
下图是某BBS程序没有处理发帖正文中的恶意代码就直接存储到数据库中: 然后读帖子的时候程序从数据库中读出数据,结果数据中含有的恶意代码在浏览器执行了(此处仅演示弹出对话框): 这个漏洞是由于程序会把UBB代码IMGjavascript:alertXSS/IMG转换成HTML代码: ltimg srcquotjavascript:alertXSSquot /gt IE6会解析上面的HTML代码并执行img标签src属性中的JavaScript代码,导致XSS的发生。
持久型XSS多出现在Web邮箱、BBS、社区等从数据库读出数据的正常页面(比如BBS的某篇帖子中可能就含有恶意代码),由于不需要浏览器提交攻击参数,所以其危害往往大于非持久型XSS。
2.5 跨站脚本漏洞的出现场景 根据数据输出的不同,跨站脚本漏洞一般会出现在以下4个地方,了解了漏洞出现的场景,对我们认识和修复漏洞是有积极意义的。
2.5.1 输出在HTML页面 前面2.3节的PHP代码就是把数据输出到HTML页面的例子。
这种情况比较简单,就是把传入的参数值直接显示在页面,主要就是传入的参数中带有“lt”和“gt”符号会被浏览器解析。
2.5.2 输出在HTML属性中 看这样一段代码: ltPHP echo quotlta hrefquotquot._GETname.quotquotgtEnterlt/agtquot gt 这段PHP代码的意思就是把得到的name参数输出到一段HTML标记的A标签中,假设name的值是test,那么你将得到这样的页面: lta hrefquottestquotgtEnterlt/agt 这时我们再武断地给name附上“testltscriptgtalert123456lt/scriptgt”是不会造成XSS攻击的,因为脚本会被浏览器认为是href的值,这时候需要稍微动点脑子才行:http://localhost/test2521.phpnametestquotgtHilt/agtltscriptgtalert123456lt/scriptgtlt-- 得到这样的页面: lta hrefquottestquotgtHilt/agtltscriptgtalert123456lt/scriptgtlt—quotgtEnterlt/agt 请注意,蓝色字体为PHP程序输出,而红色字体是我们提交的参数。
哈哈,我们提交的“quotgt”和“lt/agt”闭合了原来的A标签,然后跟上JavaScript代码,之后的A标签的后部分被lt--注释掉了。
以上就是传入数据输出到属性中的情况,关键点是我们提交的数据能够闭合属性标签。
这个例子是双引号,其实属性也是可以用单引号甚至不用引号的(如果属性的值中没有空格的话就可以不需要引号),道理都是一样的,只要闭合它们就可以了。
2.5.3 输出在JavaScript代码中 JavaScript和HTML结合紧密,所以有时候程序员们就会把参数输出到JavaScript代码中: ltPHP echo quotlt
上一篇:
电子商务网站设计原理历年试题及答案
下一篇:
网络教育