定向模糊测试:精准挖掘XSS漏洞的狙击手方法

本文详细介绍了针对XSS过滤器的定向模糊测试技术,包括JavaScript协议注入的多种编码方式、高效测试方法设计、结果日志记录技术,以及如何通过PHP输出缓冲实现浏览器崩溃测试,为安全研究人员提供了实用的漏洞挖掘方法。

定向模糊测试

狙击手方法

传统模糊测试就像在黑暗中用机枪扫射,完全不知道目标在哪里。你可能会多次击中目标,但也会大量脱靶,而且需要消耗大量弹药。相比之下,定向模糊测试更像狙击手观察目标并逐个击毙。我更喜欢狙击手方法,因为虽然可能无法获得广泛的结果,但通常会获得更有意义的数据——而且说实话,狙击手很酷。:)

XSS过滤器和JavaScript协议

我为微软承包测试XSS过滤器的安全性,该过滤器即将在下一版Internet Explorer中发布。部分工作涉及确保XSS过滤器成功检测各种方式的javascript协议注入。我认为这是一个进行定向模糊测试以获取所有可能组合的理想机会。

第一个任务是收集尽可能多的已知输入。javascript:可以用多种方式表示,比如javascript:。然后收集任何未知的输入组合。在这种情况下,你可以遍历0到65535或更多字符,要么替换部分字符串,要么添加到其中。除此之外,还可以用不同方式编码字符,如�、等。

执行此类模糊测试的标准方法是使用iframe,因为这允许自动执行javascript:。然而,我使用这种方法遇到了问题:速度非常慢,对于我想要测试的数据量来说占用太多内存。

构建定向模糊测试器

制作定向模糊测试器是关于理解如何在最短时间内实现目标并快速找到目标。为此,我决定利用浏览器的优势。在任何浏览器中创建链接时,都可以发现链接是否使用某些协议,如HTTP和javascript:。我决定让浏览器告诉我我的模糊测试是否成功。

使用普通的链接使模糊测试器更快,可以一次扫描约10,000个链接。以这种速度,可以在几分钟内扫描字符0到65535,无论它们是URL编码、HTML实体、替换还是以各种组合添加。

如果你对Javascript协议模糊测试器感兴趣,源代码可以在这里找到: http://www.businessinfo.co.uk/labs/javascript_protocol_fuzzer/javascript_protocol_fuzzer.phps

最终结果的演示可以在这里查看: http://www.businessinfo.co.uk/labs/javascript_protocol_fuzzer/javascript_protocol_fuzzer.php

记录结果

我描述的协议模糊测试器比传统模糊测试有巨大优势,因为数据不会导致浏览器崩溃,可以毫无问题地记录所有结果。我使用标准JavaScript记录器实现这一点,涉及在JavaScript中创建动态图像并将结果发送到服务器端脚本,代码如下:

1
2
var logger = new Image();
logger.src='yoururl.php?link='+yourdata;

如果你的目标是使浏览器崩溃呢?在为微软的另一个项目工作时,我遇到了这个问题。有两种方法可以实现这一点:一是在发送输出之前记录结果,二是远程控制目标并将模糊测试代码发送到目标。因为我感兴趣的是如何用我提供的代码使浏览器崩溃一次,我决定在将输出发送到浏览器之前先记录结果。

你可以在PHP中使用输出缓冲来实现这一点;其他语言可能有类似功能。输出缓冲通过在将页面发送到浏览器之前构建页面来工作,这非常理想,因为你可以记录结果,然后发送数据并观察发生的情况。以下是我使用的简单代码片段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
function saveCache($buffer) {
    $fp = fopen('cache.txt', 'w') or die('unable to open');
    fwrite($fp, $buffer); // 记录结果
    fclose($fp);
    return $buffer;
}
ob_start("saveCache"); // 先不发送到浏览器
?>
你的模糊测试输出在这里
<?php
ob_end_flush(); // 将输出发送到浏览器
?>

总结

我的模糊测试器非常成功,使我能够对XSS过滤器进行严格测试,确保它检测到许多javascript协议注入。因为我编写的代码跨浏览器工作,还发现了一些有趣的跨浏览器问题,这是一个额外的好处。以下是在Firefox 2.0.0.14中发现的一些有趣结果的小样本:

  • Char: 56320, link: jav&#56320ascript:
  • Char: 56321, link: jav&#56321ascript:
  • Char: 56322, link: jav&#56322ascript:

希望你喜欢我的文章,期待十月在BlueHat见到大家。祝狙击愉快。

-Gareth Heyes, 独立安全研究员

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计