發現網站數據庫被惡意創建 D99_CMD、D99_Tmp 等可疑表,除代碼層面修復注入漏洞外,**數據庫層面收回公共用戶的 CREATE TABLE 權限**是快速止血的關鍵。本文演示 SQL Server 2000 企業管理器與 T-SQL 兩種方式禁止指定用戶建表。
web_user)擁有 db_ddladmin 或 db_owner 角色,可任意建表/改結構。CREATE TABLE ...,植入惡意結構、竊取數據、甚至提權。SELECT/INSERT/UPDATE/DELETE/EXEC(執行存儲過程),**嚴禁 DDL 權限**。jb51net)→ 「屬性」。web_user 或 public 角色)。-- 1. 創建專用數據庫角色(若不存在)
IF NOT EXISTS (SELECT * FROM sysusers WHERE name = 'web_app_role' AND issqlrole = 1)
EXEC sp_addrole 'web_app_role';
GO
-- 2. 授予最小 DML 權限(按表粒度更安全,此處示例庫級)
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON DATABASE::jb51net TO web_app_role;
-- 或針對具體表:
-- GRANT SELECT, INSERT, UPDATE, DELETE ON dbo.Orders TO web_app_role;
-- 3. 明確拒絕 DDL 權限(拒絕優先於授予)
DENY CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE FUNCTION,
ALTER ANY SCHEMA, BACKUP DATABASE, BACKUP LOG TO web_app_role;
GO
-- 4. 將 Web 連接用戶加入角色
EXEC sp_addrolemember 'web_app_role', 'web_user';
GO
-- 5. 移除用戶原有的高權限角色(如 db_ddladmin, db_owner)
EXEC sp_droprolemember 'db_ddladmin', 'web_user';
EXEC sp_droprolemember 'db_owner', 'web_user';
GO
-- 使用 Web 賬戶上下文測試 EXECUTE AS USER = 'web_user'; GO CREATE TABLE dxytmp (name VARCHAR(255), id INT); -- 預期失敗 GO REVERT; GO
預期報錯:「許可權被拒絕,無法在數據庫 'jb51net' 中創建表 'dxytmp'。」 即配置生效。
sa、重命名 sa、限制 sa 登錄 IP。CREATE/ALTER/DROP 的異常請求。權限收口是資料庫安全的最後一道防線,**「只給幹活的權限,不給搞破壞的權限」**。