IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 数据库 > MSSQL > SQL Server数据库触发器安全隐患解析

SQL Server数据库触发器安全隐患解析

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

触发器权限和所有权

CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色成员,并且不可转让。

需要的环境

本文需要的环境是已经获取了sql服务器的以上其中一个权限,目的是为了留下隐蔽的后门,不被管理员发现。即使发现了也是加密的(可以破解,不过有些管理员不懂,也不会注意,相关信息google下)。

触发器是在对表进行插入(insert)、更新(update)或删除(delete)操作时,自动执行的存储过程。最常见用于执行敏感数据操作时做历史记录。

本文以动网论坛dvbbs为例,我们已经拿到了db_owner权限(注意:并不是说dvbbs本身有漏洞)。因为只是db_owner权限,所以读者想去执行&xp_cmdshell&,就不再本文范围了,相信读过本文后,只要有系统权限,做个系统的后门也是简单的。先回想一下通常我们使用数据库时要做什么和关心什么。

为什么要使用触发器作后门

管理员首先会把sql文件执行下,然后导入mdb的内容,平时使用顶多备份下,还原下。通常不会有人去看触发器的内容,查看触发器可以使用命令&exec sp_helptrigger 'dv_admin'&,或者在企业管理器中选择&管理触发器&。因为动网根本没有用到触发器,也没有提到触发器,所以动网的管理员不会去看的。于是我们在里面写的内容就相对安全了。

思路

触发器主要是用来做历史记录的,当然可以把管理员更改密码和添加用户的历史记录下。放进一个管理员通常不会注意的、普通用户又可以看到的地方。

动网的密码有md5加过密的,加密的操作是asp程序在服务器上来完成的,等数据库拿到数据的时候已经是加过密的了。但是动网同时把密码以明文方式放入dv_log表中,就给了我们方便。只要拿到dv_log表中l_content字段的内容,然后判断是否管理员在执行敏感操作,后门思路就形成了。

使用过程――代码解析

代码片断:创建触发器。

create trigger dv_admin_history

on Dv_log

with encryption

for insertas

as

触发器需要建立在Dv_log表上,这里放入的是明文密码。我们并不知道管理员密码设置有多长,只能是把里面的有密码的字段内容全部取出。触发器最好是加密的,加密后,管理员即使看到了,也不知道这里是什么东西。在insert(加入)数据时执行触发器。

取出来的值应该放入一个普通用户能看到的地方,这样只要有了普通用户的权限就可以看到密码。动网数据库中,最大并且可以存放数据的字段管理员通常都会看到。所以必须找出来一个管理员不会看,而其他用户也不会注意的地方。

我选择放在一个新建用户的用户信息里(以下通称这个用户为&汪财&,亲切点),这样我们登陆时就可以看到了(注意:登陆时有日志的,记录最后登陆ip,大家自己解决)。

有以下几个字段适于存放:

1、Userphoto,字段类型:varchar(255)。记录了汪财的照片地址。可以存放小于255的数据。

2、Usersign,字段类型:varchar(255)。汪财的签名,如果放这里,汪财就不能发贴了,否则后果自负(发贴会显示签名,地球人都能看到)。

3、Useremail,字段类型:nvarchar(255)。汪财的email,使用时需要转换类型。

4、Userinfo,字段类型:text。汪财的用户资料。该字段很特殊,有很多&&,每一对&&之间都有着不同的含义。动网很懒的,为了避免字段太多,就把一堆信息全都放入一个字段里,用&&分开,当查询某一项信息时,取出来全部,然后分割下,就是需要的数据了。

解决的问题:

1、如果都放满了。

理论上,如果我们看到了第一个字段有了东西,就应该拿笔记下来,然后删除掉。触发器会自动检查大小后继续使用。再次强调下,本文例子针对动网,大家应该具体问题具体分析。

2、管理员的日志中,有很多日志,怎么判断它就是在记录更改密码。

在管理员操作用户时,当然会在&user.asp&或者&admin.asp&中操作,所以我们判断条件需要:

select @passinfo = l_content from inserted where l_type = 1 and (l_touser = 'user.asp' or l_touser = 'admin.asp')

在l_touser为user.asp或者admin.asp时,说明管理员在操作(查看,更新,删除)用户或者管理员。在l_type = 1时,说明执行了更新操作,l_content字段里面有密码(如果管理员更新了密码,或者新建了帐户)。因此,查询inserted表中的l_content,赋值给@passinfo代码片断:更新汪财的usersign字段。

if (len(@usersign) < 150 or @usersign is null)

begin if (@usersign is null)

set @usersign = ' '

set @passinfo = @usersign + @passinfo

update Dv_User set usersign = @passinfo where username = @username

commit tran

returnend

end

首次更新时,usersign字段里没有内容,而SQL Server里null加任何数都是null,所以需要判断is null之后,给null赋值为一个空格。其他几个字段的方法和这里大同小异,只是一个转换nvarchar和&&的组合时多了点。最后判断如果字段内容太多就不再写了,为了提高性能,也可以把最后的判断写在前面,一旦数据过多,就不需要再继续执行了。

首次更新时,汪财的usersign字段里没有内容,而SQL Server里null加任何数都是null,所以需要判断is null之后,给null赋值为一个空格。其他几个字段的方法和这里大同小异,只是一个转换nvarchar和&&的组合时多了点。最后判断如果字段内容太多就不再写了,为了提高性能,也可以把最后的判断写在前面,一旦数据过多,就不需要再继续执行了。

关键词标签:SQL Server,数据库

相关阅读 sql server系统表损坏的解决方法 SQL Server asp.net 数据提供程序连接池 SqlServer2005对现有数据进行分区具体步骤 一个Access数据库数据传递的实例方法 为导入文件加上时间戳标记的两种方法 SQL Server 2005 在不允许远程连接的情况下的破解

文章评论
发表评论

热门文章 sql server系统表损坏的解决方法 sql server系统表损坏的解决方法 SqlServer2005对现有数据进行分区具体步骤 SqlServer2005对现有数据进行分区具体步骤 解决SQL Server中Group无法实现的问题 解决SQL Server中Group无法实现的问题 SQL Server 2005降级到2000的正确操作步骤 SQL Server 2005降级到2000的正确操作步骤 手把手教你学会SQL Server镜像操作 手把手教你学会SQL Server镜像操作 实战手记:让百万级数据瞬间导入SQL Server 实战手记:让百万级数据瞬间导入SQL Server

相关下载

人气排行 配置和注册ODBC数据源-odbc数据源配置教程 如何远程备份(还原)SQL2000数据库 SQL2000数据库远程导入(导出)数据 SQL2000和SQL2005数据库服务端口查看或修改 修改Sql Server唯一约束教程 SQL Server 2005降级到2000的正确操作步骤 sql server系统表损坏的解决方法 浅谈JSP JDBC来连接SQL Server 2005的方法 SQL Server创建表语句介绍 MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系 如何使用SQL Server中的客户端配置工具 SQL Server 分布式查询:OLE DB连接(一)