MSSQL数据文件:实现安全破解

前言

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数据文件时,我们需要注意保护数据文件的安全性,从而避免丢失重要的数据。

数据库标签