SQL_ByPassWaf

发布时间:2024年01月17日

WAF绕过之SQL注入(?归来)

?

Author:?ystart

Team:?ms509

Date:2020/5

前言:

?

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

?

?

e35553875d2c4028864717d0bc63e41a.png

正文:

?

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

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

d90ce4803d694bf281fde5c9a817cef9.png

老树:

这一部分是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 的点。

【?+?】号:

171cba74edaa4421bcec4f6fee22897c.png

【-?】号:

?

8909c3d1cca846b6846076314200d39c.png

【@】号:

5658a7ac7c4a44ec872d108beadc3ee1.png

【!】号:

91572e2262264a03a19882fc9ba362c8.png

【?‘?】号:

1abc87fedb074eb89054a58a3d0a78c8.png

【?“?】号:

bc20083ccd044485849bfe7e17705b93.png

【?~?】号:

?

a44f4241e6634e46b00eb5196fa065f7.png

【{】号:

fd828fcb02854c3d9d33c7e5e62821a0.png

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

bfe580b5739943429f6d0a614372b824.png 63bb40716c1c49e4a08ac14f6a40bdad.png

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

● ????Oracle11:

566ee9d5d9a2477091513edd2a70f3c2.png

?

???MSSQL?:

05103f4243fe4fbd98ee7e53d2f43e6c.png

等价替换:

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

???函数替换

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

433251708dd547f8ac309aba5a950f14.png

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

20cf3d0aad454052a5eadaa07faabb8a.png

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

?

7c3ce63c650f49bfa402458d739ec98f.png

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

736291ae2f8f4b94a4c3840c6eea7ec6.png

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

b15aba7e7a5b4e54848a0b3904e23f65.png

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

?

346a170048034fe58f31005347f1e40d.png

?

???逗号过滤

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

case?when?代替if

b27c253dfac24764954cbc7c6960f79a.png

union?select?1,2,3?<=>

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

2702c3385d2540edae9a9c60c34a8692.png

limit?2,1?<=>limit?1?o?set?2

?

bfbd0516692a47d8ab6cb81b975a34fd.png

???比较表达式代替

【?=?】

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

8bbdba4724d2481aa1aa682117d0a559.png

?nd_in_set()

?

eee976472ebf43518bbe551b3367c3ec.png

regexp

c26eda7d667948fe802755a15b71de80.png

【<,>】

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

?

35022c0b70b14084b54e9a06758bafaa.png

between?n?and?m

e2fca4e13e8a4d2b8d224be491311c62.png

核心:

?

这部分内容是本文的核心部分,在我看来是文章的灵魂吧,除了技巧方法外,还有一些思想指导,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】语句拦截

战略:

30543cae1ff44da4bf89bc0fbc526da5.png

?

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

7a1f055d1cd44d17a93f87d90f5db072.png

???本地FUZZ?PAYLOAD

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

?

4c6c13559cbc4ef3be39b41edad1cbe0.png

???关键字前后填充字符测试

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)

8f15d20c47b34c7f98affcc314e54e72.png

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

d73408a2c24a429695086f52a6d70b5d.png

???构造正确的绕过PAYLOAD

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

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

?

14ff1582b1fa478babd88c0b16213365.png ee3940d8dc2641f4a8b505149317af14.png

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

cb089f06cd874053aba24b3c2d1caf87.png

?

018a22c0497f4be9aebfc89129783bdc.png

?

?

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

d50a2170a3f04ffaa37581e3086b7ec1.png

?

3132b112fc924a52be89a02075d310a4.png ff176f37415648de903ddeeb8bb945c7.png

新花:

?

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

CloudFlare绕过:

cloud?are使用MSSQL?PAYLOAD进行测试

0c0467fe5d5a45e7a609b865113c8535.png

UNION?SELECT?绕过

?

72ddea5c50a8439681c287e95e8dd0da.png

SELECT?FROM?绕过

68969a8a5d6c4fb98ab3c5b2ab0f4ddb.png

MYSQL?报错注入绕过

a2620ed3811a4fd8ba06dcb765469816.png e2d765e31fde4c55994246193172b761.png

安全狗绕过:

?

fd8b69baabad42ad911a46472a736275.png

云锁绕过:

44c4a8bf94bc45abb50230c41853daf3.png

阿里云绕过:

?

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

?

?

0b0621e6f9364aa798b1992371090fdd.png

利用:

3ee3fe5cd4194899b18dc41dcc1465c7.png

?

f318a523e30246a482b0df2771f9f4c7.png aef5ecde516e4e41bd31a0a33bcfc414.png

?

aad6d8d53c4d41fe99c2afe5dfeed3bd.png

Tamper样例:

?

878959ce2d294c838ce22708317b4977.png

?

?

?

?

文章来源:https://blog.csdn.net/m0_62207482/article/details/135584876
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。