21.11 测试Web服务器漏洞

img644a

图21-12 测试Web服务器漏洞

21.11.1 测试默认证书

(1)检查应用程序解析过程中获得的结果,确定应用程序使用的、可能包含可访问的管理接口的Web服务器与其他技术。

(2)对Web服务器进行端口扫描,确定在指向主目标应用程序的不同端口上运行的所有管理接口。

(3)对于确定的接口,查阅制造商文档资料与常用默认密码表,获得默认证书。

(4)如果默认证书无效,使用21.4节描述的技巧尝试猜测有效的证书。

(5)如果能够访问管理接口,审查可用的功能,确定是否可以利用这项功能进一步攻破主机与主应用程序。

21.11.2 测试默认内容

(1)分析Nikto扫描结果(21.1.4节中的第1步),确定服务器上存在的、但并不属于应用程序的默认内容。

(2)使用搜索引擎与其他资源(如www.exploit-db.com)确定已知应用程序所使用的技术的默认内容与功能。如有可能,在本地安装这些技术,并在其中查找可在渗透测试中利用的所有默认 功能。

(3)检查默认内容,从中查找任何可用于攻击服务器或应用程序的功能或漏洞。

21.11.3 测试危险的HTTP方法

(1)使用OPTIONS方法列出服务器使用的HTTP方法。请注意,不同目录中激活的方法可能各不相同。可以使用Paros进行漏洞扫描,帮助完成这个检查。

(2)手动测试每一种方法,确认其是否可用。

(3)如果发现一些WebDAV方法被激活,使用一个激活WebDAV的客户端进行深入调查,如Microsoft FrontPage或Internet Explorer中的 Open as Web Folder(以Web文件夹打开)选项。

21.11.4 测试代理功能

(1)使用GET与CONNECT请求,尝试使用Web服务器作为代理服务器,连接因特网上的其他服务器,并获取其中的内容。

(2)尝试使用前面描述的两种技巧连接主机基础架构中的不同IP地址与端口。

(3)尝试使用前面描述的两种技巧,在请求中指定127.0.0.1为目标主机,连接Web服务器上的常用端口号。

21.11.5 测试虚拟主机配置不当

(1)使用以下方式向根目录提交GET请求:

img002 正确的Host消息头;

img002 恶意Host消息头;

img002 Host消息头中的服务器IP地址;

img002 无Host消息头(仅使用HTTP/1.0)。

(2)比较对这些请求的响应。常见的结果是,在Host消息头中使用服务器的IP地址获得目录列表。还可以获得各种默认内容。

(3)如果观测到应用程序表现出不同的行为,使用生成不同结果的主机名称重复21.1节描述的应用程序解析过程。一定要使用-vhost选项进行一次Nikto扫描,确定在最初的应用程序解析过程中忽略的默认内容。

21.11.6 测试Web服务器软件漏洞

(1)使用Nessus与所拥有的所有其他类似的扫描器,确定所测试的Web服务器软件中存在的所有已知漏洞。

(2)同时,浏览Security Focus、Bugtraq和Full Disclosure等资源,在攻击目标中查找最近发现的、尚未修复的漏洞信息。

(3)如果应用程序由第三方开发,确定它是否自带Web服务器(通常为一个开源服务器);如果是,在这个服务器中查找所有漏洞。请注意,在这种情况下,服务器的标准版本信息可能已被修改。

(4)如有可能,应该考虑在本地安装所测试的软件,并自己进行测试,查找尚未发现或广泛流传的新漏洞。

21.11.7 测试Web应用程序防火墙

(1)在参数值中使用明确的攻击有效载荷向应用程序(最好是响应中包含名称和/或值的某个应用程序位置)提交任意参数名称。如果应用程序阻止该攻击,这可能是由于外部防御机制所致。

(2)如果可以提交在服务器响应中返回的变量,则提供一系列模糊测试字符串及这些字符串的编码形式可以确定应用程序的用户输入防御行为。

(3)对应用程序中的变量实施相同的攻击来确认这一行为。

(4)对于所有模糊测试字符串和请求,使用标准签名数据库中不可能存在的有效载荷字符串。根据定义,我们不可能提供这些字符串的示例。但是,在进行文件检索时,应避免将/etc/passwd或/windows/system32/config/sam作为有效载荷。此外,应在XSS攻击中避免使用<script>,并避免将alert()或xss用作XSS有效载荷。

(5)如果特定请求被阻止,可以尝试在其他位置或上下文中提交相同的参数。例如,在GET请求的URL中、在POST请求主体中,以及在POST请求的URL中提交相同的参数。

(6)此外,应尝试在ASP.NET上将参数作为cookie提交。如果在查询字符串或消息主体中找不到参数foo,API Request.Params[“foo”]会检索名为foo的cookie的值。

(7)回顾第4章中介绍的引入用户输入的所有其他方法,选择其中任何不受保护的方法。

(8)确定以非标准格式(如序列化或编码)或可能以此类格式提交用户输入的位置。如果找不到此类位置,可以通过串联字符串和/或将字符串分布到多个参数中来构建攻击字符串。(注意,如果目标是ASP.NET,可以使用HPP通过同一变量的各种变体来串联攻击字符串。)