介绍WAF

本节主要介绍WAF (Web Application Firewall, Web应用防火墙)及与其相关的知识,这里利用国际上公认的一种说法: Web应用防火墙是通过执行系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

WAF基本上可以分为以下几类。

软件型WAF

以软件形式装在所保护的服务器上的WAF,由于安装在服务器上,所以可以接触到服务器上的文件,直接检测服务器上是否存在WebShell、是否有文件被创建等。

硬件型WAF

以硬件形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶意流量,在旁路监听模式时只记录攻击不进行拦截。

云WAF

一般以反向代理的形式工作,通过配置NS记录或CNAME记录,使对网站的请求报文优先经过WAF主机,经过WAF主机过滤后,将认为无害的请求报文再发送给实际网站服务器进行请求,可以说是带防护功能的CDN。

网站系统内置的WAF

网站系统内置的WAF也可以说是网站系统中内置的过滤,直接镶嵌在代码中,相对来说自由度高,一有以下这几种情况。

  • 输入参数强制类型转换(intval等) 。
  • 输入参数合法性检测。
  • 关键函数执行(SQL执行、 页面显示、命令执行等)前,对经过代码流程的输入进行检测。
  • 对输入的数据进行替换过滤后再继续执行代码流程(转义/替换掉特殊字符等)网站系统内置的WAF与业务更加契合,在对安全与业务都比较了解的情况下,可以更少地收到误报与漏报。

WAF判断

介绍几种判断网站是否存在waf的方法。

SQLMap

python sqlmap.py -u "http://xxx.com/se/" --identify-waf --batch

使用SQLMap中自带的WAF识别模块可以识别出WAF的种类,但是如果所安下面装的WAF并没有什么特征,SQLMap就只能识别出类型是Generic。下面以某卫士官网为例,在SQLMap中输入以下命令,结果如图所示。



可以看到识别出WAF的类型为XXX Web Application Firewall。要想了解详细的识别规则可以查看SQLMap的WAF目录下的相关脚本,也可以按照其格式自主添加新的WAF识别规则,写好规则文件后直接放到WAF目录下即可。

手工判断

这个也比较简单,直接在相应网站的URL后面加上最基础的测试语句,比如union select 1,2,3%23, 并且放在一个不存在的参数名中,本例里使用的是参数aaa,如图所示,触发了WAF的防护,所以网站存在WAF。

因为这里选取了一个不存在的参数,所以实际并不会对网站系统的执行流程造成任何影响,此时被拦截则说明存在WAF。

被拦截的表现为(增加了无影响的测试语句后) :页面无法访问、响应码不同、返回与正常请求网页时不同的结果等。

一些WAF的绕过方法

本小节主要介绍SQL注入漏洞的绕过方法,其余漏洞的WAF绕过方法在原理上是差不多的。

大小写混合

在规则匹配时只针对了特定大写或特定小写的情况,在实战中可以通过混合大小写的方式进行绕过(现在几乎没有这样的情况),如下所示。

uNion sElEct 1,2,3,4,5

URL编码

极少部分的WAF不会对普通字符进行URL解码,如下所示。

union select 1,2,3,4,5

上述命令将被编码为如下所示的命令。

%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%32%2c%33%2c%34%2c%35

还有一种情况就是URL二次编码,WAF一般只进行一次解码,而如果目标Web系统的代码中进行了额外的URL解码,即可进行绕过。

union select 1,2,3,4,5

上述命令将被编码成如下的命令:

%2575%256e%2569%256f%256e%2520%2573%2565%256c%2565%2563%2574%2520%2531%252c%2532%252c%2533%252c%2534%252c%2535

替换关键字

WAF采用替换或者删除select/union 这类敏感关键词的时候,如果只匹配一次则很容易进行绕过。

union select 1,2,3,4,5

上述命令将转换为如下所示的命令

ununionion selselectect 1,2,3,4,5

使用注释

注释在截断SQL语句中用得比较多,在绕过WAF时主要使用其替代空格(/任意内容/),适用于检测过程中没有识别注释或替换掉了注释的WAF。

Union select 1, 2, 3, 4, 5

上述命令将转换为如下所示的命令。

union/*2333*/select/*aaaa*/1, 2, 3, 4, 5

还可以使用前面章节中介绍的内联注释尝试绕过WAF的检测。

多参数请求拆分

对于多个参数拼接到同一条SQL语句中的情况,可以将注入语句分割插入。

例如请求URL时,GET参 数为如下格式。

a=[input1]&b=[input2]

将GET的参数a和参数b拼接到SQL语句中,SQL语句如下所示。

and a=[input1] and b=[input2]

这时就可以将注入语句进行拆分,如下所示。

a=union/*&b=*/select 1, 2, 3, 4

最终将参数a和参数b拼接,得到的SQL语句如下所示。

and a=union /*and b=*/select 1, 2, 3, 4

HTTP参数污染

HTTP参数污染是指当同一参数出现多次,不同的中间件会解析为不同的结果,具体如表所示(例子以参数color=red&color= blue为例)

在上述提到的中间线中,IIS比较容易利用,可以直接分割带逗号的SQL语句。在其余的中间件中,如果WAF只检测了同参数名中的第一个或最后一个,并且中间件特性正好取与WAF相反的参数,则可成功绕过。下面以IIS为例,一般的SQL注入语句如下所示。

Inject=union select 1, 2, 3, 4

将SQL注入语句转换为以下格式。

Inject=union/*&inject=*/select/*&inject=*/1&inject=2&inject=3&inject=4

最终在IIS中读入的参数值将如下所示。

Inject=union/*,*/select/*,*/1, 2, 3, 4

生僻函数

使用生僻函数替代常见的函数,例如在报错注入中使用polygon()函数替换常用的updatexml() 函数,如下所示。

SELECT polygon((select*from (select*from(select@@version)f)x));

寻找网站源站IP

对于具有云WAF防护的网站而言,只要找到网站的IP地址,然后通过IP访问网站,就可以绕过云WAF的检测。

常见的寻找网站IP的方法有下面这几种。

  • 寻找网站的历史解析记录。
  • 多个不同区域ping网站,查看IP解析的结果。
  • 找网站的二级域名、NS、MX记录等对应的IP。
  • 订阅网站邮件,查看邮件发送方的IP。

注入参数到cookie中

某些程序员在代码中使用$_REQUEST获取参数,而$_REQUEST会依次从GET/POST/cookie中获取参数,如果WAF只检测了GET/POST而没有检测cookie,可以将注入语句放入cookie中进行绕过。

WAF的那些事的更多相关文章

  1. 对抗假人 —— 前后端结合的 WAF

    前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...

  2. WAF指纹识别和XSS过滤器绕过技巧

    [译文] -- “Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters” 0x1 前言 之前在乌云drop ...

  3. 一次手工注入waf [转载]

    转载自sss安全论坛 目标站点:http://www.xxx.cn:88注入点:http://www.xxx.cn:88/new/details1.asp?n_id=49909对其进行检测:http: ...

  4. cloudflare的新waf,用Lua实现的

    我们使用nginx贯穿了我们的网络,做前线web服务,代理,流量过滤.在某些情况下,我们已经扩充了nginx上我们自己的模块的核心C代码,但近期我们做了一个重大举措,与nginx结合使用lua 差点儿 ...

  5. waf python build 工具使用流程

    waf python build 工具使用流程 waf 的 build 理念 build 了之后,可以跟踪到 ${SRC} 和 ${TGT} 有关联的文件,只有 ${SRC} 被修改过,在下次buil ...

  6. phpMyadmin提权那些事

    i春秋作家:anyedt phpMyadmin提权那些事 引言:在渗透测试过程中获知到phpMyadmin的账号密码,如何进行提权呢?往下看,我今天和你说说phpMyadmin提权那些事. 0×00 ...

  7. NAXSI means Nginx Anti XSS & SQL Injection. NAXSI is an open-source, high performance, low rules maintenance WAF for NGINX

    nbs-system/naxsi: NAXSI is an open-source, high performance, low rules maintenance WAF for NGINXhttp ...

  8. 让 Nginx 支持 WAF 防护功能实战

    ngx_lua_waf 安装说明文档 作者github地址: https://github.com/loveshell/ngx_lua_waf ———————————————————————————— ...

  9. 前后端结合的 WAF

    前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...

随机推荐

  1. Shell编程—控制脚本

    1处理信号 1.1信号表 编号 信号名称 缺省操作 解释 1 SIGHUP Terminate 挂起控制终端或进程 2 SIGINT Terminate 来自键盘的中断 3 SIGQUIT Dump ...

  2. seo增加外链的方法

    http://www.wocaoseo.com/thread-128-1-1.html 今天给大家介绍一下本人发外链的一点经验吧.好多新手都感觉,发个外链真的好难哦.其实之前我也是这样认为的,发外链好 ...

  3. Educational Codeforces Round 68 (Rated for Div. 2)-D. 1-2-K Game

    output standard output Alice and Bob play a game. There is a paper strip which is divided into n + 1 ...

  4. for、forEach、map、for...in、for...of的区别以及能否终止循环的总结

    有时候面试会提到,用的时候又不在意,今天有空挨个做了测试,总结如下:

  5. 2 http

    response.write(string|buffer)可以调用0-n次 response.end(string|buffer) 方法.必须调用一次  response.setHeader('Con ...

  6. 实验 1:Mininet 源码安装和可视化拓扑工具

    实验 1:Mininet 源码安装和可视化拓扑工具 一.实验目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具. 二.实验任务 使用源码安装 Mininet 的 2.3 ...

  7. graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版

    论文地址:https://arxiv.org/abs/1710.10903 代码地址: https://github.com/Diego999/pyGAT 之前非稀疏矩阵版的解读:https://ww ...

  8. Openstack 调整云主机大小失败解决

    Openstack 使用调整openstack云主机大小报错 tailf /var/log/nova/nova-compute.log 2017-02-24 18:21:29.088 28511 ER ...

  9. [计算机网络]TCP/IP协议-运输层

    TCP/IP体系结构 TCP/IP四层协议 五层协议 协议 作用 应用层 应用层 HTTP超文本传输协议.FTP文件传输协议 - 运输层 运输层 TCP(面向连接的,可靠的).UDP(无连接的,不保证 ...

  10. .Net EF 学习之model first

    新建一个控制台项目,然后点击添加新建项,选择ADO.Net 实体数据模型 选择空模型 右击设计器,新增,实体 右击新增,标量属性, 右侧可以设置最大长度和一些属性信息: 建好对象后右击根据模型生成数据 ...