当前位置:首页 > 问答 > 正文

mssql数据库权限那些事儿,怎么降权又能偷偷提权操作分享

(引用来源:部分思路参考了网上一些关于数据库权限管理的讨论和渗透测试案例,但具体操作细节是综合描述,请勿在实际环境中尝试)

mssql数据库权限那些事儿,怎么降权又能偷偷提权操作分享

说到mssql数据库的权限,说白了就是谁能在这个数据库里干什么,有的账号只能看看数据,像是个参观者;有的账号能改数据,像是个编辑;还有的账号权力就大了,能创建新账号、删库、执行任何操作,这就是sa(system administrator)账号,相当于数据库的皇帝。

正常情况下,公司为了安全,都会遵循一个叫“最小权限原则”,就是说,给一个账号的权限刚刚好够它完成工作就行,别给太多,比如一个用来做网站报表的账号,只让它有读某些表的权限就够了,没必要让它能删表,这就是“降权”的安全做法。

那怎么给一个账号降权呢?通常数据库管理员(DBA)会这么做:

mssql数据库权限那些事儿,怎么降权又能偷偷提权操作分享

  1. 不用sa账号做日常事情:sa账号权力太大,万一密码泄露或者被坏人利用,整个数据库就完蛋了,所以DBA会创建一些普通账号给日常使用。
  2. 只给必要的权限:比如通过SQL语句,只授予(GRANT)这个账号对某几张表的SELECT(查询)权限,其他的UPDATE(更新)、DELETE(删除)权限一概不给。
  3. 使用数据库角色:mssql自带一些定义好权限集合的角色,比如db_datareader(只能读库裡所有表)、db_datawriter(能增删改库裡所有表),直接把人加到角色里,比一条条分配权限方便。
  4. 限制能登录的服务器:可以设置只允许某个账号从特定的电脑IP地址登录数据库服务器。

这些是正规的“降权”操作,是为了安全,但你这题目里还问了“偷偷提权”,这个就涉及到一些非正常的手段了,通常是一些黑客或者内部人员想搞事情时用的,我必须强调,这些操作在任何未经授权的系统上都是违法的,这里只是说出来让你了解原理,提高防范意识,千万别去试。

“偷偷提权”的核心思路就是,利用现有账号那一点点可怜的权限,像爬梯子一样,一步步拿到更高的权限,最终目标往往是sa的权限,这个过程也叫“权限提升”。

怎么操作呢?举几个可能的例子:

利用存储过程提权

mssql数据库权限那些事儿,怎么降权又能偷偷提权操作分享

有些账号可能权限不高,但它被允许执行(EXECUTE)一些系统自带的存储过程(可以理解为数据库里的预置程序),有些存储过程本身功能很强大,如果设计不当或者配置有误,就可能被利用。

有一个很经典的存储过程叫xp_cmdshell,这个玩意儿厉害了,它允许在数据库服务器上直接执行操作系统命令,想象一下,如果你的数据库账号能执行这个,那你就不再是在玩数据库了,你是在操作那台服务器电脑了!你可以用命令创建系统用户,把自己加到管理员组,那还有什么数据库权限是你拿不到的?

稍微有点安全意识的管理员都会把这个功能关掉(禁用),但攻击者可能会先想办法把它打开,如果当前账号有足够的权限(比如db_owner,数据库的所有者),可能直接用SQL语句就能重新启用它,如果权限不够,可能会尝试其他方法。

利用触发器或作业提权

mssql数据库权限那些事儿,怎么降权又能偷偷提权操作分享

mssql有个功能叫“作业”(Job),可以定时执行一些任务,还有个叫“触发器”(Trigger),就是在你对数据做增删改时自动执行一段代码,如果攻击者能往这些地方插入恶意的代码,而执行作业或触发器的账号权限又很高(比如默认用sa的权限来跑),那么当条件满足时,恶意代码就会以高权限执行,攻击者就提权成功了。

这需要攻击者先有权限去创建或修改作业和触发器,通常这需要不小的权限,但有时候管理疏忽可能会留下漏洞。

利用漏洞或弱口令

这个就更直接了,如果mssql数据库软件本身存在安全漏洞(比如某个版本有个著名的漏洞),攻击者可能不需要多高的权限,直接利用漏洞就能拿到系统权限,或者,万一sa账号的密码设得特别简单,像“123456”这种,攻击者直接猜出来,那就一步到位,啥提权操作都省了。

怎么防范呢?

知道了这些“骚操作”,防范起来就有针对性了:

  1. 坚决贯彻最小权限原则:给账号的权限能少就少。
  2. 禁用不必要的功能:像xp_cmdshell这种危险的东西,不用就彻底关掉。
  3. 定期打补丁:及时更新mssql的补丁,修复已知漏洞。
  4. 用强密码:sa账号的密码一定要又长又复杂。
  5. 审计和监控:经常看看数据库的日志,有没有人在执行一些奇怪的命令,尤其是尝试启用敏感功能或者执行系统命令的。

数据库权限管理就是个猫鼠游戏,安全人员想着怎么把权限锁紧,而有些人总在琢磨怎么找到缝隙钻进去,了解这些“提权”的思路,不是为了让你去干坏事,而是让你明白安全的重要性,知道该怎么更好地保护自己的数据库。