Полный перебор (или метод «грубой силы» от англ. brute force) — метод решения задачи путем перебора всех возможных вариантов. Сложность полного перебора зависит от количества всех возможных решений задачи.
Если пространство решений очень велико, то полный перебор может не дать результатов в течение нескольких лет или даже столетий.
Допустим у вас на сервере БД есть учётная запись (записи) с SQL-авторизацией и вам необходимо востановить её пароль, например вы забыли пароль SA, а другой УЗ с правами sysadmin-НЕТ. Либо нельзя, по каким либо причинам, менять пароль у УЗ, а доступ к данным под этим логином необходим. На этот случай предлагаю способ "грубой силы".
Для начала нам понадобится любой словарь с базой паролей, найти такие словари в интернете легко.
Я воспользовался архивом с паролями с ресурса http://www.passwords.ru/dic.php. Скачиваем один из словарей, например Big Dictionary - около 500 000 слов. Распаковываем архив в корень диска С:. На выходе папка c:\bigdict c 7 текстовыми файлами в формате length02-length08. Теперь с помощью функции OPENROWSET выведим все эти слова (BOL->OPENROWSET->E. Using the OPENROWSET BULK provider with a format file to retrieve rows from a text file):
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length02.txt',
FORMATFILE = 'c:\format.txt') AS length02
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length03.txt',
FORMATFILE = 'c:\format.txt') AS length03
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length04.txt',
FORMATFILE = 'c:\format.txt') AS length04
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length05.txt',
FORMATFILE = 'c:\format.txt') AS length05
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length06.txt',
FORMATFILE = 'c:\format.txt') AS length06
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length07.txt',
FORMATFILE = 'c:\format.txt') AS length07
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length08.txt',
FORMATFILE = 'c:\format.txt') AS length08
Формат выводимых данных задаётся в файле 'c:\format.txt', вот его текст:
10.0
1
1 SQLCHAR 0 15 "\r\n" 1 Pas SQL_Latin1_General_Cp437_BIN
Теперь "натравим" этот словарь на ХЕШи паролей, которые хранятся в master.dbo.syslogins с помощью функции PWDCOMPARE, которая умеет сравнивать хэш заданного слова с хэшем существующего пароля. На выходе получаем такой скрипт:
SELECT name, Pas FROM
(
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length02.txt',
FORMATFILE = 'c:\format.txt') AS length02
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length03.txt',
FORMATFILE = 'c:\format.txt') AS length03
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length04.txt',
FORMATFILE = 'c:\format.txt') AS length04
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length05.txt',
FORMATFILE = 'c:\format.txt') AS length05
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length06.txt',
FORMATFILE = 'c:\format.txt') AS length06
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length07.txt',
FORMATFILE = 'c:\format.txt') AS length07
UNION ALL
SELECT
* FROM OPENROWSET(BULK N'C:\bigdict\length08.txt',
FORMATFILE = 'c:\format.txt') AS length08
) p
CROSS JOIN
master.dbo.syslogins
WHERE
[password] IS NOT NULL AND
--name='SA' AND
PWDCOMPARE(Pas, [password])=1
Никаких гарантий на то, что вы с помощью именно этого словаря "угадаете" пароль-нет, но это не первый и не последний набор паролей, а кто ищет-тот всегда найдёт.
P.S.: Для более оперативного поиска имеет смысл значения из словарей "залить" в какую-нибудь таблицу, тем самым этот архив всегда будет у вас под рукой...на всякий случай ;)