Http Verb Tempering: Bypassing Web Authentication and Authorization(使用 HTTP 动词篡改的认证旁路 )
Http Verb Tempering: Bypassing Web Authentication and Authorization(使用 HTTP 动词篡改的认证旁路
什么是HTTP动词(HTTP VERB)?
超文本传输协议(HTTP)提供了可以用于在web服务器上执行操作的方法列表。
这些方法中的许多都旨在帮助开发人员在开发或调试阶段部署和测试HTTP应用程序。
如果web服务器配置不当,这些HTTP方法可能被用于恶意目的。
此外,还将检查一些高脆弱性,如跨站点跟踪(XST),这是一种使用服务器的HTTP跟踪方法的跨站点脚本编制形式。
在HTTP方法中,开发人员最常用GET和POST来访问web服务器提供的信息。
HTTP还允许其他一些不太为人所知的方法。
以下是一些方法:
- HEAD
- GET
- POST
- PUT
- DELETE
- TRACE
- OPTIONS
- CONNECT
这些方法可能会对一个web应用程序构成重要的安全风险,因为他们允许攻击者修改存储在web服务器的文件,删除服务器上的web页面,并上传一个web壳到服务器,导致偷窃合法用户的凭据。
此外,当翻寻服务器时,必须禁用的方法是:
PUT 该方法允许客户端在web服务器上上传新文件。攻击者可以通过上传恶意文件(例如通过调用cmd.exe执行命令的ASP或PHP文件)利用它,或者简单地使用受害者的服务器作为文件存储库。
DELETE 该方法允许客户端删除web服务器上的文件。攻击者可以利用它作为一种非常简单和直接的方法来破坏web站点或发起拒绝服务(DOS)攻击。
CONNECT 这种方法允许客户端使用web服务器作为代理
TRACE 此方法简单地将发送到服务器的任何字符串回传给客户机,主要用于开发人员的调试目的。这种方法最初被认为是无害的,现在可以用来发动一种称为跨站点追踪的攻击,这种方法被Jeremiah Grossman发现。
如果应用程序需要上述任何一种方法,比如在大多数情况下REST Web服务可能需要PUT或DELETE方法,那么检查它们的配置/使用是否正确地限制在可信的用户和安全的环境中是非常重要的。
许多web环境允许基于谓词的身份验证和访问控制(VBAAC)。
这基本上只是使用HTTP方法(如GET和POST)的安全控制(通常使用)。让我们举个例子让你更好地理解。
[JAVA EE web XML file]
[xml] <security-constraint> <web-resource-collection> <url-pattern>/auth/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>root</role-name> </auth-constraint> </security-constraint> [/xml]
在上面的示例中,规则仅限于/auth目录的根角色。
但是,即使在对上述角色的访问受到限制之后,也可以使用HTTP谓词调整绕过这个限制。正如我们看到的,上面提到的配置只限制了使用GET和POST方法。
我们可以很容易地绕过这个使用头部方法;您还可以尝试任何其他HTTP方法,如PUT、TRACK、TRACE、DELETE等。
此外,您还可以尝试通过发送任意字符串(如ASDF)作为HTTP谓词(方法)来绕过相同的问题。
以下是一些条件,是有可能绕过的:
- 它的GET功能不是幂等的,也不是执行任意的HTTP方法
- 它使用列出HTTP谓词的安全控件
- 安全控制无法阻止HTTP方法,不列在这些是最常见的场景,你可以绕过相同的。它还取决于规则的错误配置。
我们怎样绕过VBAAC与HTTP方法
1. 使用HEAD方法
如上所述,HEAD方法用于获取与GET相似但没有响应体的结果。假设您的应用程序中有一个URL受到安全约束的保护,该约束仅使用GET和POST限制对/Auth目录的访问。
http://httpsecure.org/auth/root.jsp?cmd=adduser
如果您尝试在浏览器中强制浏览到该URL,则安全约束将检查规则,以查看所请求的资源和请求者是否得到了授权。
第一个规则将检查来自浏览器的HTTP方法,因此它应该是一个被安全约束阻止的GET或POST方法。
如果您使用浏览器代理(如BurpSuite)拦截请求,并通过更改GET to HEAD方法来生成它,因为HEAD方法没有在安全约束中列出,所以请求将不会被阻止。
因此,adduser函数将被成功调用,并且由于HEAD功能,您将在浏览器中获得空响应。
2. 使用任意的HTTP谓词
大多数平台都允许使用任意的HTTP动词,比如PHP、JAVA EE。
这些方法的执行类似于GET请求,这使您能够绕过相同的请求。
最重要的是,使用任意方法的响应不会像HEAD方法那样被剥离。您可以很容易地看到内部页面。
用任意方法,代替HEAD 方法可以查看页面源代码。
3. 一些供应商允许HEAD头部动词
许多服务器供应商默认允许头动词,例如:
- APACHE 2.2.8
- JBOSS 4.2.2
- WEBSPERE 6.1
- TOMCAT 6.0
- IIS 6.0
- WEBLOGIC 8.2
允许使用HEAD方法根本不是一个漏洞,因为它是RFC中的一项需求。
让我们看看一些最流行的过时的应用程序安全机制,看看我们是否可以使用它们绕过VBAAC。
以下是可能受到谓词篡改技术影响的服务器。
JAVA EE
允许HTTP动词在策略中—YES
绕路可能—YES
HEAD可以在policy中—YES
.htaccess
允许HTTP谓词在Policy中—YES
Bypassing Possible绕路可能—YES(如果没有设置)
HEAD可以在policy中—YES
ASP.NET
允许在策略中使用HTTP动词—YES
绕路可能—YES(如果没有设置)
HEAD可以在policy中—YES
Java EE容器
让我们考虑以下安全约束策略:
[bash] <security-constraint> <display-name>Example Security Constraint Policy</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <!– Define the context-relative URL(s) to be protected –> <url-pattern>/auth/security/*</url-pattern> <!– If you list http methods, only those methods are protected –> <http-method>POST</http-method> <http-method>PUT</http-method> <http-method>DELETE</http-method> <http-method>GET</http-method> </web-resource-collection> … </security-constraint> [/bash]
在上面提到的代码中,列出的方法是受保护的,因此只有当对/auth/security目录中的任何内容的请求使用<http-method> 列表中的谓词时,该规则才会触发。
实现此策略的最佳方法是阻止未列出的任何方法,但这不是这些机制当前的行为方式,并且您可以看到HEAD动词不在此列表中。
因此,转发HTTP HEAD请求将完全绕过此策略,在此之后,应用服务器将把请求传递给GET处理程序。
确保JAVA EE安全的正确方法是从该策略中删除所有< HTTP -method>元素,这只是将该规则应用于所有HTTP方法,但是如果您仍然希望限制对特定方法的访问,那么您需要设置下面提到的两个策略。
[java] <security-constraint> <web-resource-collection> <web-resource-name>site</web-resource-name> <url-pattern>/*</url-pattern> <http-method>GET</http-method> </web-resource-collection> … </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>site</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> … </security-constraint> [/java]
因此,第一个策略拒绝GET访问请求,第二个策略拒绝所有访问请求。
ASP.NET Authorization
让我们来看看ASP.NET授权安全机制配置,容易被VBAAC绕过。
[vb] <authorization> <allow verbs="POST" users="joe"/> <allow verbs="GET" users="*"/> <deny verbs="POST" users="*"/> </authorization> [/vb]
在上述规则中,用户JOE只能提交POST请求。
在本例中,这是不能绕过的,原因是GET方法允许所有人使用。
因此,没有保证绕过使用HEAD 方法。
[bash] <authorization> <allow verbs="GET" users="root"/> <allow verbs="POST" users="joe"/> <deny verbs="POST,GET" users="*" /> </authorization> [/bash]
这是容易绕过使用头部方法。
这是可能的,因为. net隐式地在每个授权中插入了一个“允许所有人”规则。
在适当地列出他们的角色权利之后,附加一个“拒绝所有”规则。
[bash] <authorization> <allow verbs="GET" users="root"/> <allow verbs="POST" users="joe"/> <deny verbs="*" users="*" /> </authorization> [/bash]
这将确保通过授权检查的请求只有那些在授权规则中具有特定HTTP谓词的请求。
需要记住的几点
1)始终启用deny all选项
2)配置你的网络和应用服务器,完全不允许HEAD请求
感谢您的阅读
References
https://www.owasp.org/index.php/Test_HTTP_Methods_%28OTG-CONFIG-006%29
http://www.aspectsecurity.com/research-presentations/bypassing-vbaac-with-http-verb- tampering