搜索功能是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返回的:
<HTML>
<HEAD><TITLE>Search Example</TITLE>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<H1>Search Results</H1>
for SomeBogusText
<BR>
<BR>
<h2>Sorry, no results were found.</h2>
<BR>
<FORM name=search>
<INPUT type=text name="keyword" value="SomeBogusText">
<INPUT type=submit value="Go">
</FORM>
</BODY>
</HTML>
<HEAD><TITLE>Search Example</TITLE>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<H1>Search Results</H1>
for SomeBogusText
<BR>
<BR>
<h2>Sorry, no results were found.</h2>
<BR>
<FORM name=search>
<INPUT type=text name="keyword" value="SomeBogusText">
<INPUT type=submit value="Go">
</FORM>
</BODY>
</HTML>
可以看到,在查询字符串中输入的数据被放置在HTML的<body>区域中了,<body>区域能够包含HTML标记,这是多么有趣的一个测试用例,如果查询字符串中包含黑体的(<B>)标记会怎么样呢?你可以通过浏览一个类似于
http://server/search.aspx?keyword= <B>Boldly</B>%20go%20where%20no%20dev%20expected的URL来测试该用例。Web服务器会返回如下的HTML,黑体字部分显示了输入的单词Boldly:
<HTML>
<HEAD><TITLE>Search Example</TITLE>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<H1>Search Results</H1>
for <B>Boldly</B> go where no dev expected
<BR>
<BR>
<h2>Sorry, no results were found.</h2>
<BR>
<FORM name=search>
<INPUT type=text name="keyword" value="<B>Boldly</B> go where no dev expected">
<INPUT type=submit value="Go">
</FORM>
</BODY>
</HTML>
<HEAD><TITLE>Search Example</TITLE>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<H1>Search Results</H1>
for <B>Boldly</B> go where no dev expected
<BR>
<BR>
<h2>Sorry, no results were found.</h2>
<BR>
<FORM name=search>
<INPUT type=text name="keyword" value="<B>Boldly</B> go where no dev expected">
<INPUT type=submit value="Go">
</FORM>
</BODY>
</HTML>
这是一个有趣的现象,但是,黑体部分的内容并不存在安全问题。然而,这个测试用例本身表明了HTML能够通过Web服务器进行响应,并且浏览器能够以HTML的方式显示这些响应的数据。正如你将要看到的一样,运行脚本会更加有趣。通过输入URL地址
>可以测试服务器对< SCRIPT >标记的响应情况。当这个URL被加载的时候,和前面那个例子一样,服务器会以相同的方式返回输入信息。下述HTML显示了返回的结果信息,其结果是Web浏览器显示了一个对话框(如图10-3所示),这个对话框是通过下述脚本实现的:
<HTML>
<HEAD><TITLE>Search Example</TITLE>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<H1>Search Results</H1>
for <SCRIPT>alert("Running!")</SCRIPT>
<BR>
<BR>
<h2>Sorry, no results were found.</h2>
<BR>
<FORM name=search>
<INPUT type=text name="keyword"
value="<SCRIPT>alert("Running!")</SCRIPT>">
<INPUT type=submit value="Go">
</FORM>
</BODY>
</HTML>
<HEAD><TITLE>Search Example</TITLE>
<META http-equiv="content-type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<H1>Search Results</H1>
for <SCRIPT>alert("Running!")</SCRIPT>
<BR>
<BR>
<h2>Sorry, no results were found.</h2>
<BR>
<FORM name=search>
<INPUT type=text name="keyword"
value="<SCRIPT>alert("Running!")</SCRIPT>">
<INPUT type=submit value="Go">
</FORM>
</BODY>
</HTML>
现在,利用Web服务器搜索功能缺陷对它的回应,脚本就能运行。接下来讨论一下其重要性的原因,并讨论当***者在他们的站点上处理脚本的时候,那些响应的脚本为什么会不同。

图10-3 当在查询字符串中包括脚本的时候,Web站点上显示的警告信息
转载于:https://blog.51cto.com/broadviewsec/187891