HTTP Verb Tampering利用接受 HTTP 动词和方法的 Web 服务器。可以通过使用意外方法发送恶意请求来利用此攻击,这可能导致绕过 Web 应用程序的授权机制,甚至绕过其针对其他 Web 攻击的安全控制。

HTTP 有9 种不同的动词,常用的 HTTP Verb

Verb Description
GET 请求特定资源。可以通过 URL 中的查询字符串将附加数据传递给服务器(例如?param=value)。
POST 将数据发送到服务器。它可以处理多种类型的输入,例如文本、PDF 和其他形式的二进制数据。此数据附加在标头后面的请求正文中。POST 方法通常用于发送信息(例如表单/登录)或将数据(例如图像或文档)上传到网站。
HEAD 请求向服务器发出 GET 请求时返回的标头。它不返回请求正文,通常用于在下载资源之前检查响应长度。
PUT 在服务器上创建新资源。如果在未进行适当控制的情况下允许此方法,则会导致上传恶意资源。
DELETE 删除 Web 服务器上的现有资源。如果没有得到妥善保护,可能会因删除 Web 服务器上的关键文件而导致拒绝服务 (DoS)。
OPTIONS 返回有关服务器的信息,例如其接受的方法。
PATCH 对指定位置的资源应用部分修改。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
CONNECT HTTP/1.1协议中预留给能够将连接改为隧道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。

Insecure Configurations

Web 服务器的身份验证配置可能仅限于特定的 HTTP 方法,这会导致某些 HTTP 方法无需身份验证即可访问。

Apache Web

 Apache Web 服务器存在漏洞的配置示例,该配置位于站点配置文件(例如 000-default.conf)或 .htaccess 网页配置文件中:

1
2
3
4
5
6
7
8
<Directory "/var/www/html/admin">  
AuthType Basic
AuthName "Admin Panel"
AuthUserFile /etc/apache2/.htpasswd
<Limit GET>
Require valid-user
</Limit>
</Directory>

此配置正在设置管理 Web 目录的授权配置。但是,由于使用了 <Limit GET> 关键字,Require valid-user 设置仅适用于 GET 请求,因此页面只能通过 POST 请求访问。即使同时指定了 GET 和 POST,页面也只能通过其他方法访问,例如 HEAD 或 OPTIONS

Tomcat Web

以下示例显示了 Tomcat Web 服务器配置的相同漏洞:

1
2
3
4
5
6
7
8
9
<security-constraint>  
<web-resource-collection>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>

此配置授权仅限于 GET 方法,这使得可以通过其他 HTTP 方法访问页面。

ASP.NET

以下是在 Web 应用程序的 web.config 文件中找到的 ASP.NET 配置的示例:

1
2
3
4
5
6
7
8
<system.web>  
<authorization>
<allow verbs="GET" roles="admin">
<deny verbs="GET" users="*">
</deny>
</allow>
</authorization>
</system.web>

此配置中 allow 和 deny 范围仅限于GET方法,这使得可以通过其他 HTTP 方法访问 Web 应用程序。

Insecure Coding

当 Web 开发人员应用特定过滤器来缓解特定漏洞,但未用该过滤器覆盖所有 HTTP 方法时,就会发生这种情况。以 PHP 为例:

1
2
3
4
5
6
7
if (isset($_REQUEST['filename'])) {  
if (!preg_match('/[^A-Za-z0-9. _-]/', $_GET['filename'])) {
system("touch " . $_REQUEST['filename']);
} else {
echo "Malicious Request Denied!";
}
}

$_REQUEST["code"]其中包含GETPOST参数。如上过滤器,如果 GET 请求不包含任何坏字符,那么查询将被执行。

⬆︎TOP