首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈WAF绕过技巧

浅谈WAF绕过技巧

作者头像
FB客服
发布2018-02-26 15:51:51
3.5K0
发布2018-02-26 15:51:51
举报
文章被收录于专栏:FreeBufFreeBuf

waf分类

掌握绕过各类WAF可以说是渗透测试人员的一项基本技能,本文将WAF分为云WAF、硬件WAF、软件WAF、代码级WAF,分别从各自的特性来谈一些相关的绕过技巧,更侧重于针对基于规则类的WAF绕过技巧。

云waf

Eg:加速乐

目前CDN服务的功能是越来越多,安全性也越加强悍,用户的每个请求都会被发送到指定的CDN节点上,最后转发给真实站点。这个过程就好像加了一道关卡,这个关卡提供了缓存、加速、防御的特点。

绕过关键:查询真实IP,若是直接访问服务器的IP就不经过CDN了。

以下四点有助于绕过:

1.查询历史DNS(在2016年加入到了cnd节点里面,可以通过查询2016年之前的dns记录) 2.查看子域名解析地址是否和主域名的IP地址相近。(有些网站只会讲主站加入到CDN节点里面,这时可以查看其二级、三级域名的IP地址信息,进而猜到主站的IP地址) 3.CDN节点分发缺陷,通过国外IP访问网站可能会出现真实IP,因为有的CDN服务商可能只做了国内节点,没做国外的,这样访问请求是直接被转发到真实服务器地址上。 4.让服务器主动连接你。比如rss订阅服务或则是向邮箱服务器发送个错误的邮件比如地址不存在 通过抓包观察返回的头来,查找IP地址信息。

硬件waf

Eg:绿盟WAF

软件waf

Eg:安全狗

基于规则的WAF工作原理:

数据获取(注意 get post等方法以及 post体方式)———数据清洗(去除多余数据比如编码,mssql支持unicode编码)———规则匹配———二次校验

一.绕注入

1.关键字替换

原理:部分WAF是通过黑名单来起到拦截的作用,这种情况可以用关键字替换来实现绕过。比如在mysql中,waf将sleep()函数列入了黑名单,可以通过具备相同功能的benchmark()函数来实现绕过。以下是部分相同功能的替代函数:

< > 等价于 BETWEEN = 等价于 like Hex() bin() 等价于ascii() Sleep() 等价于 benchmark() Mid()substring() 等价于 substr() @@user 等价于 User() @@Version 等价于 version() (mysql支持&& || ,oracle不支持 && ||)

2.特殊符号

原理:结合不同数据库的特性来实现绕过。(最好是可以找到waf开发者都不了解的某些特性),以下是两个广为流传的小特性:

