SQL_ByPassWaf

WAF绕过之SQL注入( 归来)

 

Author:flystart

Team: ms509

Date:2020/5

前言:

 

WAF(Web Application Firewall)对于从事信息安全领域的工作者来说并不陌生,在渗透测试一  个目标的时候常常作为拦路虎让人头痛不已,笔者这段时间花了些精力对国内外比较常见的WAF进行了绕过 研究,这只拦路虎其实也并没有想象中那么可怕。本文从SQL语法层面入手,以国内外主流 waf为研究测试 对象,借助fuzz、逆向等各种技术手段,挖掘组合各种SQL功能语法,无视操作系统、中间件、计算机语言 等差异硬杠WAF,欢迎私信交流。

 

 

SQL_ByPassWaf_第1张图片

正文:

 

WAF(Web Application Firewall)的中文名称叫做“Web应用防火墙 ”,根据不同的分类方法可分 为很多种,从产品形态上来划分主要分为三大类:硬件类(绿盟、天融信、安恒的硬件waf)、软件类(安  全狗、云锁、ModSecurity等)、基于云的waf(阿里云、创宇盾等)。软件类waf和云waf是本文的主角。

安全策略和规则可以说是waf的灵魂,我们所说的绕waf就是无视他的策略和规则达到攻击成功的目的。

SQL_ByPassWaf_第2张图片

老树:

这一部分是SQL语法功能技巧的总结,也是WAF绕过的基础。

注释:

 

 

MySQL

Oracle

MSSQL

 

注释符

/*/、# 、/!/、/!50000xx*/ 、-- 、-- - 、--+

 

-- 、/**/ --%0a-

-

- 、/**/ 、- -%0a-

空白字

 

%09%0A%0B%0C%0D%20

 

%00%09%0A%0B%0C%0D%20

 

%00-%20

功能特性:

selectCHAR

SQL 查询语句select后面可以接一些特殊字符,这些字符与select相结合可以达到绕过waf目的,除了 select 语句之外 union\from等关键字前后也可以连接一些特殊字符,这些关键子前后就可以作为fuzz 的点。

【 + 】号:

SQL_ByPassWaf_第3张图片

【- 】号:

 

SQL_ByPassWaf_第4张图片

【@】号:

SQL_ByPassWaf_第5张图片

【!】号:

SQL_ByPassWaf_第6张图片

【 ‘ 】号:

SQL_ByPassWaf_第7张图片

【 “ 】号:

SQL_ByPassWaf_第8张图片

【 ~ 】号:

 

SQL_ByPassWaf_第9张图片

