绕waf系列之绕安全狗
转载自: 网络
攻击的特定:
攻击二象性:已知攻击和未知攻击
目前市面主流的WAF产品:
云WAF
- 阿里云盾
- 腾讯网站管家
- 创宇盾
- ClodeFlare等
软件产品类
- 安全狗
- 云锁
- 360主机卫士
- ModSecurity
硬件类型设备:
- 启明星辰
- 绿盟
- 天融信
- 飞塔等
硬件waf缺陷:对HTTP协议的兼容性不强,对异常报文会产生bug,导致绕过
WAF的核心原理:
- 运用黑白思想
- 特征匹配,漏洞签名:特定特征的漏洞,比如stract2漏洞
- 对匹配结果进行响应(拦截,记录)
WAF的几种部署模式:
基于DNS解析
修改DNS,让域名解析到反向代理服务器,所有流量经过反向代理进行检测,检测无问题之后再转发给后端的web服务器
串联模式
一般指的是反向代理模式,透明代理模式.反向代理模式会改变原有的网络拓扑,真实客户端ip会以HTTP header传递给后端web server.透明代理模式可以在不改变原有网络拓扑结构的情况下直接部署.
旁路模式
利用流量镜像技术,将业务流量分流给WAF产品,这种部署模式的优点是不会影响业务稳定性,所以WAF会投入更多的性能在检出率上面.但是缺点也很明显,不借助其他手段无法对检测出的攻击行为进行阻断.
软件嵌入中间件+检测引擎模式
在使用nginx作为反向代理的业务中,WAF提高nginx模块嵌入原有nginx,将请求转发给检测引擎,可以做到在不改动原有的网络拓扑的情况下完成检测任务
WAF为什么会被绕过:
- 鱼(安全)和熊掌(业务性能)不能兼得,waf需要满足基本业务需求,所以一般不设置白名单之类的过于苛刻的操作
- WAF为了考虑通用性的问题,无法100%覆盖某些语言,中间件,数据库等特性
- 硬件WAF自身往往存在漏洞
- 架构:waf部署模式
- 规则缺陷/特性
- 协议:指HTTP0.9协议:TCP长连接
WAF绕过实战—-绕过安全狗进行注入
所谓的bypass waf实际上是去寻找位于waf设备之后处理应用层数据包的硬件/软件的特性,利用特性构造waf不能命中,但是在应用程序能够执行成功的payload,绕过防护
实验环境:
本地测试代码(PHP):
|
|
绕过拦截and 1=1
首先先稍微测试一番,发现存在安全狗
|
|
|
|
通过测试我们发现当 and 后面跟上 数字型和字符型时他会给我们拦截掉 ,其实我们在安全狗的规则里面可以看到他拦截 and 和 or 所以我们有2个思路
- 用其他字符替换 and 或者 or
- 带入的不是字符串和数字型,带入一个特殊符号
针对第一种我们可以去看看运算符号 随便找到几个| ^ xor & / * && || 等等还有很多
|
|
那么可以试着将and替换成&&,URL编码得到%26%26,将1=1替换成true或者false,发现可以成功绕过
|
|
另外在分享一些可以绕过目前版本的安全狗测试payload (注:mysql支持&& || ,oracle不支持 && ||)
|
|
绕过order by查询
判断查询字段,使用mysql的/*!*/
内敛注释去绕过防护,而其中的代码是可以正常执行的
|
|
绕过union select查询
在网上找了好一阵子,发现有大佬提供的payload使用正则表达式去绕过
|
|
- 对于数字型注入,可以将其转换成浮点型
- 联合查询绕waf,%0a为换行符经过URL编码得到的,可以通过换行符进行绕过,
- 函数中可以插入任何混淆字符绕过waf
- 另外使用-1可以省去空格绕过waf
|
|
基于报错信息的注入绕安全狗
|
|
绕过select from
使用大括号去绕过
|
|
使用反引号去绕过
|
|
使用\N去绕过
|
|
括号法去绕过
|
|
也可以组合起来
|
|
这些都是去掉空格的合法语句,当然如果不拦截/*/或/!*/
的话,也可以尝试这两个
提示,安全狗默认不开启对information_schema的拦截,如果开启了,那么就得找支持post传递数据的注入点了,post下不拦截information_schema这个关键词。
补充点 php+mysql环境下支持的空格有:
|
|
其中使用的最多的就是%0a,%0b,%a0,/**/
,这四个当作空格插入在语句中来扰乱waf检测。
干货分享:使用/^!$asd%2a–=/
代替空格即可,找到sqlmap中tamper目录下的space2plus.py文件,将其中代替空格的/*/换成/^!$asd%2a–=*/
即可使用sqlmap跑了。
缓冲区溢出绕waf
另外也可以对安全狗实行缓冲区溢出绕waf 缓冲区溢出用于对WAF,有不少WAF是C写的,而C语言本身没有缓冲区保护机制,因此如果WAF在处理测试量时超出其缓冲区长度,就会引发bug从而实现绕过 要求是(针对于安全狗而已): GET类型请求转换成POST类型 Content-Length头长度大于4008 正常参数放置在脏数据后面