WAF绕过之SQL注入(?归来)
?
Author:?ystart
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?o?set?2
?
???比较表达式代替
【?=?】
if(abs(strcmp((ascii(mid(user()from(1)for(2)))),114))-1,1,0)
?nd_in_set()
?
regexp
【<,>】
least(ord('r'),115)?、greatest(ord('r'),113)
?
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,也是我们需要绕过的主要目标。 |
?
实战:
该小节依据上文战略思想,以真实案例来推演整个绕过过程。
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,百度云加速防?护能力相对来说偏弱一些,绕过花费不了太多时间。
?
对于SQL注入漏洞利用,有些场合需要用到盲注,盲注当然离不开SQL?API的,里面一些常用的函?数也会成为WAF照顾的对象,我们可以在函数名前后添加一些特殊字符或注释进行绕过
?
?
?
对于安全狗和云锁之类的软件,规则本身集成在软件里面,在具备一定的逆向能力的话可以优先考虑??逆向获取到规则进行绕过。在安全狗逆向过程中发现可以利用HOOK?API获取规则而不需要完全逆向解密算?法进行规则解密,正好大学时期研究过win32下的各种HOOK技术,翻出旧代码稍加修改改就能派上用场还??是比较满意;云锁是用C#编写没有经过混淆,逆向算法非常简单各位师傅可以自行尝试。对这两种软件类??WAF的规则进行审计发现实现都存在缺陷,对各种数据库类型的注入应该都可以绕过,篇幅所限不一一展开?细说了,绕过payload参考后文。 |
?
新花:
?
这一小节是部分WAF绕过PAYLOAD,本来计划是完全分享,但是为了避免不必要的麻烦,删除了部分厂商的?绕过PAYLOAD方法大致类似。每种绕过PAYLOAD里面都包含了多个tricks,这里不一一详解各位看官细细?琢磨品尝。 |
CloudFlare绕过:
cloud?are使用MSSQL?PAYLOAD进行测试
UNION?SELECT?绕过
?
SELECT?FROM?绕过
MYSQL?报错注入绕过
安全狗绕过:
?
云锁绕过:
阿里云绕过:
?
这里只公布部分BYPASS?PATYLOAD,完整出数据的PAYLOAD暂不公布,感兴趣的可以根据文章中的?思路和方法进行尝试,相信各位师傅也是可以做得到的。 |
?
?
利用:
?
?
Tamper样例:
?
?
?
?
?