比如 “+” select+password+from+mysql.user 相当于是一个空格的作用 “`”放在mysql的末尾会起到注释符的作用

3.编码

可以结合各种编码方式来绕过,比如url编码,url双重编码,十六进制编码,unicode编码,数据库编码等。

举个栗子:mysql默认的字符集是latin,因此在php代码里面设置的字符集为 utf-8,这只是客户端的字符集,因此存在字符集装换的问题utf-8—>latin,若传进来的字符集不是完整的字符,则会导致不完整的字符自动会忽略的问题,比如username=admin%c2 , 由于%c2不是一个完整的utf-8字符 因此传到Mysql 里面 自动忽略了,导致查出的是admin用户的数据,可以利用这个特性绕过。

4.注释符

/*xxx*/是注释,也可以充当空白符。因为 /**/可使得MySQL对sql语句(union/**/select)词法解析成功。事实上许多WAF都考虑到/**/可以作为空白分,但是waf检测 “/\*.*\*/”很消耗性能,工程师会折中,可能在检测中间引入一些特殊字符,例如:/*\w+*/。或者,WAF可能只中间检查n个字符“/\*.{,n}\*/”。根据以上想法,可以逐步测试绕过方法:

先测试最基本的:union/**/select再测试中间引入特殊字:union/*aaaa%01bbs*/select最后测试注释长度:

union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select

5.空白符绕过

基于正则表达式的WAF, SQL注入规则使用正则表达式的“\s”匹配空格,例如”select\s+union”。

利用空白符进行绕过,测试WAF时尽可能减少其他原因的影响,例如”union select”被拦截,只需把中间空白符替换为”%250C”, “%25A0”进行绕过测试。

union%250Cselect union%25A0select

函数分隔符对基于正则表达式的WAF,我们猜测安全工程师写WAF规则时,可能不知道函数名与左括号之间可以存在特殊字符,或者遗漏可以存在特殊字符。例如匹配函数”concat()”的规则写法,“concat(”或者”concat\s*(”,就没有考虑到一些特殊字符。

concat%2520( concat/**/( concat%250c( concat%25a0(

6.浮点数词法解析

利用MySQL解析浮点数的特点,正则表达式无法匹配出单词union,但是MySQL词法解析成功解析出浮点数、sql关键字union。

select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0 select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0

7.报错注入

Error-based的SQL注入函数非常容易被忽略,导致WAF规则过滤不完整。常见的函数:

extractvalue(1, concat(0x5c,md5(3))); updatexml(1, concat(0x5d,md5(3)),1); GeometryCollection((select*from(select*from(select@@version)f)x)) polygon((select*from(select name_const(version(),1))x)) linestring() multipoint() multilinestring() multipolygon()

二.绕上传

关键是:waf与webserver的差异(waf的局限性与webserver的灵活性)。

1.协议解析不一致-文件名解析兼容性

multipart协议中,文件名的形式为“filename=”abc.php””。但是Tomcat、PHP等容器解析协议时会做一些兼容,能正确解析 ”filename=”abc.php”、”filename=abc.php”、 ”filename=’abc.php’”。而WAF只按照协议标准去解析,无法解析文件名,但是后端容器能正确获得文件名,从而导致被绕过。场景的绕过形式:

Content-Disposition: form-data; name=”file”; filename=bc.php Content-Disposition: form-data; name=”file”; filename=”abc.php Content-Disposition: form-data; name=”file”; filename=’abc.php’

2.协议解析不正确-未解析所有文件

multipart协议中,一个POST请求可以同时上传多个文件。如图,许多WAF只检查第一个上传文件,没有检查上传的所有文件,而实际后端容器会解析所有上传的文件名,攻击者只需把paylaod放在后面的文件PART,即可绕过。

3.协议解析不正确-文件名覆盖

在multipart协议中,一个文件上传块存在多个Content-Disposition,将以最后一个Content-Disposition的filename值作为上传的文件名。许多WAF解析到第一个Content-Disposition就认为协议解析完毕,获得上传的文件名,从而导致被绕过。如图,加速乐的WAF解析得到文件名是”sp.pho”,但PHP解析结果是”sp.php”,导致被绕过。

4.变换位置

因为WebServer获取参数的灵活性,所以我尝试把安全狗拦截的filename=”test.asp”换个位置。经过一番测试,发现filename=”test.asp”位于Content-Type: application/octet-stream

下一行时,安全狗的上传拦截便会失效。

5.文件名覆盖

在一个Content-Disposition 中,存在多个filename ,协议解析应该使用最后的filename值作为文件名。如果WAF解析到filename=”p3.txt”认为解析到文件名,结束解析,将导致被绕过。因为后端容器解析到的文件名是t3.jsp。

Content-Disposition: form-data;name=”myfile”; filename=”p3.txt”;filename=”t3.jsp”》

6.遗漏文件名

当WAF遇到“name=”myfile”;;”时,认为没有解析到filename。而后端容器继续解析到的文件名是t3.jsp,导致WAF被绕过。

《Content-Disposition: form-data;name=”myfile”;; filename=”t3.jsp”》

7.任意文件下载

(1)相对路径:所以WAF文件包含规则通常会检测连续的“../”。根据vfs解析路径的语法,解析到“//”文件路径不变,解析到“/./”文件路径依然。 通过避免连续的”../”,从而绕过WAF文件包含规则。Eg: ././..///./.././/../etc//passwd,它等价于../../../etc/passwd。

(2)绝对路径:例如 /etc/./passwd 与 /etc/passwd 是等价的。还可以通过组合“/./”、“//”进行绕过,

Eg.

/etc///.//././/passwd /etc/passwd /etc././././passwd

代码级waf

所谓代码级的WAF是指程序员在程序内部,借助自身编写的过滤函数来保护应用程序的安全。以下是三种脚本语言通常会使用的过滤位置:

1. php

在php.ini中设置

; Automatically add files before PHP document.; auto-prepend-fileauto_prepend_file =; Automatically add files after PHP document.; auto-append-fileauto_append_file =

配置指令,这些指令指向那些在每个请求的PHP脚本执行”之前”和”之后”才执行的PHP文件。这样就可以在各种HTTP请求集合(GET,POST,COOKIE)之前对数据进行一些前发处理。

2.asp.net

通过ASP.NET的System.Web.IHttpModule接口来实现

3.java

通过filter来实现。比如tomcat会在web.xml的配置文件中配置过滤类。

绕过基于规则的WAF

目前市面的大部分WAF是通过规则来实现的,既然是规则,就一定存在不全面、不准确的情况。下面举几个例子帮助大家拓展一下思路:

1.封禁IP

比如有些waf会对重复的IP访问进行封锁,这时可以用在请求包体中加入 “X-Originating-IP:127.0.0.1”,因为waf不会拦截他自己。

2.前端waf

针对于前端的waf,可以直接通过burp抓包绕过

3.改变user-agent

我们在写网站防火墙规则的时候可能都会做一件事:永远不屏蔽那些主流搜索引擎机器人的爬取(如,Google,Bing,Yahoo,Baidu等).这时我们就可以在USER-Agent伪造自己是搜索引擎的爬虫,绕过waf.

4.缓冲区溢出

比如waf只允许长度是2M的包体,而服务器则可以接受8M的包体,这种情况 可以通过发送2M-8M的包体将WAF溢出死。

5.替换关键字

需要考虑waf具体怎么拦截的,Seleselectct,倘若将中间的关键字删掉,则可以绕过。

6.webserver特性

iis 自动忽略%

我们知道asp有两个特性

1.会将Request中的不能编码部分的%去掉 2.Request中如果有unicode部分会将其进行解码

IIS6.0两个解析缺陷:目录名包含.asp、.asa、.cer的话,则该目录下的所有文件都将按照asp解析。

Apache1.X 2.X解析漏洞:

Apache在以上版本中,解析文件名的方式是从后向前识别扩展名,直到遇见Apache可识别的扩展名为止。

Nginx解析漏洞:

Nginx 0.5.*Nginx 0.6.*Nginx 0.7 <= 0.7.65Nginx 0.8 <= 0.8.37,以上Nginx容器的版本下,上传一个在waf白名单之内扩展名的文件shell.jpg,然后以shell.jpg.php进行请求。

Nginx 0.8.41 – 1.5.6:以上Nginx容器的版本下,上传一个在waf白名单之内扩展名的文件shell.jpg,然后以shell.jpg%20.php进行请求。

PHP CGI解析漏洞 : IIS 7.0/7.5 和 Nginx < 0.8.3 以上的容器版本中默认php配置文件cgi.fix_pathinfo=1时,上传一个存在于白名单的扩展名文件shell.jpg,在请求时以shell.jpg/shell.php请求,会将shell.jpg以php来解析。

参数污染:比如waf只接受前一个参数这意味着,通过注入: id=7&id=[SQLi]WAF的网络层会解析 id=7 ,合法PHP应用层会解析 id=[SQLi] 注入语句成功执行

7.数据库特性

mysql:

1.隐形类型转换 2.为了便利性 牺牲安全性。(select * from admin where user=“Admin” 可以执行, mysql为了 使用的便利性 会允许一些 ‘错误’,比如 select * from admin where user=“ À dmin” 依然可移执行。 3.MySQL文件读取

(5.5以上的版本 由于secure_file_priv这个变量为null 因此无法使用文件读取 文件写入的功能。)

8.服务器特性

Windows特殊字符:当我们上传一个文件的filename为shell.php{%80-%99}时:waf可能识别为.php{%80-%99},就会导致被绕过。

NTFS ADS特性:ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。

Windows在创建文件时,在文件名末尾不管加多少点都会自动去除,那么上传时filename可以这么写shell.php……也可以这么写shell.php::$DATA…….。

总结:本文主要对基于规则的WAF的绕过技巧,基于规则的waf有着天然的缺陷型,构造出基于规则之外的特性就有可能绕过。或者干脆将WAF直接打挂,这时waf很有可能直接启用Bypass模式。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 云waf
  • 硬件waf
  • 基于规则的WAF工作原理:
    • 一.绕注入
      • 二.绕上传
        • 1. php
          • 2.asp.net
            • 3.java
            • 绕过基于规则的WAF
              • 1.封禁IP
                • 2.前端waf
                  • 3.改变user-agent
                    • 4.缓冲区溢出
                      • 5.替换关键字
                        • 6.webserver特性
                          • 8.服务器特性
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档