简介


MSSQL 2008 R2可以使用MSSQL的审计功能,在每个线上数据库中创建一张蜜罐表,使用审计功能对该表的增删改查操作做监控,MSSQL会将操作日志记录到文件中。

测试


测试使用菜刀马连接数据库,获取数据库的请求如下:

tom=N&z0=GB2312&z1=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:sqlserver://192.168.***.***:1433;databaseName=***;user=sa;password=***&z2=

程序如下:

else if(Z.equals("N")){NN(z1,sb);}

可以看到调用了NN函数

void NN(String s,StringBuffer sb)throws Exception{
Connection c=GC(s);
ResultSet r=c.getMetaData().getCatalogs();
while(r.next()){
sb.append(r.getString(1)+"\t");
}
r.close();
c.close();
}

getMetaData().getCatalogs()表示返回所有的数据库

双击数据库获取表的时候菜刀发送的请求包如下:

tom=O&z0=GB2312&z1=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:sqlserver://192.168.***.***:1433;databaseName=***;user=sa;password=***
kefu&z2=

调用OO(z1,sb);

void OO(String s,StringBuffer sb)throws Exception{
Connection c=GC(s);
String[] t={"TABLE"};
ResultSet r=c.getMetaData().getTables (null,null,"%",t);
while(r.next()){
sb.append(r.getString("TABLE_NAME")+"\t");
}r.close();c.close();}

会调用getTables函数,所执行的sql语句如下:

select
            TABLE_QUALIFIER = convert(sysname,db_name()),
            TABLE_OWNER     = convert(sysname,schema_name(o.schema_id)),
            TABLE_NAME      = convert(sysname,o.name),
            TABLE_TYPE      = convert(varchar(32),
                                        rtrim(substring('SYSTEM TABLE            TABLE       VIEW       ',
                                              (ascii(o.type)-83)*12+1,
                                              12))  -- 'S'=0,'U'=2,'V'=3
                                     ),
            REMARKS = convert(varchar(254),null)    -- Remarks are NULL.

        from
            sys.all_objects o

        where
            o.type in ('S','U','V') and
            has_perms_by_name(quotename(schema_name(o.schema_id)) + '.' + quotename(o.name),
                              'object',
                              'select') = 1 and
            charindex(substring(o.type,1,1),@type1) <> 0 and -- Only desired types.
            (@table_name  is NULL or o.name like @table_name) and
            (@table_owner is NULL or schema_name(o.schema_id) like @table_owner)
        order by 4, 1, 2, 3

has_perms_by_name(quotename(schema_name(o.schema_id)) + ‘.’ + quotename(o.name),’object’,’select’) = 1

会判断数据库是否有select权限,导致触发数据库蜜罐。

PS:
公司DBA使用一款从MSSQL导出数据到MYSQL的工具,点击浏览后同样有可能触发到该告警,产生误报。