Hack dữ liệu đã mã hoá bởi mật khẩu

Mã hóa dữ liệu bằng MsSql
Phần 1: Mã hóa
Phần 2: Giải mã

Trong phần 1  của loạt bài này, chúng tôi đã giới thiệu phương pháp mã hoá và giải mã bằng mật khẩu. Phần 2 này sẽ đi vào cách hack lại dữ liệu đó.
Bước 1
Mã hoá dữ liệu theo phương pháp mã hoá bằng mật khẩu

select EncryptedData = EncryptByPassPhrase('MAK', '123456789' )
--EncryptedData
--------------------------------------------------------------------------
0x01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC

Bước 2
Tạo thủ tục sử dụng để khôi phục lại dữ liệu đã má hoá. Thủ tục này sẽ sử dụng hàm DecryptByPassPhrase để giải mã dữ liệu và hiển thị lên mật khẩu.

USE [Master]
GO
/****** Object: StoredProcedure

[dbo].[hack_encryption] Script Date: 12/18/2007 18:18:36 ******/
IF EXISTS (SELECT * FROM sys.objects

WHERE object_id = OBJECT_ID(N'[dbo].[hack_encryption]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[hack_encryption]
GO
set nocount on
SET CONCAT_NULL_YIELDS_NULL OFF
go
USE [Master]
GO

/****** Object:  StoredProcedure

[dbo].[hack_encryption] Script Date: 12/18/2007 18:18:55 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE procedure [dbo].[hack_encryption] @encryptedtext varbinary(max)
as
declare @password varchar(6)
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n int


set @i=-1
set @j=-1
set @k=-1
set @l=-1
set @m=-1
set @n=-1
set @password =''

while @i<255
begin
   while @j<255
   begin
       while @k<255
       begin
            while @l<255
            begin
            while @m<255
            begin
               while @n<=255
               begin
               set @password=isnull(char(@i),'') 
                   + isnull(char(@j),'')
                   +isnull(char(@k),'')+ isnull(char(@l),'')
                   +isnull(char(@m),'') + isnull(char(@n),'')
                   if convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),
                  @encryptedtext)) is not null
               begin
                print 'This is the Encrypted text:' +@password
               set @i=256;set @j=256;set @k=256;set @l=256;set @m=256;set @n=256;
               print 'The actual data is :' +convert(varchar(100),
               DecryptByPassPhrase(ltrim(rtrim(@password)), @encryptedtext)) 
               end
               --print 'A'+ltrim(rtrim(@password))+'B'
               --print convert(varchar(100),
                 DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
              set @n=@n+1
              end
              set @n=0
              set @m=@m+1
            end
          set @m=0
          set @l=@l+1
          end
       set @l=0
       set @k=@k+1
       end
   set @k=0
   set @j=@j+1
   end
set @j=0
set @i=@i+1
end
GO

Bước 3
Giả sử rằng bạn đã quên mật khẩu dùng để mã hoá dữ liệu thành
“0x01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC”.
Chúng ta có thể truy tìm lại được mật khẩu và dữ liệu đã bị mã hoá bằng thủ tục sau

use master
go
select getdate() as StartingTime
go
declare @myencryptedtext varbinary(max)
set @myencryptedtext=
0x01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC
print @myencryptedtext
exec hack_encryption @encryptedtext=@myencryptedtext
go
select getdate() as EndingTime
go

Như bạn thấy trong kết quả (hình trên), nó chỉ cần đển 2 phút để tìm lại được dữ liệu và mật khẩu. Về cơ bản, thủ tục này lặp lại tất cả khả năng hợp lý có thể xảy ra của các ký tự ASCII có độ dài trên 6 ký tự để tìm ra mật khẩu và sử dụng nó để giải mã dữ liệu.

Tạo ra một thủ tục sẽ không giúp gì nhiều khi dữ liệu đã được mã hoá nằm trong một bảng. Vì vậy chúng ta phải thay đổi thủ thục này thành một hàm vô hướng như hướng dẫn dưới đây

Bước 1

Tạo thủ tục như sau

USE [master]
GO

/****** Object:  UserDefinedFunction

[dbo].[hack_encryption_password] Script Date: 12/18/2007 18:36:29 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[hack_encryption_password]')
   AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[hack_encryption_password]
GO
use [Master]
go

CREATE function [dbo].[hack_encryption_password] (@encryptedtext varbinary(max))
returns varchar(6)
with execute as caller
as
begin
declare @password varchar(6)
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n int


set @i=-1
set @j=-1
set @k=-1
set @l=-1
set @m=-1
set @n=-1
set @password =''

while @i<255
begin
    while @j<255
    begin
        while @k<255
        begin
            while @l<255
            begin
                while @m<255
                begin
                    while @n<=255
                    begin
                    set @password=isnull(char(@i),'') + isnull(char(@j),'')
                    +isnull(char(@k),'')+ isnull(char(@l),'')
                    +isnull(char(@m),'') + isnull(char(@n),'')
                    if convert(varchar(100),

                    DecryptByPassPhrase(ltrim(rtrim(@password)),
                       @encryptedtext)) is not null
                    begin
                    --print 'This is the Encrypted text:' +@password
                    set @i=256;set @j=256;set @k=256;set @l=256;set @m=256;set @n=256;
                    --print 'The actual data is :' +convert(varchar(100),
                        DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
                    end
                    --print 'A'+ltrim(rtrim(@password))+'B'
                    --print convert(varchar(100),DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
                    set @n=@n+1
                    end
                set @n=0
                set @m=@m+1
                end
            set @m=0
            set @l=@l+1
            end
        set @l=0
        set @k=@k+1
        end
    set @k=0
    set @j=@j+1
    end
set @j=0
set @i=@i+1
end

return @password
END

Bước 2
Tạo một bảng với dữ liệu được mã hoá

USE [tempdb]
GO
/****** Object: Table [dbo].[MyTable] Script Date: 12/18/2007 18:44:40 ******/
IF EXISTS (SELECT * FROM sys.objects

WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
DROP TABLE [dbo].[MyTable]
GO
create table MyTable(id int, encrypteddata varbinary(max))
go
insert into MyTable select 1, EncryptByPassPhrase('Do', '1112228333')
insert into MyTable select 2, EncryptByPassPhrase('Re', '1212223833')
insert into MyTable select 3, EncryptByPassPhrase('Me', '1132223393')
insert into MyTable select 4, EncryptByPassPhrase('Fa', '1114223383')
insert into MyTable select 5, EncryptByPassPhrase('So', '1112523333')
insert into MyTable select 6, EncryptByPassPhrase('La', '1112263373')
insert into MyTable select 7, EncryptByPassPhrase('Si', '1112227338')
go

Bước 3

Truy vấn dữ liệu sử dụng câu lệnh SQL sau

Select * from MyTable

Bạn sẽ thấy dữ liệu hiển thị như sau

Bước 4
Sử dụng hàm hack_encryption_password để khôi phục tất cả các mật khẩu từ dưc liệu đã được mã hoá trong bảng MyTable. Thực thi câu lệnh SQL sau

select ID ,master.[dbo].[hack_encryption_password] (encrypteddata) as Password from MyTable

Bạn sẽ thấy kết quả như sau

Hàm trên có thê được chỉnh sửa để trả về cả dữ liệu đã được mã hoá, thực hiện như sau

Bước 1

Tạo hàm sau

USE [master]
GO

/****** Object:  UserDefinedFunction

[dbo].[hack_encryption_password]    Script Date: 12/18/2007 18:36:29 ******/
IF  EXISTS (SELECT * FROM sys.objects 

WHERE object_id = OBJECT_ID(N'[dbo].[hack_encryption_data]')
    AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[hack_encryption_data]
GO
use [Master]
go

CREATE function [dbo].[hack_encryption_data] (@encryptedtext varbinary(max))
returns varchar(8000)
with execute as caller
as
begin
declare @data varchar(8000)
declare @password varchar(6)
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n int


set @i=-1
set @j=-1
set @k=-1
set @l=-1
set @m=-1
set @n=-1
set @password =''

while @i<255
begin
    while @j<255
    begin
        while @k<255
        begin
            while @l<255
            begin
                while @m<255
                begin
                    while @n<=255
                    begin
                    set @password=isnull(char(@i),'') + isnull(char(@j),'')+isnull(char(@k),'')
                    + isnull(char(@l),'')+isnull(char(@m),'') + isnull(char(@n),'')
                    if convert(varchar(100),DecryptByPassPhrase(ltrim(rtrim(@password)),
                       @encryptedtext)) is not null
                    begin
                    --print 'This is the Encrypted text:' +@password
                    set @i=256;set @j=256;set @k=256;set @l=256;set @m=256;set @n=256;
                    set @data = convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
                    end
                    --print 'A'+ltrim(rtrim(@password))+'B'
                    --print convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
                    set @n=@n+1
                    end
                set @n=0
                set @m=@m+1
                end
            set @m=0
            set @l=@l+1
            end
        set @l=0
        set @k=@k+1
        end
    set @k=0
    set @j=@j+1
    end
set @j=0
set @i=@i+1
end

return @data
END

Bước 2

Giải mã dữ liệu sử dụng hàm đã tạo

select ID ,master.[dbo].[hack_encryption_data] (encrypteddata) as Password from MyTable

Kết quả

 

Lưu ý:

  • Thủ thục và các hàm chỉ có thể hack đối với mật khẩu dài 6 ký tự.
  • Thủ tục và hàm này có thể chiếm rất nhiều CPU để lấy lại dữ liệu và tìm lại mật khẩu

 Chúc bạn thành công!