我最近使用 NMAP 的 http 方法篡改脚本测试了一个自定义服务器。它报告该服务器存在漏洞,输出如下:

nmap -p 8000 -sV --script http-method-tamper 192.168.68.63

| http-method-tamper:
|   VULNERABLE:
|   Authentication bypass by HTTP verb tampering
|     State: VULNERABLE (Exploitable)
|       This web server contains password protected resources vulnerable to authentication bypass
|       vulnerabilities via HTTP verb tampering. This is often found in web servers that only limit access to the
|        common HTTP methods and in misconfigured .htaccess files.
|              
|     Extra information:
|      
|   URIs suspected to be vulnerable to HTTP verb tampering:
|     / [POST]
|  

服务器仅允许 GET、HEAD、OPTIONS、PUT 方法。它会在进行任何身份验证/授权检查之前检查这些允许的 HTTP 动词(即 405 会在 401 或 403 之前出现)。我不清楚为什么 405 会被标记为易受攻击,因为如果有人发出 POST,405 似乎并不是错误的选择。


最佳答案
2

如果服务器确实以 405 代码响应(并且没有执行任何其他操作),则该发现是由于脚本限制导致的误报。

检查脚本时,您会发现它首先查找 GET 请求导致 401 响应的所有路径。然后尝试 HEAD、POST 和随机方法。如果 HEAD 或 POST 请求导致除 401 响应之外的任何响应,则视为存在漏洞。

就您而言,规则太严格了。使用 405 代码进行响应完全没问题,而随机方法的测试确实允许使用类似的代码 501(未实现)。严格检查的一个可能解释是,脚本作者可能希望检测未经身份验证的请求实际上被接受但在进一步处理请求时导致客户端或服务器错误的情况。例如,假设服务器对未经身份验证的请求使用 400 代码进行响应。如果请求立即被拒绝,这可能是正常的。但它也可能表明存在实际漏洞,即服务器接受未经身份验证的请求,但只是存在问题,例如某个特定参数。

该测试的目的是检测非常常见的 Apache httpd 错误配置(因为人们盲目复制和粘贴了一个错误的示例),其中配置大致如下:

<Limit GET POST>
    (... statements requiring authentication ...)
</Limit>

因此,只有 GET 或 POST 请求才需要身份验证,而其他动词(如 PUT 或 PATCH 或 HEAD 或 OPTIONS)则不需要。

因此,测试检测到对于某些动词您会返回 401,但对于其他动词(其他所有条件相同)您不会返回,并认为这与上述错误配置相符。

它可能看起来无害(405 而不是 401 意味着它无论如何都会被阻止),但返回 405 的事实可能意味着那里有一个资源(因为方法的选择应该取决于资源),可以通过其他方法访问。可以说,最好先检查身份验证,然后再检查方法、路径和请求的其他部分。