一、什么是HTTP请求   

  超文本传输协议(HTTP)提供了多种请求方法来与web服务器沟通。当然,大多数方法的初衷是帮助开发者在开发或调试过程中部署和测试HTTP应用。如果服务器配置不当,这些请求方法可能被用于一些不法用途。比如:跨站跟踪(XST)是一种高危漏洞,这种跨站脚本能利用HTTP TRACE请求。
  GET和POST是开发者获取服务器信息的最常用请求,没有之一。

  可以列举出常用HTTP请求:HEAD、GET、POST、PUT、DELETE、TRACE、OPTIONS、CONNECT

  理论上,由于这些请求允许攻击者修改web服务器上存储的文件、或者删除服务器上web页面、甚至上传web shell并获取用户的身份信息,它们都有可能制造出严重的安全漏洞。

  另外出于安全考虑,服务器root权限必须禁用如下请求:

  PUT:允许上传新文件至web服务器。攻击者可以上传恶意文件(比如可以执行调用cmd.exe命令的ASP/PHP文件)或者将受害者服务器用于存储自己的文件。

  DELETE:允许删除web服务器上的文件。攻击者可以简单粗暴的丑化受害者网站或实施DDoS攻击。

  CONNECT:允许客户端将服务器配置为代理。

  TRACE:可以在客户端上回显任何发送到服务器上的字符串。这个请求本来是用于帮助开发者调试的。但这个看似人畜无害的请求,却被Jeremiah Grossman发现可以被利用以实施XST攻击。

  即使一些Web服务经常会用到PUT或DELETE请求,但当我们真的遇到如上请求时,务必谨慎一些,确认这些请求是由可信用户在安全的环境中发出的。很多网络环境使用基于请求的认证及访问控制策略(VBAAC)。但是否会被绕过呢?我们来看下面这个例子:

