浅谈WAF绕过技巧

栏目: 数据库 · 发布时间: 8年前

内容简介:浅谈WAF绕过技巧

* 本文原创作者:m09046105,本文属FreeBuf原创奖励计划,未经许可禁止转载

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”,导致被绕过。

浅谈WAF绕过技巧

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”》

3.任意文件下载

(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模式。

* 本文原创作者:m09046105,本文属FreeBuf原创奖励计划,未经许可禁止转载


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Database Design and Implementation

Database Design and Implementation

Edward Sciore / Wiley / 2008-10-24 / 1261.00 元

* Covering the traditional database system concepts from a systems perspective, this book addresses the functionality that database systems provide as well as what algorithms and design decisions will......一起来看看 《Database Design and Implementation》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码