指纹 Web 服务器
概括
Web 服务器指纹识别是识别运行目标的 Web 服务器的类型和版本的任务。虽然 Web 服务器指纹通常封装在自动化测试工具中,但对于研究人员来说,了解这些工具如何尝试识别软件的基本原理及其有用的原因非常重要。
准确地发现运行应用程序的 Web 服务器的类型可以使安全测试人员确定应用程序是否容易受到攻击。特别是,运行没有最新安全补丁的旧版本软件的服务器可能容易受到已知版本特定漏洞的攻击。
测试目标
- 确定正在运行的 Web 服务器的版本和类型,以便进一步发现任何已知漏洞。
如何测试
用于 Web 服务器指纹识别的技术包括横幅抓取、引发对格式错误的请求的响应,以及使用自动化工具执行使用策略组合的更强大的扫描。所有这些技术运作的基本前提是相同的。他们都努力从 Web 服务器中引出一些响应,然后可以将这些响应与已知响应和行为的数据库进行比较,从而与已知的服务器类型相匹配。
横幅抓取
横幅抓取是通过向 Web 服务器发送 HTTP 请求并检查其响应标头来执行的。这可以使用各种工具来完成,包括telnet
HTTP 请求或openssl
通过 TLS/SSL 的请求。
例如,这是对来自 Apache 服务器的请求的响应。
HTTP/1.1 200 OK
Date: Thu, 05 Sep 2019 17:42:39 GMT
Server: Apache/2.4.41 (Unix)
Last-Modified: Thu, 05 Sep 2019 17:40:42 GMT
ETag: "75-591d1d21b6167"
Accept-Ranges: bytes
Content-Length: 117
Connection: close
Content-Type: text/html
...
这是另一个响应,这次来自 nginx。
HTTP/1.1 200 OK
Server: nginx/1.17.3
Date: Thu, 05 Sep 2019 17:50:24 GMT
Content-Type: text/html
Content-Length: 117
Last-Modified: Thu, 05 Sep 2019 17:40:42 GMT
Connection: close
ETag: "5d71489a-75"
Accept-Ranges: bytes
...
这是来自 lighttpd 的响应。
HTTP/1.0 200 OK
Content-Type: text/html
Accept-Ranges: bytes
ETag: "4192788355"
Last-Modified: Thu, 05 Sep 2019 17:40:42 GMT
Content-Length: 117
Connection: close
Date: Thu, 05 Sep 2019 17:57:57 GMT
Server: lighttpd/1.4.54
在这些例子中,服务器类型和版本被清楚地暴露了。但是,注重安全的应用程序可能会通过修改标头来混淆其服务器信息。例如,以下是对具有修改标头的站点请求的响应的摘录:
HTTP/1.1 200 OK
Server: Website.com
Date: Thu, 05 Sep 2019 17:57:06 GMT
Content-Type: text/html; charset=utf-8
Status: 200 OK
...
在服务器信息模糊不清的情况下,测试人员可能会根据标头字段的顺序猜测服务器的类型。请注意,在上面的 Apache 示例中,字段遵循以下顺序:
- 日期
- 服务器
- 最后修改
- 电子标签
- 接受范围
- 内容长度
- 联系
- 内容类型
但是,在 nginx 和模糊服务器示例中,共同的字段都遵循以下顺序:
- 服务器
- 日期
- 内容类型
测试人员可以根据这些信息猜测被遮挡的服务器是nginx。但是,考虑到多个不同的Web服务器可能共享相同的字段顺序并且可以修改或删除字段,这种方法是不确定的。
发送格式错误的请求
Web 服务器可以通过检查它们的错误响应来识别,并且在它们没有被定制的情况下,它们的默认错误页面。强制服务器呈现这些内容的一种方法是故意发送不正确或格式错误的请求。
例如,这是对SANTA CLAUS
来自 Apache 服务器的不存在方法的请求的响应。
GET / SANTA CLAUS/1.1
HTTP/1.1 400 Bad Request
Date: Fri, 06 Sep 2019 19:21:01 GMT
Server: Apache/2.4.41 (Unix)
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
这是对来自 nginx 的相同请求的响应。
GET / SANTA CLAUS/1.1
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.3</center>
</body>
</html>
这是对来自 lighttpd 的相同请求的响应。
GET / SANTA CLAUS/1.1
HTTP/1.0 400 Bad Request
Content-Type: text/html
Content-Length: 345
Connection: close
Date: Sun, 08 Sep 2019 21:56:17 GMT
Server: lighttpd/1.4.54
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>400 Bad Request</title>
</head>
<body>
<h1>400 Bad Request</h1>
</body>
</html>
由于默认错误页面在不同类型的 Web 服务器之间提供了许多区分因素,因此即使在服务器标头字段被遮盖的情况下,它们的检查也可以成为指纹识别的有效方法。
使用自动扫描工具
如前所述,Web 服务器指纹识别通常作为自动扫描工具的一项功能包含在内。这些工具能够发出类似于上面演示的请求,以及发送其他更特定于服务器的探测。自动化工具可以比手动测试更快地比较来自 Web 服务器的响应,并利用已知响应的大型数据库来尝试识别服务器。由于这些原因,自动化工具更有可能产生准确的结果。
以下是一些包含 Web 服务器指纹识别功能的常用扫描工具。
整治
虽然暴露的服务器信息本身不一定是漏洞,但它是可以帮助攻击者利用可能存在的其他漏洞的信息。暴露的服务器信息还可能导致攻击者找到特定于版本的服务器漏洞,这些漏洞可用于利用未打补丁的服务器。因此,建议采取一些预防措施。这些行动包括:
- 隐藏标头中的 Web 服务器信息,例如使用 Apache 的mod_headers 模块。
- 使用加固的反向代理服务器在 Web 服务器和 Internet 之间创建额外的安全层。
- 确保 Web 服务器与最新的软件和安全补丁保持同步。