Web服务器指纹识别是渗透测试仪的关键任务。了解正在运行的Web服务器的版本和类型允许测试人员确定已知的漏洞以及在测试期间使用的相应漏洞。
目前市场上有几种不同的供应商和Web服务器版本。了解正在测试的Web服务器的类型对测试过程有很大帮助,也可以改变测试过程。可以通过发送web服务器特定命令并分析输出来导出该信息,因为每个版本的web服务器软件可以对这些命令作出不同的响应。通过了解每种类型的Web服务器如何响应特定命令并将此信息保存在Web服务器指纹数据库中,渗透测试人员可以将这些命令发送到Web服务器,分析响应,并将其与已知签名的数据库进行比较。请注意,通常需要几个不同的命令来准确识别Web服务器,因为不同的版本可能会对同一命令做出类似的反应。很少有不同版本对所有HTTP命令作出相同的反应。因此,通过发送几个不同的命令,测试人员可以提高猜测的准确性。
测试目标
查找正在运行的Web服务器的版本和类型,以确定已知漏洞以及在测试期间使用的相应漏洞。
如何测试
黑盒测试
识别Web服务器的最简单和最基本的形式是查看HTTP响应头中的Server字段。Netcat用于此实验。
请考虑以下HTTP请求 - 响应:
$ nc 202.41.76.251 80
HEAD / HTTP / 1.0
HTTP / 1.1 200好的
日期:2003年6月16日星期一02:53:29 GMT
服务器:Apache / 1.3.3(Unix)(Red Hat / Linux)
最后修改时间:1998年10月7日星期三,格林威治标准时间11:18:14
ETag:“1813-49b-361b4df6”
Accept-Ranges:字节
内容长度:1179
连接:关闭
内容类型:text / html
从Server字段中,可以理解服务器可能是Apache,版本1.3.3,在Linux操作系统上运行。
HTTP响应头的四个示例如下所示。
从Apache 1.3.23服务器:
HTTP / 1.1 200好的
日期:2003年6月15日星期日17:10:49 GMT
服务器:Apache / 1.3.23
最后修改:2003年2月27日星期四03:48:19 GMT
ETag:32417-c4-3e5d8a83
Accept-Ranges:字节
内容长度:196
连接:关闭
内容类型:文本/ HTML
从Microsoft IIS 5.0服务器:
HTTP / 1.1 200好的
服务器:Microsoft-IIS / 5.0
到期:你的,2003年6月17日01:41:33 GMT
日期:2003年6月16日星期一01:41:33格林尼治标准时间
内容类型:文本/ HTML
Accept-Ranges:字节
最后修改时间:2003年5月28日星期三格林尼治标准时间15:32:21
ETag:b0aac0542e25c31:89d
内容长度:7369
从Netscape Enterprise 4.1服务器:
HTTP / 1.1 200好的
服务器:Netscape-Enterprise / 4.1
日期:星期一,2003年6月16日06:19:04 GMT
内容类型:文本/ HTML
最后修改日期:2002年7月31日星期三15:37:56 GMT
内容长度:57
接受范围:字节
连接:关闭
从SunONE 6.1服务器:
HTTP / 1.1 200好的
服务器:Sun-ONE-Web-Server / 6.1
日期:2007年1月16日星期二14:53:45 GMT
内容长度:1186
内容类型:text / html
日期:2007年1月16日星期二14:50:31格林尼治标准时间
最后修改时间:2007年1月10日星期三09:58:26 GMT
Accept-Ranges:字节
连接:关闭
但是,这种测试方法的准确性有限。有几种技术允许网站对服务器横幅字符串进行模糊处理或修改。例如,可以获得以下答案:
403 HTTP / 1.1禁止
日期:星期一,2003年6月16日02:41:27 GMT
服务器:未知 - Webserver / 1.0
连接:关闭
内容类型:文本/ HTML; 字符集= ISO-8859-1
在这种情况下,该响应的服务器字段被混淆。测试人员无法根据这些信息知道正在运行的Web服务器类型。
协议行为
更精细的技术考虑了市场上可用的几种网络服务器的各种特征。下面是一些允许测试人员推断出正在使用的Web服务器类型的方法列表。
HTTP头字段排序
第一种方法包括观察响应中几个头的排序。每个Web服务器都有标头的内部排序。以下面的答案为例:
来自Apache 1.3.23的回应
$ nc apache.example.com 80
HEAD / HTTP / 1.0
HTTP / 1.1 200好的
日期:2003年6月15日星期日17:10:49 GMT
服务器:Apache / 1.3.23
最后修改:2003年2月27日星期四03:48:19 GMT
ETag:32417-c4-3e5d8a83
Accept-Ranges:字节
内容长度:196
连接:关闭
内容类型:文本/ HTML
来自IIS 5.0的响应
$ nc iis.example.com 80
HEAD / HTTP / 1.0
HTTP / 1.1 200好的
服务器:Microsoft-IIS / 5.0
内容位置:http://iis.example.com/Default.htm
日期:1999年1月1日星期五20:13:52 GMT
内容类型:文本/ HTML
Accept-Ranges:字节
最后修改时间:1999年1月1日星期五20:13:55 GMT
ETag:W / e0d362a4c335be1:ae1
内容长度:133
来自Netscape Enterprise 4.1的回复
$ nc netscape.example.com 80
HEAD / HTTP / 1.0
HTTP / 1.1 200好的
服务器:Netscape-Enterprise / 4.1
日期:星期一,2003年6月16日06:01:40 GMT
内容类型:文本/ HTML
最后修改日期:2002年7月31日星期三15:37:56 GMT
内容长度:57
接受范围:字节
连接:关闭
响应来自SunONE 6.1
$ nc sunone.example.com 80
HEAD / HTTP / 1.0
HTTP / 1.1 200好的
服务器:Sun-ONE-Web-Server / 6.1
日期:2007年1月16日星期二15:23:37 GMT
内容长度:0
内容类型:text / html
日期:2007年1月16日星期二,格林尼治标准时间15:20:26
最后修改时间:2007年1月10日星期三09:58:26 GMT
连接:关闭
我们可以注意到,Date,Netscape Enterprise和IIS之间的Date字段和Server字段的顺序不同。
格式错误的请求测试
另一个有用的执行测试包括将错误的请求或不存在的页面请求发送到服务器。请考虑以下HTTP响应。
来自Apache 1.3.23的回应
$ nc apache.example.com 80
GET / HTTP / 3.0
HTTP / 1.1 400错误请求
日期:2003年6月15日星期日17:12:37 GMT
服务器:Apache / 1.3.23
连接:关闭
转移:分块
内容类型:文本/ HTML; 字符集= ISO-8859-1
来自IIS 5.0的响应
$ nc iis.example.com 80
GET / HTTP / 3.0
HTTP / 1.1 200好的
服务器:Microsoft-IIS / 5.0
内容位置:http://iis.example.com/Default.htm
日期:1999年1月1日星期五20:14:02 GMT
内容类型:文本/ HTML
Accept-Ranges:字节
最后修改时间:1999年1月1日星期五20:14:02 GMT
ETag:W / e0d362a4c335be1:ae1
内容长度:133
来自Netscape Enterprise 4.1的回复
$ nc netscape.example.com 80
GET / HTTP / 3.0
不支持HTTP / 1.1 505 HTTP版本
服务器:Netscape-Enterprise / 4.1
日期:星期一,2003年6月16日06:04:04 GMT
内容长度:140
内容类型:文本/ HTML
连接:关闭
响应来自SunONE 6.1
$ nc sunone.example.com 80
GET / HTTP / 3.0
HTTP / 1.1 400错误请求
服务器:Sun-ONE-Web-Server / 6.1
日期:2007年1月16日星期二15:25:00 GMT
内容长度:0
内容类型:text / html
连接:关闭
我们注意到每个服务器都以不同的方式回答。答案在服务器版本上也有所不同。我们可以使用不存在的HTTP方法/动词创建请求,从而可以进行类似的观察。请考虑以下回复:
来自Apache 1.3.23的回应
$ nc apache.example.com 80
GET / JUNK / 1.0
HTTP / 1.1 200好的
日期:2003年6月15日星期日17:17:47 GMT
服务器:Apache / 1.3.23
最后修改:2003年2月27日星期四03:48:19 GMT
ETag:32417-c4-3e5d8a83
Accept-Ranges:字节
内容长度:196
连接:关闭
内容类型:文本/ HTML
来自IIS 5.0的响应
$ nc iis.example.com 80
GET / JUNK / 1.0
HTTP / 1.1 400错误请求
服务器:Microsoft-IIS / 5.0
日期:1999年1月1日星期五20:14:34 GMT
内容类型:文本/ HTML
内容长度:87
来自Netscape Enterprise 4.1的回复
$ nc netscape.example.com 80
GET / JUNK / 1.0
<HTML> <HEAD> <TITLE>错误请求</ TITLE> </ HEAD>
<BODY> <H1>错误请求</ H1>
您的浏览器发送到查询此服务器无法理解。
</ BODY> </ HTML>
响应来自SunONE 6.1
$ nc sunone.example.com 80
GET / JUNK / 1.0
<HTML> <HEAD> <TITLE>错误请求</ TITLE> </ HEAD>
<BODY> <H1>错误请求</ H1>
您的浏览器发送了此服务器无法理解的查询。
</ BODY> </ HTML>
工具
- httprint - http://net-square.com/httprint.html
- httprecon - http://www.computec.ch/projekte/httprecon/
- Netcraft - http://www.netcraft.com
自动化测试
测试人员可以使用自动化工具来获得相同的结果,而不是依靠手动横幅抓取和分析Web服务器头。为了准确地指纹Web服务器,需要执行许多测试。幸运的是,有一些工具可以自动完成这些测试。“ httprint ”就是这样的工具之一。httprint使用签名字典,允许它识别正在使用的Web服务器的类型和版本。
运行httprint的示例如下所示:
在线测试
如果测试人员希望更隐蔽地测试并且不希望直接连接到目标网站,则可以使用在线工具。Netcraft是一个在线工具的例子,它经常提供有关目标Web服务器的大量信息。使用此工具,我们可以检索有关操作系统,使用的Web服务器,服务器正常运行时间,Netblock所有者,与Web服务器和OS相关的更改历史记录
的信息示例如下所示:
OWASP Unmaskme项目有望成为另一个在线工具,可对任何网站进行指纹识别,并对所提取的所有Web元数据进行全面解释。这个项目背后的想法是,任何负责网站的人都可以测试网站向全世界展示的元数据,并从安全的角度对其进行评估。