JAVA EE web XML file
<web-resource-<< span="">a href="http://resources.infosecinstitute.com/collection/">collection>
/auth/*
GET
POST
 
root

  这样的设定是告诉HTTP Servlet的Container,仅允许用户角色为root的使用者,通过GET和POST的请求,获取路径为/auth/*下的资源。乍一看,代码限定了用户访问权限,好像没什么问题。但是,我们却可以通过篡改HTTP请求来绕过限制!为何?因为他并没有限制其他的HTTP请求应该被服务器拒绝!

  我们可以用HEAD或者其他非GET/POST请求,诸如PUT, TRACK, TRACE, DELETE等,或者还可以尝试发送任意字符串(如ASDF),无比轻松的绕过这条规则,达到获取/auth/*路径下文件的目的。

  总结一下可能会发生绕过的情形:

  允许非等幂的GET请求或者允许任意HTTP方法

  仅通过列出HTTP请求来控制安全

  不禁用没有列出的HTTP请求

  以上是发生绕过的几种最常见情形。各种排列组合或细节差异随实际的服务器配置而千变万化。但万变不离其宗,看似复杂的实际案例背后的原理却是相同的。

二、如何利用HTTP Verb Tampering绕过VBAAC

  1、HEAD请求

  如上所述,HEAD请求与GET类似,只不过服务器在响应时不会返回消息体。设想你的应用中有一段URL,若仅通过“拒绝GET和POST获取/auth路径下文件”这条规则保护,仍然是极不安全的。

  http://httpsecure.org/auth/root.jsp?cmd=adduser

  如果你强制浏览器访问该URL,安全机制会被触发,检查请求资源和请求者是否符合授权规则。第一个当然就是检查并阻断浏览器发送的GET和POST请求了。这时,只要你使用浏览器代理,比如Suite Burp,将拦截下来的GET请求替换成HEAD。由于HEAD未被列入安全约束规则中而畅行无阻,因此adduser命令将被成功调用,而你的浏览器也将得到一个空消息体作为HEAD请求的响应。

  2、任意HTTP请求

  包括PHP, JAVA EE在内的大多数平台都默认允许使用任意的HTTP请求。而这些请求可以取代GET绕过规则。更可怕的是,使用任意HTTP请求可以让你看到内部页面,甚至是网页源码,而这些是HEAD办不到的。某些服务器厂商允许HEAD请求,如下服务器厂商默认允许HEAD请求:

  APACHE 2.2.8

  JBOSS 4.2.2

  WEBSPERE 6.1

  TOMCAT 6.0

  IIS 6.0

  WEBLOGIC 8.2

  表面上,允许使用HEAD方法并不是一个漏洞,因为RFC也有这种要求。让我们来看看一些最流行的应用安全机制是否会给我们绕过VBAAC(verb-based authentication and access control )以可乘之机。如下是一些可能会受到篡改请求影响的服务器:

服务器类型  是否允许HTTP请求?  是否可绕过?  HEAD请求是否可用?

JAVA EE    YES          YES      YES

.htaccess    YES        YES(默认配置)  YES

ASP.NET    YES        YES(默认配置)  YES

三、如何防范HTTP Verb Tampering

3.1 JAVA 安全约束

  如何防范HTTP Verb Tampering JAVA EE容器,让我们来看看如下安全约束策略:

Example Security Constraint Policy
Protected Area
/auth/security/*
POST
PUT
DELETE
GET
...

  以上代码中,工程师列举并限制了POST, PUT, DELETE, GET等方法。因此,只有当浏览器使用这些在表中列举出的请求去获取/auth/security/*路径下文件时才会触发安全约束策略。

  因此,把其他未列出的方法也一并禁用才是完善这条规则的最优解。遗憾的是,以上策略目前却并非如此严谨。比如,由于HEAD并没有被列举出来,利用HEAD请求不难绕过此策略。确保JAVA EE安全性的正确打开方式是从安全约束策略中去除所有,并使安全约束策略针对所有的HTTP请求方法。但如果您仍想限制某些特定方法,建议您参考如下方法,分2步创建安全约束策略。

site
/*
GET
... site
/*
...

  如上,第1条策略将拒绝GET请求,而第2条策略则拒绝所有请求方法。

3.2、ASP.NET授权

  我们知道ASP.NET授权的安全机制是可能被绕过的,举几个例子来说明吧。

<allow verbs="POST" users="joe"/>
<allow verbs="GET" users="*"/>
<deny verbs="POST" users="*"/>

  在上面这段代码中:

  允许用户joe发送POST请求

  允许所有用户发送GET请求

  拒绝所有用户发送POST请求

  由于第2条允许所有用户发送GET请求,都无需用HEAD绕过了,简直毫无安全性可言。不要觉得你的智商被侮辱了,我们继续往下看。以下代码做了部分限制,但仍然会被HEAD绕过。

<allow verbs="POST" users="root"/>
<allow verbs="GET" users="joe"/>
<deny verbs="GET,POST" users="*"/>

  原因是逐条匹配以下规则后,发现HEAD请求不在限制范围内。

  允许用户root发送GET请求

  允许用户joe发送POST请求

  拒绝所有用户发送POST, GET请求

  由于.NET会悄悄地在所有规则的最后插入一条规则允许所有用户发送所有请求。因此,HEAD请求会被放行。为避免这种情况,我们应该在最后一条规则后加上“拒绝所有用户发送所有请求”。于是,有了如下代码:

<allow verbs="POST" users="root"/>
<allow verbs="GET" users="joe"/>
<deny verbs="*" users="*"/>

  这样才能完全确保只有那些在规则白名单中的特定用户才被允许发送特定HTTP请求。

  总结:

  在业务许可的情况下,加上”deny all”。

  配置你的web服务器和应用服务器完全禁用HEAD请求。

3.3 Asp.Net MVC

  须在 Controller 的 Action 添加授权。

绕过Web授权和认证之篡改HTTP请求的更多相关文章

  1. Shiro集成web环境[Springboot]-认证与授权

    Shiro集成web环境[Springboot]--认证与授权 在登录页面提交登陆数据后,发起请求也被ShiroFilter拦截,状态码为302 <form action="${pag ...

  2. Web Api 2 认证与授权 2

    HTTP Message Handler 在 Web Api 2 认证与授权 中讲解了几种实现机制,本篇就详细讲解 Message Handler 的实现方式 关于 Message Handler 在 ...

  3. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  4. Web APi之认证(Authentication)两种实现方式后续【三】(十五)

    前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...

  5. 转 Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...

  6. WebAPI 用户认证防篡改实现HMAC(二)签名验证 AbsBaseAuthenticationAttribute--转

    public class ActionFilter : ActionFilterAttribute      {          public override void OnActionExecu ...

  7. Web APi之认证

    Web APi之认证(Authentication)两种实现方式后续[三](十五)   前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不 ...

  8. 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)

    最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...

  9. JWT(Json web token)认证详解

    JWT(Json web token)认证详解 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该to ...

随机推荐

  1. the elements of computing systems 的读书笔记1

    想转职程序猿,还真不是说懂一门语言就够的了,想要继续进步,必须懂其相关实现原理,比如这些底层的构造.最近看的就是这一本计算机入门级的书,但是对我这个纯自学的人来说真是能学到很多. 这本书从最基本的Na ...

  2. 90. 子集 II

    90. 子集 II 题意 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], ...

  3. Illegal instruction错误的定位---忽略编译期警告的代价

    在原计算机的linux c++程序可以正确跑起来,但是换了一台机器运行时出现致命错误,程序直接当掉,错误提示如下: Illegal instruction (core dumped) 造成改错的主要原 ...

  4. MySQL数据库基准压力测试工具之MySQLSlap使用实例

    一.Mysqlslap介绍 mysqlslap是MySQL5.1之后自带的benchmark基准测试工具,类似Apache Bench负载产生工具,生成schema,装载数据,执行benckmark和 ...

  5. rpm管理环境包和代码包

    Author: JinDate: 20140610System: CentOS release 6.5 (Final) 06-09-2014c零:问题配置文件问题,不打包使用的配置文件参考配置文件后缀 ...

  6. php curl伪造referer

    CURL方式: SOCKET方式: file_get_contents方法: 通过上面的代码,我们就把referer地址伪装为http://www.xxxx.com,你可以写一段代码: $_SERVE ...

  7. Easy WordPress Updates: Store FTP Info in wp-config.php

    Saw an interesting blog post on Twitter today about storing WordPress FTP information in wp-config.p ...

  8. 深入理解 Java中的 流 (Stream)

    首先,流是什么? 流是个抽象的概念.是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行.设备能够是文件,网络,内存等. 流具有方向性,至于是输入 ...

  9. Blocks与Dispatch Queue的使用

    block是什么block是一个C level的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似.用于回调函数的地方.两个对象间的通讯.实现轻量级的“代理”. blocks和C语言函数指针的 ...

  10. gflags摘记

    projcet url: https://github.com/schuhschuh/gflags usage: commandline flags processing DEFINE: Defini ...