加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer 安全加固:拒绝角色public使用扩展存储过程

发布时间:2020-12-12 13:26:40 所属栏目:MsSql教程 来源:网络整理
导读:当创建一个任意类型的登录账号是,sql server 默认会授予public服务器角色,或者数据库角色,并且不能撤销该角色。而public权限非常多,大部分是查询元数据的权限,其他还可以读取操作系统的各种信息!所以sql server?一个普通的账号,都可以获取所有数据库

当创建一个任意类型的登录账号是,sql server 默认会授予public服务器角色,或者数据库角色,并且不能撤销该角色。而public权限非常多,大部分是查询元数据的权限,其他还可以读取操作系统的各种信息!所以sql server?一个普通的账号,都可以获取所有数据库和操作系统信息了!


当前主要是禁用几个扩展存储过程的权限。

--查看当前授予的执行扩展存储过程的角色/用户
use master
go
SELECT A.name,schema_name(A.schema_id) [schema],A.type,b.permission_name,B.type,B.state_desc,C.name,c.type_desc
FROM sys.all_objects AS A  
INNER JOIN sys.database_permissions AS B ON B.major_id=A.object_id AND B.minor_id=0 AND B.class=1  
INNER JOIN sys.database_principals AS C ON C.principal_id = B.grantee_principal_id  
where B.type = 'EX' AND A.name LIKE 'XP_%' 
ORDER BY A.name

--主要几个扩展存储过程,是什么功能呢?
xp_dirtree
xp_fileexist
xp_fixeddrives
xp_getnetname
xp_grantlogin
xp_instance_regread
xp_MSADEnabled
xp_msver
xp_qv
xp_regread
xp_repl_convert_encrypt_sysadmin_wrapper
xp_replposteor
xp_revokelogin
xp_sprintf
xp_sscanf
xp_sqlagent_enum_jobs
xp_sqlagent_is_starting
xp_sqlagent_notify

-------------------------
-------------------------
--xp_dirtree :列出某磁盘下所有文件夹
EXEC master.sys.xp_subdirs 'D:' 
EXEC master.sys.xp_dirtree 'D:',1 --depth 

--xp_fileexist :目录或者文件是否存在 
EXEC master.sys.xp_fileexist 'D:$RECYCLE.BIN' 

--xp_fixeddrives : 获取磁盘的可用容量.  
EXEC master.sys.xp_fixeddrives  

--xp_getnetname : 获取SQL服务器的名称.  
EXEC master.sys.xp_getnetname 

--xp_grantlogin : 授予windows用户或组权限(sysadmin)
EXEC master.sys.xp_grantlogin @loginame = N'NT AUTHORITYSYSTEM',@logintype = N'admin'

--xp_instance_regread : 读取注册表
DECLARE @dir NVARCHAR(4000) 
EXEC master.sys.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',N'SoftwareMicrosoftMSSQLServerSetup',N'SQLPath',@dir output
SELECT @dir

--xp_MSADEnabled : (未知????)

--xp_msver : SQL Server 的版本信息
EXEC master.sys.xp_msver

--xp_qv : (未知????; 参考: sp_sysutility_mi_validate_enrollment_preconditions / sp_sqlagent_get_startup_info)

--xp_regread : 读取注册表
DECLARE @dir1 NVARCHAR(4000) 
EXEC master.sys.xp_regread 
    N'HKEY_LOCAL_MACHINE',@dir1 output
SELECT @dir1

--xp_repl_convert_encrypt_sysadmin_wrapper : 请求证书签名(未知????)
DECLARE @MK INT
EXEC @MK=master.sys.xp_repl_convert_encrypt_sysadmin_wrapper @password = N''
SELECT @MK

--xp_replposteor : (未知????)

--xp_revokelogin : 删除windows用户或组账户
EXEC master.sys.xp_revokelogin @loginame = N'NT AUTHORITYSYSTEM'

--xp_sprintf :设置一系列字符和值的格式并将其存储到字符串输出参数中
DECLARE @string varchar (255)
EXEC master.sys.xp_sprintf @string OUTPUT,'INSERT INTO %s VALUES (%s,%s)','tab','1','''kk'''
PRINT @string

--xp_sscanf : 将数据从字符串读入每个格式参数所指定的参数位置
DECLARE @filename varchar (20),@message varchar (20),@name varchar (20)
EXEC master.sys.xp_sscanf 'sync -b -fauthors10.tmp -rrandom 123','sync -b -f%s -r%s 1%s',@filename OUTPUT,@message OUTPUT,@name OUTPUT
SELECT @filename,@message,@name

--xp_sqlagent_enum_jobs : 作业运行状态  (参考: sp_get_composite_job_info/sp_syscollector_get_collection_set_execution_status )
EXEC master.sys.xp_sqlagent_enum_jobs 1,'sa'

--xp_sqlagent_is_starting : 代理是否运行(返回都为0,似乎无效,参考:sp_is_sqlagent_starting)
DECLARE @retval INT
EXEC master.sys.xp_sqlagent_is_starting @retval OUTPUT
SELECT @retval

--xp_sqlagent_notify : (参考: sp_sqlagent_notify/sp_attach_schedule/sp_add_jobschedule  )

拒绝public权限使用前6个! 未知的还是暂时不禁用.

xp_dirtree :列出某磁盘下所有文件夹
xp_fileexist :目录或者文件是否存在?
xp_grantlogin : 授予windows用户或组权限(sysadmin)
xp_instance_regread : 读取注册表
xp_regread : 读取注册表
xp_revokelogin : 删除windows用户或组账户

xp_MSADEnabled : (未知????)
xp_qv : (未知????
xp_repl_convert_encrypt_sysadmin_wrapper : 请求证书签名(未知????)
xp_replposteor : (未知????)


--生成脚本执行!不回收权限,给予拒绝(deny)权限,以后可方便知道更改了哪些.
use master
GO
SELECT A.name,'DENY '+b.permission_name COLLATE Chinese_PRC_CI_AS +' ON '+A.name+' TO '+C.name
FROM master.sys.all_objects AS A  
INNER JOIN master.sys.database_permissions AS B ON B.major_id=A.object_id AND B.minor_id=0 AND B.class=1  
INNER JOIN master.sys.database_principals AS C ON C.principal_id = B.grantee_principal_id  
where B.type = 'EX' AND A.name IN('xp_dirtree','xp_fileexist','xp_grantlogin','xp_instance_regread','xp_regread','xp_revokelogin')
ORDER BY A.name  
GO


--查看更多!
SELECT A.name,C.name
FROM master.sys.all_objects AS A  
LEFT JOIN master.sys.database_permissions AS B ON B.major_id=A.object_id AND B.minor_id=0 AND B.class=1  
LEFT JOIN master.sys.database_principals AS C ON C.principal_id = B.grantee_principal_id  
ORDER BY A.name  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读