【{】号:

SQL_ByPassWaf_第10张图片

当然除以上字符,也可结合注释符-- 、/*、空白字符等。

bfe580b5739943429f6d0a614372b824.png SQL_ByPassWaf_第11张图片

不仅仅mysql有这类的语法特性, mssql 、oracle同样支持,这里就不一一介绍大家可以自行fuzz尝试

●     Oracle11:

SQL_ByPassWaf_第12张图片

 

   MSSQL :

SQL_ByPassWaf_第13张图片

等价替换:

waf会对一些常见的攻击语句进行拦截,这个时候我们不一定非得正面硬杠,可以挖掘寻找一些生僻的 具有相同功能的语句进行代替替换,这也是绕waf的常用手段。以下部分是对SQL查询表达式、函数等  其他查询语句等价功能的一个总结,有些来自互联网,有些是自己的研究。

   函数替换

截取字符串是SQL注入利用技术里面的常用功能,通常使用mid(string,1,1)

SQL_ByPassWaf_第14张图片

|substr(user() from 1 for 1);|

SQL_ByPassWaf_第15张图片

|replace(LPAD(user(),2,1),LPAD(user(),2-1,1),"");|

 

SQL_ByPassWaf_第16张图片

|LPAD(REVERSE(TRIM( lpad(user(),1,SPACE(1)) )),1,SPACE(1);|

SQL_ByPassWaf_第17张图片

ascii(c) 、ord(c) <=> conv(hex(c),16,10)

SQL_ByPassWaf_第18张图片

对于函数过滤的情况可以通过官方文档所有API函数,使用index.php?id=1 xor user()进行fuzz,以下是 百度云 fuzz的结果

 

SQL_ByPassWaf_第19张图片

 

   逗号过滤

有时候逗号也会被waf拦截或过滤,可以通过不含引号的SQL语句代替

case when 代替if

SQL_ByPassWaf_第20张图片

union select 1,2,3 <=>

union select * from (select 1)a join (select 2)b join (select 3)c

SQL_ByPassWaf_第21张图片

limit 2,1 <=>limit 1 offset 2

 

SQL_ByPassWaf_第22张图片

   比较表达式代替

【 = 】

if(abs(strcmp((ascii(mid(user()from(1)for(2)))),114))-1,1,0)

SQL_ByPassWaf_第23张图片

find_in_set()

 

SQL_ByPassWaf_第24张图片

regexp

SQL_ByPassWaf_第25张图片

【<,>】

least(ord('r'),115) 、greatest(ord('r'),113)

 

SQL_ByPassWaf_第26张图片

between n and m

SQL_ByPassWaf_第27张图片

核心:

 

这部分内容是本文的核心部分,在我看来是文章的灵魂吧,除了技巧方法外,还有一些思想指导,waf 绕过技术不同于一般的技术思考方向至关重要,有些技巧大部分人可能都已经掌握了但真正给一款waf摆在 面前,能突破防御的怕是少之有少。该技术是一个比较大比较复杂的范畴,参数污染、畸形请求包、chunk 分割、编码解码等方法林林总总,这些都是老生常谈的东西适用一定的条件、场合,普适性不强,所以这方 面内容本文不会涉及,我们要和waf这只老虎来个正面较量,相信会给大家带来惊喜和收益。

 

目标:

 

做任何事情都要有个目标,没有目标或目标不明确给你一身好装备和本事也难成事。SQL注入漏洞能利 用成功的判断依据就是可以dump数据,对于后端DATABASE【SELECT col FORM table】用来查询数据  的基本语句,该语句的成功执行是可以dump数据的必要条件,当然也是各个厂家安全产品重点照顾的对

象,绕过对该语句的拦截自然就是我们的目标,平时进行绕过测试的时候也会关注【UNION SELECT】、

【ORDER BY】等语句,这些可以当成我们的次要目标,不是说他们的绕过不重要,而是不依靠这些语句仅 仅通过【SELECT col FORM table】照样可以dump数据,非必要充分条件吧,结合笔者经验和思考基本 可以明确我们的目标:

1.主要目标:绕过【SELECT col FORM table】语句拦截

2.次要目标:绕过【UNION SELECT】语句拦截

战略:

SQL_ByPassWaf_第28张图片

 

SQL注入根据分类方法不同可分为不同的类型,从SQL注入漏洞利用角度来说,一般有五种注入利用方 法,分别是报错注入、联合查询注入、布尔盲注、延时注入、堆查询注入。无论那种注入方式,利用

payload都可以分为两部分构成,对应的利用语句(BOUNDARY)和基本查询(QUERY)比如报错注入语句: 【updatexml(1,(select concat(0x7e,user,0x7e) from mysql.user limit 1),1)】蓝色圈起 来的报错语句就是BOUNDARY,红色圈起来的部分就是QUERY,也是我们需要绕过的主要目标。

87dfa5015d774468beb9c5802a8386e1.png

 

实战:

该小节依据上文战略思想,以真实案例来推演整个绕过过程。

目标: 百度云加速-CDN、网站攻击防护、SEO优化工具

1.本地FUZZ PAYLOAD

2.关键字前后填充字符测试

3.构造正确的绕过PAYLOAD

SQL_ByPassWaf_第29张图片

   本地FUZZ PAYLOAD

FUZZ 字符除了【0-255】全字符外,也可以添加自己收集的一些tricks进行FUZZ {FUZZ}UNION SELECT fuzz的一些结果

 

SQL_ByPassWaf_第30张图片

   关键字前后填充字符测试

UNION SELECT 绕过尝试

id=1 xor xxunion selectxx 拦截

id=1 xor xxunionxxselectxx  不拦截

id=1 xor union(select  不拦截

id=1 xor union(select) 拦截

id=1 xor union dd(select)  不拦截

SELET FROM 绕过测试

id=1 xor s(select xxfrom xx)  拦截

id=1 xor s(select xx from b xx)  不拦截

id=1 xor s(select xx fromxx)拦截

id=1 xor s(select@afrom xx) 拦截

 

id=1 xor s(select@asfrom xx) 不拦截

通过以上测试把union select from 结合在一起并不拦截

百度云加速-套餐版本介绍 xor union dd(select@ \Nfrom xx)

SQL_ByPassWaf_第31张图片

看来成功不远了,接下来构造出正确的SQL语句,发现会被拦截

SQL_ByPassWaf_第32张图片

   构造正确的绕过PAYLOAD

这一步就是构造一个既能绕过WAF防御也能正确执行的SQL PAYLOAD

首先在union前面添加我们fuzz的.1字符,不拦截,这就是一个完全绕过payload,百度云加速防 护能力相对来说偏弱一些,绕过花费不了太多时间。

 

SQL_ByPassWaf_第33张图片 SQL_ByPassWaf_第34张图片

对于SQL注入漏洞利用,有些场合需要用到盲注,盲注当然离不开SQL API的,里面一些常用的函 数也会成为WAF照顾的对象,我们可以在函数名前后添加一些特殊字符或注释进行绕过

SQL_ByPassWaf_第35张图片

 

SQL_ByPassWaf_第36张图片

 

 

对于安全狗和云锁之类的软件,规则本身集成在软件里面,在具备一定的逆向能力的话可以优先考虑  逆向获取到规则进行绕过。在安全狗逆向过程中发现可以利用HOOK API获取规则而不需要完全逆向解密算 法进行规则解密,正好大学时期研究过win32下的各种HOOK技术,翻出旧代码稍加修改改就能派上用场还  是比较满意;云锁是用C#编写没有经过混淆,逆向算法非常简单各位师傅可以自行尝试。对这两种软件类  WAF的规则进行审计发现实现都存在缺陷,对各种数据库类型的注入应该都可以绕过,篇幅所限不一一展开 细说了,绕过payload参考后文。

SQL_ByPassWaf_第37张图片

 

SQL_ByPassWaf_第38张图片 SQL_ByPassWaf_第39张图片

新花:

 

这一小节是部分WAF绕过PAYLOAD,本来计划是完全分享,但是为了避免不必要的麻烦,删除了部分厂商的 绕过PAYLOAD方法大致类似。每种绕过PAYLOAD里面都包含了多个tricks,这里不一一详解各位看官细细 琢磨品尝。

CloudFlare绕过:

cloudflare使用MSSQL PAYLOAD进行测试

SQL_ByPassWaf_第40张图片

UNION SELECT 绕过

 

SQL_ByPassWaf_第41张图片

SELECT FROM 绕过

SQL_ByPassWaf_第42张图片

MYSQL 报错注入绕过

SQL_ByPassWaf_第43张图片 SQL_ByPassWaf_第44张图片

安全狗绕过:

 

SQL_ByPassWaf_第45张图片

云锁绕过:

SQL_ByPassWaf_第46张图片

阿里云绕过:

 

这里只公布部分BYPASS PATYLOAD,完整出数据的PAYLOAD暂不公布,感兴趣的可以根据文章中的 思路和方法进行尝试,相信各位师傅也是可以做得到的。

 

 

SQL_ByPassWaf_第47张图片

利用:

SQL_ByPassWaf_第48张图片

 

SQL_ByPassWaf_第49张图片 SQL_ByPassWaf_第50张图片

 

SQL_ByPassWaf_第51张图片

Tamper样例:

 

SQL_ByPassWaf_第52张图片

 

 

 

 

你可能感兴趣的:(sql,数据库,笔记)