WAF绕过之SQL注入( 归来)
Author:flystart
Team: ms509
Date:2020/5
前言:
WAF(Web Application Firewall)对于从事信息安全领域的工作者来说并不陌生,在渗透测试一 个目标的时候常常作为拦路虎让人头痛不已,笔者这段时间花了些精力对国内外比较常见的WAF进行了绕过 研究,这只拦路虎其实也并没有想象中那么可怕。本文从SQL语法层面入手,以国内外主流 waf为研究测试 对象,借助fuzz、逆向等各种技术手段,挖掘组合各种SQL功能语法,无视操作系统、中间件、计算机语言 等差异硬杠WAF,欢迎私信交流。 |
WAF(Web Application Firewall)的中文名称叫做“Web应用防火墙 ”,根据不同的分类方法可分 为很多种,从产品形态上来划分主要分为三大类:硬件类(绿盟、天融信、安恒的硬件waf)、软件类(安 全狗、云锁、ModSecurity等)、基于云的waf(阿里云、创宇盾等)。软件类waf和云waf是本文的主角。 安全策略和规则可以说是waf的灵魂,我们所说的绕waf就是无视他的策略和规则达到攻击成功的目的。 |
老树:
这一部分是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 的点。
【 + 】号:
【- 】号:
【{】号:
当然除以上字符,也可结合注释符-- 、/*、空白字符等。
不仅仅mysql有这类的语法特性, mssql 、oracle同样支持,这里就不一一介绍大家可以自行fuzz尝试
● Oracle11:
MSSQL :
等价替换:
waf会对一些常见的攻击语句进行拦截,这个时候我们不一定非得正面硬杠,可以挖掘寻找一些生僻的 具有相同功能的语句进行代替替换,这也是绕waf的常用手段。以下部分是对SQL查询表达式、函数等 其他查询语句等价功能的一个总结,有些来自互联网,有些是自己的研究。
函数替换
截取字符串是SQL注入利用技术里面的常用功能,通常使用mid(string,1,1)
|substr(user() from 1 for 1);|
|replace(LPAD(user(),2,1),LPAD(user(),2-1,1),"");|
|LPAD(REVERSE(TRIM( lpad(user(),1,SPACE(1)) )),1,SPACE(1);|
ascii(c) 、ord(c) <=> conv(hex(c),16,10)
对于函数过滤的情况可以通过官方文档所有API函数,使用index.php?id=1 xor user()进行fuzz,以下是 百度云 fuzz的结果
逗号过滤
有时候逗号也会被waf拦截或过滤,可以通过不含引号的SQL语句代替
case when 代替if
union select 1,2,3 <=>
union select * from (select 1)a join (select 2)b join (select 3)c
limit 2,1 <=>limit 1 offset 2
between n and m
核心:
这部分内容是本文的核心部分,在我看来是文章的灵魂吧,除了技巧方法外,还有一些思想指导,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注入根据分类方法不同可分为不同的类型,从SQL注入漏洞利用角度来说,一般有五种注入利用方 法,分别是报错注入、联合查询注入、布尔盲注、延时注入、堆查询注入。无论那种注入方式,利用 payload都可以分为两部分构成,对应的利用语句(BOUNDARY)和基本查询(QUERY)比如报错注入语句: 【updatexml(1,(select concat(0x7e,user,0x7e) from mysql.user limit 1),1)】蓝色圈起 来的报错语句就是BOUNDARY,红色圈起来的部分就是QUERY,也是我们需要绕过的主要目标。 |
实战:
该小节依据上文战略思想,以真实案例来推演整个绕过过程。
目标: 百度云加速-CDN、网站攻击防护、SEO优化工具
1.本地FUZZ PAYLOAD
2.关键字前后填充字符测试
3.构造正确的绕过PAYLOAD
本地FUZZ PAYLOAD
FUZZ 字符除了【0-255】全字符外,也可以添加自己收集的一些tricks进行FUZZ {FUZZ}UNION SELECT fuzz的一些结果
关键字前后填充字符测试
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语句,发现会被拦截
构造正确的绕过PAYLOAD
这一步就是构造一个既能绕过WAF防御也能正确执行的SQL PAYLOAD
首先在union前面添加我们fuzz的.1字符,不拦截,这就是一个完全绕过payload,百度云加速防 护能力相对来说偏弱一些,绕过花费不了太多时间。
对于安全狗和云锁之类的软件,规则本身集成在软件里面,在具备一定的逆向能力的话可以优先考虑 逆向获取到规则进行绕过。在安全狗逆向过程中发现可以利用HOOK API获取规则而不需要完全逆向解密算 法进行规则解密,正好大学时期研究过win32下的各种HOOK技术,翻出旧代码稍加修改改就能派上用场还 是比较满意;云锁是用C#编写没有经过混淆,逆向算法非常简单各位师傅可以自行尝试。对这两种软件类 WAF的规则进行审计发现实现都存在缺陷,对各种数据库类型的注入应该都可以绕过,篇幅所限不一一展开 细说了,绕过payload参考后文。 |
新花:
这一小节是部分WAF绕过PAYLOAD,本来计划是完全分享,但是为了避免不必要的麻烦,删除了部分厂商的 绕过PAYLOAD方法大致类似。每种绕过PAYLOAD里面都包含了多个tricks,这里不一一详解各位看官细细 琢磨品尝。 |
CloudFlare绕过:
cloudflare使用MSSQL PAYLOAD进行测试
UNION SELECT 绕过