前言
MSSQL是一个由Microsoft开发的关系型数据库管理系统。在MSSQL中,数据以文件的形式存储在磁盘上。由于一些原因,有时我们需要对这些数据文件进行破解操作。在本文中,我们将会介绍如何进行MSSQL数据文件的安全破解操作。
了解MSSQL数据文件
1. 文件类型
在MSSQL中,数据文件主要有MDF(主数据文件)和LDF(日志文件)两种类型。MDF文件保存着数据库的一切内容,包括表、视图、存储过程、触发器、函数等,而LDF文件则记录着MDF文件的更改操作,确保数据的完整性和安全性。
除此之外,还有NDF(次要数据文件)类型,用于扩展MDF文件存储数据的容量。
2. 文件结构
MSSQL数据文件由一个或多个数据库文件组成。数据库文件包括主要的数据文件以及一些辅助的数据文件。
主要的数据文件MDF是一个逻辑文件,它定义了数据库的数据结构。在MDF文件中,数据按照一定的格式被分成多个数据页进行存放。每个数据页的大小默认为8KB。MDF文件结构如下所示:
-- MDF文件结构:
[文件头]
[数据文件头]
[分配页]
[数据页1]
[数据页2]
......
[数据页n]
其中,数据文件头主要是存储了数据分页相关的信息,包括页的数量、每个数据页的大小等;分配页是记录了每个数据页是否已经分配给某个对象,如表、索引等;数据页1到n则是真正存放数据的地方。
实现MSSQL数据文件的安全破解
1. 破解MDF文件密码
如果某个MDF文件被设置了访问密码,那么我们需要进行破解操作才能打开此文件。下面是破解MDF文件密码的操作步骤:
使用SQL Server Managment Studio创建登记表
CREATE TABLE [dbusers] ([user] varchar(50), [pass] varchar(50))
用于记录复杂密码用于登录MSSQL数据文件的用户名和密码。
使用SQL Server Managment Studio导出密码哈希值
先停止目标MSSQL数据文件相关服务,在SQL Server Configuration Manager(SQLServer服务配置)里面停止Microsoft SQL Server服务。
编辑目标MSSQL数据文件的注册表(打开regedit.exe),找到MSSQL Server实例的名称,通常是一个GUID字符串,路径如下:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\InstanceName
将InstanceName\StackKeys\SQLPATH \[DatabaseName\]中LDKeyEntry_xxx子键名下的Ldib加密密钥导入到加密密钥表中,路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[InstanceName]\MSSQLServer\TDS\CurrentVersion\Encryption\SymmetricKeys
打开SQL Server Management Studio,连接目标MSSQL实例,运行下面代码,将使用ASymmetricKey加密密码——“openSesame”:
CREATE SYMMETRIC KEY SQLpassword
WITH ALGORITHM = AES_256
ENCRYPTION BY ASYMMETRIC KEY SQLpassword_AKey
GO
CREATE DATABASE C:\MSSQLServer\data\mydb.mdf
ON
( NAME = mydb_dat,
FILENAME = 'C:\MSSQLServer\data\mydb.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = mydb_log,
FILENAME = 'C:\MSSQLServer\data\mydb.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )
GO
USE mydb
GO
CREATE TABLE creds (user varchar(255), secret varbinary(2048))
GO
INSERT INTO creds VALUES('admin', ENCRYPTBYKEY(KEY_GUID('SQLpassword'), 'openSesame'))
GO
使用SQL Server Managment Studio破解密码
运行下面的代码,依次遍历前面生成的用户密码登记表([master.tbl_users])中的所有行,查找包含有效密码的用户:
CREATE FUNCTION decrypt_pass(@pvar varbinary(512))
RETURNS varchar(128) AS
BEGIN
DECLARE @k int = 1 -- index var
DECLARE @d int -- result length
DECLARE @r varchar(128) -- result string
DECLARE @n int -- index var
DECLARE @c int -- the byte being decrypted
DECLARE @i8 int -- input block index
DECLARE @iv varbinary(16) -- initialization vector
DECLARE @tmp varbinary(16) -- temporary working block
DECLARE @key varbinary(32) = CONVERT(varbinary(32), '01234567890123456789012345678901')
-- KEY, USE THE KEY USED TO CREATE THE SYMMETRIC KEY
SET @iv = CONVERT(varbinary(16), 'abcd1234efgh5678')
SET @d = 0
SET @r = ''
SET @n = 16
SET @i8 = 16
WHILE @k = 1 AND @n > 0
BEGIN
SET @tmp = SUBSTRING(@pvar, @d + 1, 16)
SET @n = @@ROWCOUNT
IF @n = 0
BEGIN
SET @k = 0
CONTINUE
END
-- reverse the order of the bytes
SET @tmp = CONVERT(varbinary(16), REVERSE(CONVERT(varchar(16), @tmp, 2)))
-- decrement the input block index, index starts at 16
SET @i8 = @i8 - 1
-- use the input block index to replace the last byte of the IV
SET @iv = SUBSTRING(@iv, 1, 15) + CHAR(@i8 & 255)
-- reorder the bytes in the IV
SET @iv = CONVERT(varbinary(16), REVERSE(CONVERT(varchar(16), @iv, 2)))
-- use the symmetric key to decrypt the block
SET @tmp = DECRYPTBYKEY(KEY_GUID('SQLpassword'), @tmp, 1, @iv)
SET @r = @r + CONVERT(varchar(max), @tmp)
SET @d = @d + 16 -- increment the index var
END
RETURN @r
END
GO
最后运行下面代码解密密码:
SELECT [user], dbo.decrypt_pass([pass]) AS [pass] FROM dbusers
2. 破解LDF文件
破解LDF文件与破解MDF文件略有不同。由于LDF文件是记录MDF文件的更改历史,因此我们需要还原历史数据,从而可以得到原始数据。下面是破解LDF文件的操作步骤:
使用SQL Server Managment Studio还原LDF文件
我们可以通过SQL Server Managment Studio的还原向导对LDF文件进行还原操作,还原出LDF文件的所有更改历史。
分析LDF文件更改历史
还原后的LDF文件可以用某些工具进行分析,如ApexSQL Log、LDF Viewer等。这些工具可以帮助我们快速找到需要的数据。
导出数据
根据分析结果,我们可以将需要的原始数据导出成SQL脚本,导入到新的MSSQL数据文件中。
结论
MSSQL数据文件的安全破解操作需要依赖一些专业工具和复杂的操作步骤,但在必要的情况下,这些操作是不可避免的。因此,在使用MSSQL数据文件时,我们需要注意保护数据文件的安全性,从而避免丢失重要的数据。