如何 niāo 悄儿滴绕过 WAF ?

前言

WAF(Web Application Firewall ),网站应用级入侵防御系统,通过执行一系列针对 HTTP/HTTPS 的安全策略来专门为Web应用提供保护的一款产品。掌握绕过各类 WAF 可以说是渗透测试人员的一项基本技能。

WAF 分为云 WAF、硬件 WAF、软件 WAF、代码级 WAF 四类,本文将分别从各自的特性来谈一些相关的绕过技巧,重点于针对基于规则类的 WAF 绕过技巧。


分类

1 云 WAF

Eg.:加速乐

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

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

以下四点有助于绕过:

① 查询历史DNS(在2016年加入到了cnd节点里面,可以通过查询2016年之前的dns记录)

② 查看子域名解析地址是否和主域名的IP地址相近。(有些网站只会讲主站加入到CDN节点里面,这时可以查看其二级、三级域名的IP地址信息,进而猜到主站的IP地址)

③ CDN节点分发缺陷。通过国外IP访问网站可能会出现真实IP,因为有的CDN服务商可能只做了国内节点,没做国外的,这样访问请求是直接被转发到真实服务器地址上。

④ 让服务器主动连接你。比如 rss 订阅服务或则是向邮箱服务器发送个错误的邮件比如地址不存在 通过抓包观察返回的头来,查找 IP 地址信息。

2 硬件 WAF

Eg:绿盟WAF

3 软件 WAF

Eg:安全狗

4 代码级 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工作原理:

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

目前市面的大部分 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 有两个特性:

        ① 会将 Request 中的不能编码部分的 % 去掉,

        ② Request 中如果有unicode部分会将其进行解码。

(1)IIS6.0 的解析缺陷

如果目录名包含 .asp、.asa、.cer,则该目录下的所有文件都将按照 asp 解析。

(2)Apache1.X / 2.X 解析漏洞

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

(3)Nginx 解析漏洞

Nginx 0.5.*、Nginx 0.6.*、Nginx 0.7 <= 0.7.65、Nginx 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 进行请求。

(4)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 来解析。

(5)参数污染

比如 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 服务器特性

(1)Windows 特殊字符

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

(2)NTFS ADS 特性

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

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


绕过方法

接下来针对不同类型的漏洞,具体讲解一下新的绕过方法:

1 绕注入

(1)关键字替换

原理:部分 WAF 是通过黑名单来起到拦截的作用,这种情况可以用关键字替换来实现绕过

比如在 MySQL 中, WAF 将 sleep() 函数列入了黑名单,可以通过具备相同功能的 benchmark() 函数来实现绕过。以下是部分相同功能的替代函数:

< > 等价于 BETWEEN

= 等价于 like

Hex() bin() 等价于 ascii()

Sleep() 等价于 benchmark()

Mid()substring() 等价于 substr()

@@user 等价于 User()

@@Version 等价于 version()

MySQL 支持 &&  || ,oracle 不支持 && ||

过滤了 like 和 = 可以用  in between 来代替

(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()

2 绕上传

关键是: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 就认为协议解析完毕,获得上传的文件名,从而导致被绕过。

(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 文件包含规则。

如:././..///./.././/../etc//passwd,它等价于../../../etc/passwd

(2)绝对路径

例如 /etc/./passwd 与 /etc/passwd 是等价的。还可以通过组合“/./”、“//”进行绕过。

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

../../../

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


好消息

易宝 CTO 陈斌翻译的新书《架构真经》正在京东和亚马逊热卖!

《架构真经》:《架构即未来》姊妹篇,硅谷大咖的干货呈现,互联网架构的50条军规。唐彬、向江旭、叶亚明、段念、吴华鹏、张瑞海、韩军、程炳皓、张云泉、余晨、李大学、霍泰稳联袂力荐。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 一套实用的渗透测试岗位面试题,你会吗? 1.拿到一个待检测的站,你觉得应该先做什么? 收集信息 whois、网站源...
    g0阅读 4,799评论 0 9
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 2,017评论 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,210评论 2 22
  • 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直...
    付出从未后悔阅读 1,117评论 0 4
  • Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象...
    廖马儿阅读 2,112评论 2 38