如何识别 Web 服务器支持的 HTTP 方法?

信息安全 网络服务器 http
2021-09-07 16:03:19

如何识别 Web 服务器支持的不同 HTTP 方法,如 OPTIONS、TRACE 等?

在 Linux 上尝试过nc命令。但它不起作用。它没有向我显示支持的 HTTP 方法,其他一些 HTTP 标头与请求的 HTML 页面一起返回。还有其他解决方案吗?

4个回答

根据RFC2616, OPTIONS 方法应该返回支持的方法。关键字是should因为情况并非总是如此。正如之前的帖子已经指出的那样,每种方法都需要单独测试才能确定。

由于只有少数方法(OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE 和 CONNECT),您可以使用脚本和 nc 向所有允许的方法发送请求并解析结果:

for method in OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT ; do 
    echo -e "\n\nTrying $method\n\n" 
    echo -e "$method / HTTP/1.1\nHost: server-hostname\nConnection: close\n\n" | nc server-hostname 80 | head 
    sleep 2
done

HTTP 错误 400、403、405 和 406 通常是尝试使用未实现的方法时返回的类型。

识别 Web 服务器支持的方法的唯一方法是尝试每种方法并评估响应以确定它是否表明该方法受支持。您不能简单地查询它支持哪些方法;它不会给你一个清单。

也就是说,有比 nc 更好的工具。 Nmap 和 metasploit都支持 HTTP 方法扫描,并且基本上可以为您自动完成工作。

根据RFC 7231HTTP 1.1 语义RFC),在某些情况下,HTTP 服务器将在其Allow响应标头中返回给定资源的支持方法列表

  • 首先在对OPTIONS请求的响应中,要么在特定的资源路径上,要么在特殊的*路径上(主要描述服务器的能力);
  • 其次,如果在给定资源上尝试了已知但服务器不支持的方法,则服务器可以响应405 Method Not Allowed状态码;在这种情况下,它必须在Allow响应头中给出允许的方法列表
  • 对于任何其他 HTTP 请求,允许源服务器在Allow响应头中返回支持的方法列表;

但是如果服务器不合作怎么办?例如,您尝试了一个OPTIONS *请求,各种GET请求,而服务器从未在标头中返回允许的方法列表Allow或者如果服务器回复了,但你怀疑它在撒谎怎么办?

然后你不知道,你将不得不忍受它。你会做什么取决于你的目标:

  • 如果您只是尝试使用目标系统,则应谨慎行事,假设仅GET支持,获取有关如何使用该系统的更多文档;
  • 如果你在做渗透测试,那么你可以测试所有已知的动词,测试一些鲜为人知的动词(例如PATCH),甚至自己发明一些;更一般地说,测试的一部分是向系统扔垃圾,看看它是如何反应的;

但是,想想为什么你想知道支持的动词列表 - 因为没有额外的数据,知道使用了哪些动词几乎是无用的(例如,我知道https://accounts.google.com/AddSession接受POST动词 - 如果我知道动词对我有什么好处?不知道数据应该是什么格式,什么格式等?)