10.3.1 模糊测试

模糊测试向应用发送任意恶意构造的数据,企图使其出现意外的表现。通过分析响应,评估者可以识别可能的安全漏洞。关于模糊测试已经发表了许多文章和书籍,所以冗长的讨论超出了范围,我们将简短地讨论现成的模糊测试程序以及自己制作的变种。关于模糊测试的更多信息,参见本章结尾处的“参考与延伸阅读”小节。

当然,模糊测试在黑盒测试期间也会进行。在本小节中,我们将关注于白盒方案中的模糊测试,也就是使用与目标应用挂钩的调试程序,可以很轻松地识别和诊断故障。

现成的模糊测试程序

有许多现成的模糊测试程序。较好的一个是Spike,它聚焦于C和C++应用。Spike Proxy对Web应用运用相同的模糊方法。它用Python编写,进行包括SQL注入、表单输入域溢出和跨站脚本等输入校验和授权攻击。

Spike Proxy的启动是通过运行一个批文件(runme.bat),然后配置浏览器使用本地Spike代理服务器(本地主机上的8080端口)。接下来,你只要连接到目标Web应用就行了。Spike Proxy接管连接,创建一个可从http://spike访问的测试控制台。这个控制台列出对应用的可能攻击技术,包括“目录潜入”、“参数扫描”、“目录扫描”、“溢出”和“XML漏洞”测试。选择单独的链接对应用进行这些攻击,Spkie在浏览器下方的框架中显示扫描结果。

Spike Proxy也可用于寻找我们为二进制分析创建和使用的secret.dll ISAPI中的漏洞。和前面的小节中所看到的一样,向所要分析的应用“投掷”在调试时能够“捕捉”的东西是非常有用的,因为它能在运行中解释代码的关键特征。模糊测试程序就是很好的“投掷物”。

例如,为了发现secret.dll ISAPI中的漏洞,和以前一样装入OllyDbg并且关联到Web服务器进程。启动Spike Proxy浏览应用,然后浏览本地Spike界面(http://spike)。选择溢出对ISAPI进行缓冲区溢出攻击。

正如你在“二进制分析”小节中使用OllyDbg所看到的那样,从URL传递的字符串装入到EDI中。这个字符串写入栈,在栈面板上能看到。超长的字符串使ISAPI崩溃。访问违规是ISAPI崩溃的象征。EAX和ECX被覆盖为41414141(AAAA的16进制表现),如图10-11所示。

图10-11 使用Spike Proxy进行缓冲区溢出测试时,OllyDbg显示secret.dll中有访问违规

构建你自己的模糊测试程序

任何脚本语言都可以用来构建你自己的模糊测试程序。cURL和netcat等实用程序也可以封装在脚本中,简化创建基本HTTP请求-响应功能所需要的工作。当然,为了更高的性能,用C/C++编写模糊测试程序总是更好些。

下面是一个对我们的secret.dll ISAPI Web应用实例发出POST请求的示例Perl脚本。注意,我们创建了一个循环例程,反复发出多个请求,包含随机数量的(1~50个之间)“A”。


#!/usr/local/bin/perl -w
use HTTP::Request::Common qw(POST GET);
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
$url = "http://127.0.0.1/_vti_script/secret.dll";
//Loop
for ($i=0; $i <= 10; $i++)
{
//Random A's generated
$req = $ua->post( $url, [MfcISAPICommand => SecretProc, Secret => 'A'x
int(rand(50))]);
my $content = $req->content;
print $content;
print "\n\n";
}

这个脚本是非常基本的模糊测试程序。

警告  对实际的应用进行模糊测试可能导致它出现异常的表现,往往导致拒绝服务的情况。确保你预先进行了合适的计划,并且在进行模糊测试之前得到了所有应用和服务器所有者的授权。