web渗透测试中WAF绕过讲解(二)基于HTTP协议绕过

0x01 前言

        在讲本课的内容之前我们先来了解互联网中的HTTP是什么?
        超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。(百度的)
        HTTP协议的主要特点
        1.支持客户/服务器模式。
        2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
        3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
        4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
        5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

0x02 HTTP协议基础讲解

        http请求由三部分组成,分别是:请求行、消息报头、请求正文
        请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

0x03 HTTP请求方法

GET    请求指定的页面信息,并返回实体主体。
HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT     从客户端向服务器传送的数据取代指定的文档的内容。
DELETE      请求服务器删除指定的页面。
CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS     允许客户端查看服务器的性能。TRACE     回显服务器收到的请求,主要用于测试或诊断。

0x04 HTTP请求行区别

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。
对应HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
现在用的比较多的是post和get方式,一般情况下,如果不说明请求方式,例如地址栏输入网址请求、
超链接请求等都是get请求,只有在form表单请求时可以设置method方式为post。
get请求方式请求数据显示在url后面,post方式显示在请求体中,空白行下面。
get方式请求数据有限制,最大为1k,而post方式理论上没有限制。
在绕WAF中 GET包 与  POST包在处理上是有区别的,先看GET与POST的区别


 

 

Content-Type: 实体报头域用语指明发送给接收者的实体正文的媒体类型
现在市场上大部分的WAF会解析这行 Content-Type 去识别是否是POST注入,因为要防止方法污染。所以我们就可以根据这个特性来设置不同的Content-Type利用尝试绕过WAF

0x05 协议未覆盖绕过WAF

POST 请求常用有2种参数提交方式:
Content-Type: application/x-www-form-urlencoded;
Content-Type: multipart/form-data;
Waf未能覆盖Content-Type: multipart/form-data从而导致被绕过。或者WAF会认为它是文件上传请求,从而只检测文件上传,导致被绕过。如图,下面的WAF就存在被绕过的情况,是典型的协议未覆盖。

0x06 例子一:实战绕过云锁win_3.1.6版注入(针对POST请求)


 

 

 

 


给拦截了,先来看看这个包的请求

这是我们发送过去的包

我们前面说了大部分的WAF现在会去检测Content-Type 来判断当前执行的操作是什么那么如果我们修改他使用的是其他的报头一定程度上就可能可以绕过WAF


我们可以看到丝毫没有拦截就绕过去了,可见云锁没有对 Content-Type 的检测做好导致了绕过,我们来看看两个包的区别

 

成功绕过注入出数据了

 

0x07 例子二:实战绕过360主机卫士2.0.4.6apache版进行注入(针对GET请求)


 

 

 

 

 

 

 

 

至于为什么可以绕过我这里猜想了一下:

云锁:        
        我这里猜想的想是因为 云锁在检测的时候判断问题,因为我们知道Content-Type:multipart/form-data; 是用于POST文件上传的,所以云锁检测到这个报文是上传表单的请求,就调用了上传 表单相对应的规则来检测,而忽略了我们在上传表单中一样可以传输POST数组写入恶意代码,所以我们才能注入。

360主机卫士
        360卫士的话,就比较简单了,估计程序猿是使用了惯性思维,在写代码的时候判断我们是POST请求就将重点放在POST数组中进行检测,忘记了我们有可能在传输POST数据的时候,在URL写入恶意代码,导致防护失效

0x08 总结

        绕waf一定要思路骚,http协议也一定要了解,了解了http协议在了解WAF 的工作原理,我们必须正视的是,绕waf就是在绕正则,所以正则表达式一定要入门,只有这样你绕waf的时候才能脑补规则,干起活来也才能事半功倍。

        哦对了,可能会有人想要我上面的那个工具,我会上传到百度云  : )     
        下载地址:http://pan.baidu.com/s/1c1Fpfhu

        转载请获取作者同意在进行转载谢谢  :  )



作者:PHPoop
链接:http://www.jianshu.com/p/06eeb2ed4c9d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2017-08-20 01:08  wind_飘  阅读(2523)  评论(1编辑  收藏  举报