• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Проблема с сертификатом при работе через Sql

  • Автор темы ptybn8407
  • Дата начала
P

ptybn8407

Была создана сборка, задача которой - скачивать файл посредством сертифика с заданного сайта. Я вытаскиваю сертификаты для того, чтобы залогиниться и скачать файлы через X509Storage.
При использовании сборки в стороннем приложении она прекрасно функционирует. Возникла идея загнать ее в SQL, чтобы оттуда посредством джобов использовать в задданое время. Но(!) при вызове запросом метода из сборки не получается вытащить не то, что нужный сертификат - а вообще любой, хранящийся на данном серваке и спокойно получаемый при запуске приложения.

[TSQL]USE Storage
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetFile]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[GetFile]
IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'BR_ReturnPath' and is_user_defined = 1)
DROP ASSEMBLY [BR_ReturnPath]
GO


USE master
GRANT UNSAFE ASSEMBLY TO sa
go
alter database [Storage] set trustworthy on
go


use Storage
CREATE ASSEMBLY BR_ReturnPath
FROM 'C:\!BR_NEW\BR_SQL\BR_ReturnPath.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE FUNCTION GetFile
(
@authenticateURL nvarchar(255)
,@fileURL nvarchar(255)
,@proxyHost nvarchar(255)
,@proxyPort int
,@proxyUser nvarchar(255)
,@proxyPassword nvarchar(255)
,@thumbprint nvarchar(255)
)
RETURNS nvarchar(255)
EXTERNAL NAME BR_ReturnPath.BR_Support.GetFile;
go


declare @result nvarchar(255)
set @result = dbo.GetFile('https://SomeAuthenticatePage',
'https://SomeFileDownloadPage',
'ProxyDomain',
ProxyPort,
'ProxyUser',
'ProxyPassword',
'CertificateThumbprint') select @result
print @result[/TSQL]


Так вот самое интересное, что при вытаскивании


X509Certificate2 thisCert = null;
X509Store store = new X509Store(StoreName.My,StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
X509Certificate2Collection collCert = store.Certificates.Find(X509FindType.FindByThumbprint,strThumbprint,true);
if (collCert.Count > 0)
{
thisCert = collCert[0];
}

значение store.Count равно 0... При этом при использовании dll в стороннем приложении все прекрасно скачивается(сертификаты вытаскиваются и выбирается рабочий), а когда я через SQL management запросом пытаюсь получить данные - он не может вытащить сертификаты. Везде значение Count равно 0, и у store, и у, разумеется, collCert.
Проблема мне кажется в том, что при запуске приложения права на него как бы принадлежат теущему пользователю и поэтому сертификты спокойно забираются, а уже из них вытаскивается нужный. А при запуске из SQL права хрен знает чьи - в итоге X509Storage пустое. Как обойти эту проблему - бьюсь уже полдня(((
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!