您的位置:首页 > 其它

一个搜索引擎中的反射XSS 预防和防御跨站漏洞 Web安全展望

2010-09-29 00:15 387 查看
【前言】吼吼,期待的十一长假开始倒计时啦,两天!

【原文】http://hi.baidu.com/ljw747691966/blog/item/918cecf1bd7181a6a50f5279.html

例子:一个搜索引擎中的反射XSS 搜索功能是Web站点的基本功能,在这些站点中,用户可以输入一个单词或者一个短语来进行查找,然后就会返回一系列搜索结果,当没有找到搜索项的时候,将会返回给用户一条错误信息,如图10-2所示。 图10-2 当没有找到搜索项的时候,返回的出错信息 通过查看这个页面的URL地址http://server/search.aspx?keyword=monkey,你可能已经想到了:在这个URL中键入的数据已经通过搜索结果的Web页面返回了,你可以稍微修改一下这个URL来验证你的想法,例如,当你输入的URL为http://server/seach.aspx? keyword=SomeBogusText时,你就会发现URL中的数据已经通过Web页返回了,在这里,URL中的数据是指查询参数字符串“keyword”的值。通过查看HTML源代码,可以更好地理解这个页面是如何工作的。下述HTML源代码就是通过search.aspx返回的:

Search Results

for SomeBogusText

Sorry, no results were found.

可以看到,在查询字符串中输入的数据被放置在HTML的区域中了,区域能够包含HTML标记,这是多么有趣的一个测试用例,如果查询字符串中包含黑体的()标记会怎么样呢?你可以通过浏览一个类似于http://server/search.aspx?keyword= [b]Boldly%20go%20where%20no%20dev%20expected的URL来测试该用例。Web服务器会返回如下的HTML,黑体字部分显示了输入的单词Boldly:

Search Results

for Boldly go where no dev expected

Sorry, no results were found.

这是一个有趣的现象,但是,黑体部分的内容并不存在安全问题。然而,这个测试用例本身表明了HTML能够通过Web服务器进行响应,并且浏览器能够以HTML的方式显示这些响应的数据。正如你将要看到的一样,运行脚本会更加有趣。通过输入URL地址http://server/search.aspx?keyword=

Sorry, no results were found.

现在,利用Web服务器搜索功能缺陷对它的回应,脚本就能运行。接下来讨论一下其重要性的原因,并讨论当攻击者在他们的站点上处理脚本的时候,那些响应的脚本为什么会不同。 图10-3 当在查询字符串中包括脚本的时候,Web站点上显示的警告信息 预防和防御跨站漏洞 dvHTMLEncode()函数是笔者从ubbcode中提取的用于处理特殊字符串的函数。它能把尖括号之类的字符替换成HTML特殊字符集中的字符。 HTML语言是标签语言,所有的代码用标签括起才有用,而所有标签用尖括号括起。尖括号不能发挥原来的作用之后,攻击者插入的代码便失去作用。dvHTMLEncode()函数的完整代码如下: function dvHTMLEncode(byval fString) if isnull(fString) or trim(fString)="" then dvHTMLEncode="" exit function end if fString = replace(fString, ">", ">") fString = replace(fString, "<", "<") fString = Replace(fString, CHR(32), " ") fString = Replace(fString, CHR(9), " ") fString = Replace(fString, CHR(34), """) fString = Replace(fString, CHR(39), "'") fString = Replace(fString, CHR(13), "") fString = Replace(fString, CHR(10) & CHR(10), "

") fString = Replace(fString, CHR(10), "
") dvHTMLEncode = fString end function 这个函数使用replace()函数替换字符串中的一些特殊字符,如果需要过滤其他特殊字符,可以试着添加。 用dvHTMLEncode()函数把所有输入及输出的字符串过滤处理一遍,即可杜绝大部分的跨站漏洞。 如简单留言本的漏洞是因为name中的body没有经过过滤而直接输出到页面形成的,代码如下: …… 如下修改代码即可避免跨站漏洞: …… 用dvHTMLEncode()函数过滤后输出,不会存在问题,也可以在用户提交时过滤后写到数据库中。 为禁用JavaScript,单击IE中的“工具”|“Internet选项”|“安全”|“Internet”|“自定义级别”选项,找到“脚本”部分,把“活动脚本”设置成“禁用”状态。 另外尽量不要访问安全性不高的网站,上网时打开杀毒软件的脚本监控功能,这样可以避免被恶意攻击者利用跨站脚本漏洞攻击的可能性。

[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: