SQL注入总结(四)

WAF绕过:(web application firewall)

从架构层绕过waf

从资源角度绕过waf

从协议层面绕过waf

从规则缺陷绕过waf

1.从架构层绕过waf

1.1寻找源站

如果流量都没有经过waaf,waf当然无法拦截攻击请求。当前许多云waf架构,例如:百度云加速,360安全卫士等,通过更改DNS解析,把流量引入waf集群,流量经过检测后转发请求到源站

云waf流量路径:

假设我们是攻击者,如何绕过waf的安全检测呢?从云waf架构考虑,如果 http请求都没有经过waf集群直接到达源站,顺理成章bypass waf。所以关键在于发现源站的IP地址,常用方法:

  1. 信息泄露发现源站IP。信息泄露的途径很多:

网站页面注销是否包含源站IP

Github源代码泄露是否包含源站IP

未接入waf之前,真实的IP地址是否被搜索引擎等服务收录

  1. 穷举IP,根据特征发现服务器真实IP地址

1.2利用同网段

一些在云服务商的站点,同时使用云服务商提供的waf服务。当流量不是通过DNS解析引流到waf,流量必须经过waf的检测,这是不能通过发行源站进行绕过。可以考虑在云服务商买一台vps,通过vps攻击目标站点,因为流量是局域网,可能不经过waf检测,实现绕过。能不能成功关键在于云服务商的网络配置

1.3利用边界漏洞

如果未能发现源站的IP,可以尝试寻找子站的ssrf漏洞,如果子站访问目标站点不经过waf集群,可以利用ssrf漏洞来绕过waf

2.资源限制角度绕过waf

这是众所周知,难以解决的问题。如果HTTP请求POST BODY 太大,检测所有的内容,waf集群消耗太大的cpu,内存资源。因此许多waf只检测前面的几K字节,1M或者2M。对于攻击者而言,只需要在POST BODY前面添加许多无用的数据,把攻击payload放在最后即可绕过waf检测

3.协议层面绕过waf的检测

即使流量都确保经过waf,如果waf的防御策略根本就没有检测payload,那么也就能绕过waf。协议层面绕过waf,利用waf解析协议的问题,使得payload被认为不是请求的http请求的内容,总结出waf解析协议的常见三个方向:

协议覆盖不全

协议解析不正确

协议解析与后台web容器的协议解析不一致

3.1协议未覆盖绕过waf

POST请求常用有两种参数提交方式:

content-Type: application/x-www-form-urlencoded;

Content-Type:multipart/form-data;

Waf未能覆盖Content-Type:multipart/form-data;从而导致被绕过,或者waf回任务它是文件上传请求,从而只检测文件上传,导致被绕过。

3.2利用协议解析不一致绕过waf

利用协议解析问题让waf无法匹配到正确的文件名,就能绕过waf实现文件的上传

3.3.1协议解析不正确-文件名覆盖

在一个content-disposition中,存在多个filename,协议解析应该使用最后的filename值作为文件名。如果waf解析到filename=‘1.txt’认为解析到文件名,结束解析,导致被绕过容器解析到的文件名是1.php

例如:content-disposition:dorm-data;name=myfile;

Filename=1.txt;filename=1.php

3.3.2 协议解析不正确-遗漏文件名

当waf遇到name=myfile;;时,认为没有解析到filename。而后端容器继续解析到的文件名是1.jsp,导致waf被绕过

例如:content-disposition:form-data;name=myfile;;filename=1.jsp

3.3.4 协议解析不正确-未解析所有文件

Multipart协议中,一个POST请求可以同时上传多个文件,许多waf只检查第一个上传的文件,并没有检查上传的所有文件,而实际后端容器会解析所有上传的文件名,攻击者只需要把payload放在后面的文件部分,就可以绕过

3.3.5 协议解析不一致-文件名解析兼容性

Multipart协议中,文件名的形式为“filename=“a.php””。但是在tomcat,php等容器解析协议时会做一些兼容,能正确解析“filename=“a.php”、“filename=a.php”、“filename=‘a.php’”。而waf只按照协议标准去解析,无法解析文件名,但是后端容器能正确获得文件名,从而导致被绕过

例如:

content-disposition:form-data;name=file;filename=a.php

content-disposition:form-data;name=file;filename="a.php

content-disposition:form-data;name=file;filename=a.php

修复方案一:

解析文件上传请求时,如果发现请求不符合协议规范,则拒绝请求。可能会产生误拦截,需要评估拦截的影响范围

修复方案二:

兼容php的文件解析方式,解析文件名时,以单引号或双引号开头,并且对应的单引号或双引号闭合

总的来说,一款优秀的waf应该能够处理兼容web应用容器,标准协议,Web服务器之间的差异

4.规则层面的绕过

对基于正则表达式的waf,绕过waf规则主要思考安全工程师写waf规则时在想什么,容易忽略什么,推断出一些可能绕过的方式,然后多次进行验证

绕过SQL注入规则主要利用waf规则本身的问题,未考虑到SQL语法变形,及后端数据库SQL语句语法特性。不同的数据库虽然遵守SQL标准,但是通常会加入特有的语法。Waf的防御策略要兼顾各种数据库的特殊语法,容易遗漏,从而被利用绕过waf,下面以mysql为例子,分析思路

4.1注释符绕过

/*xx*/是注释,也可以充当空白符。因为/**/可使得mysql对SQL语句(union/**/select)词法解析成功。事实上许多waf都考虑到/**/可以作为空白分,但是waf检测“/\*.*\*/”很消耗性能,工程师会折中,可能在检测中间引入一些特殊字符,例如:/*\w+*/。或者,waf可能只中间检查n个字符“/\*.{,n}\*/”。根据以上想法,可以逐步测试绕过方法:

先测试最基本的:union/**/select

在测试中间引入特殊字:union/*aaaa%01bbs*/select

最后测试注释长度:union/*aaaaaaaaaaaaa*/select

内联注释:/*!xxx*/

4.2空白符绕过

基于正则表达式的waf,SQL注入规则使用正则表达式的“\s”匹配空格,例如“select\s+union”。利用正则表达式的空白符与mysql空白符的不同可绕过waf规则,如何知道这些mysql特性?通过fuzz,每次更改正常SQL语句的某部分,替换为其他字符,判断语法是否正确,即可判断出来mysql语法特性。当然,也可以通过分析mysql词法来发现语法特性,从而找到绕过方法

利用空白符进行绕过,测试waf时尽可能减少其他原因的影响,例如:“select union”被拦截,只需要把中间空白符替换为“%250C”,“%25A0”进行绕过测试

Mysql的空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*XXX*/

正则表达式的空白符:%09,%0A,%0B,%0D,%20

4.3函数分隔符

对基于正则表达式的waf,我们猜测安全工程师写waf规则时,可能不知道函数名与左括号之间可以存在特殊字符,或者遗漏可以存在特殊字符。例如匹配函数“concat()”的规则写法,“concat(”或者“concat\s*(”,就没有考虑到一些特殊字符。相应的绕过方法,在特殊位置引入特殊的分隔符,逐个测试。这些特殊分隔符发现也是通过fuzz出来的

Concat%2520(

Concat/**/(

Concat%250C(

Concat%25A0(

学会举一反三,寻找关键位置,通过fuzz,发现更多的绕过方法

4.4浮点数词法解析

利用mysql解析浮点数的特点,正则表达式无法匹配出单词union,但是mysql词法解析成功解析出浮点数,sql关键字union

例如:

Select * from users where id=8E0union select 1,2,3,4,5

Select * from users where id=8.0union select 1,2,3,4,5

Select * from users where id=\Nunion select 1,2,3,4,5

4.5利用error-base进行sql注入

error-base的sql注入函数=非常容易被忽略,导致waf规则过滤不完整。随着对mysql研究越来越深,被发现可用于error-base SQL注入的函数越来越多,同时也给绕过waf造成了更多的机会,常见的函数:

Extractvalue(1,concat(0x5c,md5(3)));

Updatexml(1,concat(0x5d,md5(3)),1);

Geometrycollection((select * from(select * from (select @@ version)f)x))

Polygon((select * from(select name_const(version(),1))x))

Linestring()

Multipoint()

Multilinestring()

Multipolygon()

利用error-base的SQL注入函数进行绕过时,也可以结合函数分隔符,或者其他方法灵活使用

4.6 mysql特殊语法

最有效的发现手段,还是去读mysql词法分析源代码。和协议绕过类似,挖掘SQL标准与mysql的词法分析差异是发现waf SQL注入绕过的有效手段,下面是一个mysql语法的一个特写

Select{x table_name} from {x information-schema.tables};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值