Главная страница
Навигация по странице:

  • Распределение прав доступа

  • Опасные SQL-запросы

  • Рекомендации по безопасности MS SQL Server

  • в

  • WEb практикум. Web'cepbep


    Скачать 4.76 Mb.
    НазваниеWeb'cepbep
    АнкорWEb практикум
    Дата22.01.2023
    Размер4.76 Mb.
    Формат файлаdocx
    Имя файлаWEB.docx
    ТипДокументы
    #898678
    страница14 из 18
    1   ...   10   11   12   13   14   15   16   17   18

    You a hacked

    " >> index.htm' —

    Процедура sp_who позволяет просмотреть, кто сейчас подключен к серверу: exec sp_who

    Пример результата выполнения этого SQL-запроса:


    spid ecid

    status

    loginame host

    1 1

    1 1

    1 1—1 1

    1 Д l

    dbname

    cmd

    9

    0

    background

    sa

    0

    master

    TASK MANAGER

    10

    0

    background

    sa

    0

    master

    TASK MANAGER

    11

    0

    background

    sa

    0

    master

    TASK MANAGER

    51

    0

    runnable

    CYD\flenov

    0

    Northwind

    SELECT

    52

    0

    sleeping

    CYD\flenov

    0

    master

    AWAITING COMMAND







    Подробную информацию о текущей базе данных можно получить и с помощью процедуры sp_heip: exec sp_help

    Пример результата выполнения этой процедуры:


    NAME

    Имя

    Owner

    Владелец

    Object Type

    Тип объекта

    Invoices

    dbo

    view

    Order Subtotals

    dbo

    view

    Orders Qry

    dbo

    view

    Quarterly Orders

    dbo

    view

    Sales by Category

    dbo

    view

    Sales Totals by Amount dbo

    view

    Sysconstraints

    dbo

    view

    Syssegments

    dbo

    view

    Categories

    dbo

    user table

    CustomerCustomerDemo

    dbo

    user table

    CustomerDemographics

    dbo

    user table

    Customers

    dbo

    user table

    Employees

    dbo

    user table

    Syscolumns

    dbo

    system table

    Syscomments

    dbo

    system table

    Sysdepends

    dbo

    system table

    sysfilegroups

    dbo

    system table







    Следующие две процедуры, которые таят в себе опасность, — sp_adduser и sp_grantdbaccess. Для начала рассмотрим первую из них. Процедуре sp_adduser нужно передать три параметра (но только первый параметр является обязательным):

    ♦ имя пользователя (login);

    • имя учетной записи в СУБД. Если этот параметр не указан, то будет использо­вано имя из первого параметра;

    • имя группы или роли, в которую автоматически попадает пользователь.

    При добавлении пользователя указанное имя уже должно существовать в MS SQL Server или в ОС Windows.

    Рассмотрим пример. В ОС Windows уже существует гостевая учетная запись. Да­вайте выдадим ей права на доступ к текущей базе данных:

    EXEC sp_adduser 'notebook\rocTb'

    Учетная запись "Гость" присутствует в Windows-системах по умолчанию. Если эта учетная запись не заблокирована, то хакер сможет с помощью хранимых процедур наделить ее правами доступа к СУБД и использовать для своих целей. Но хакеру еще желательно знать сетевое имя компьютера. Это легко сделать с помощью про­цедуры xp_getnetname.

    Процедура sp_adduser считается устаревшей и оставлена только для совместимости со старыми приложениями. В данный момент рекомендуется использовать проце­дуру sp_grantdbaccess, которой нужно передать следующие параметры:

    • имя пользователя (login), которое зарегистрировано в ОС Windows NT или соз­дано в MS SQL Server;

    • имя учетной записи в СУБД. Если этот параметр не указан, то будет использо­вано имя из первого параметра.

    В итоге, добавление гостевой учетной записи с помощью процедуры sp_grantdbaccess будет выглядеть следующим образом:

    EXEC sp_grantdbaccess 'notebook\rocTb'

    Для удаления пользователя применяется процедура sp_dropuser, которой нужно передать имя пользователя СУБД (мы его указывали во втором параметре процеду­ры sp_adduser или sp_grantdbaccess). В следующем примере мы удаляем гостевую учетную запись из текущей базы:

    EXEC sp_dropuser 'notebook\guest'

    Управление — это хорошо, но нужно уметь определить, какие вообще существуют учетные записи в системе. Для этого предназначена хранимая процедура sp_helpuser. Выполните ее, и перед вами появится таблица с информацией о поль­зователях текущей СУБД. Результирующая таблица состоит из следующих полей:

    • userName — имя пользователя;

    • GroupName — название роли, в которую входит пользователь;

    • LoginName — имя, используемое для входа на сервер;

    • DefDBName — база данных по умолчанию;

    • useriD — идентификатор пользователя;

    • sid — пользовательский идентификатор безопасности.

    Не менее опасной для web-сервера и удобной для хакера может оказаться процеду­ра xp_terminate_process, которая позволяет уничтожить указанный процесс по его идентификатору.

    Следующие хранимые процедуры позволяют работать с реестром Windows, что тоже достаточно опасно:

    • xp_regenumkeys;

    • xp_regenumvalues;

    • xp_regread;

    • xp_regwrite;

    • xp_regdeletekey;

    • xp_regdeletevalue.

    Честно сказать, я понятия не имею, зачем они добавлены в СУБД?

    Для работы с диском можно выделить следующие процедуры:

    • xp_availablemedia;

    • xp_fileexist;

    • xp_dirtree.

    Первая из этих процедур возвращает доступные устройства, вторая определяет на­личие указанного файла в системе, а третья получает дерево каталогов.

    Все рассмотренные процедуры должны быть запрещены для выполнения с правами учетной записи, под которой работают ваши сценарии. И это далеко не полный список, есть еще процедуры создания, управления и удаления ролей, от которых зависят права доступа. Чтобы не ошибиться, вы должны запретить все и разрешить доступ явно только к тем, которые используют ваш сценарий.

    1. Распределение прав доступа

    Но все запреты будут бессмысленны, если простому пользователю разрешено вы­полнение операторов grant, revoke или deny. С помощью этих операторов можно давать или снимать права, а также запрещать доступ.

    Для назначения разрешающих прав доступа используется оператор grant, вид кото­рого зависит от того, на что выделяются права. Если на операторы, то grant выгля­дит следующим образом:

    GRANT { ALL | оператор [ ,...n ] }

    TO пользователь [ ,...n ]

    Операторы SQL, на которые вы можете назначать права доступа для пользователя:

    • CREATE database;

    • CREATE DEFAULT;

    • create function;

    • CREATE procedure;

    • CREATE rule;

    • CREATE TABLE;

    • CREATE VIEW;

    • backup database;

    • BACKUP LOG.

    Рассмотрим пример, в котором пользователю с именем Mikhail выделяются права на создание таблиц и объектов просмотра:

    GRANT CREATE TABLE, CREATE VIEW TO Mikhail

    Для упрощения работы с правами доступа можно использовать роли. Допустим, что у нас есть десять учетных записей для работников бухгалтерии и все они объе­динены в одну роль Buh. Если все работники роли нуждаются в возможности созда­ния таблиц, то можно назначить разрешение всей роли:

    GRANT CREATE TABLE, CREATE VIEW TO Buh

    Если нужно разрешить выполнение всех перечисленных ранее операторов, то мож­но воспользоваться ключевым словом all. Следующий пример предоставляет пол­ный доступ роли Buh:

    GRANT ALL TO Buh

    За более полной информацией советую обратиться к файлу-справке, а также могу порекомендовать мою книгу "Transact-SQL".

    При добавлении прав доступа на объекты необходимо указать оператор grant, за которым идет перечисление разрешений на объект. После ключевого слова on пи­шем имя объекта, а после то — имя пользователя или роли. В упрощенном вариан­те распределение прав выглядит следующим образом:

    GRANT разрешения ON объект TO пользователь

    Например, следующей командой мы разрешаем пользователю Hacker выполнять оператор select в таблице tbPeopies:

    GRANT SELECT ON tbPeopies TO Hacker

    Если пользователю нужно предоставить все права на объект, то, чтобы не перечис­лять их, можно написать ключевое слово ALL:

    GRANT ALL ON tbPeopies TO Buh

    Необходимо отметить, что по стандарту надо писать all privileges, но Microsoft разрешила ленивым программистам не писать длинное слово privileges. Я, напри­мер, всегда забываю, как оно пишется, поэтому благодарен корпорации Microsoft. Итак, если следовать стандарту, то мы должны были бы написать запрос на изме­нение привилегий следующим образом:

    GRANT ALL PRIVILEGES ON tbPeoples TO Buh

    Для задания запретов используется оператор deny, который так же имеет два вари­анта: для операторов и объектов. Рассмотрим каждый из них.

    Общий вид команды deny для операторов выглядит следующим образом:

    DENY { ALL | оператор [ ,...n ] }

    TO пользователь [ ,...n ]

    Операторы, которые могут использоваться, те же, что и у grant. Например, сле­дующий запрос явно запрещает пользователю Hacker создавать таблицы и объекты просмотра:

    DENY CREATE TABLE, CREATE VIEW TO Hacker

    Если нужно отменить все права на операторы, то можно указать ключевое слово all. В следующем примере отменяются права для бухгалтерии:

    REVOKE All FROM Buh

    1. Опасные SQL-запросы

    Даже не имея прав доступа к выполнению команд, злоумышленник может навре­дить, используя SQL-запросы. Как мы уже выяснили при рассмотрении MySQL (см. разд. 5.2), к СУБД можно отправлять SQL-запросы на обновление и удаление. В случае с MS SQL Server все рассмотренное остается в силе.

    Например, дефейс можно совершить и с помощью запросов. Необходимо только найти таблицу, в которой хранятся данные, отображаемые на главной web- странице — например, новости. После этого с помощью запроса update обновля­ем новости так, чтобы последняя из них (можно и все) содержали необходимый текст. Например, если новости хранятся в таблице news, и заголовок новости — в колонке Title, то хакер может выполнить следующий запрос:

    UPDATE News

    SET Title='Hacked by MegaHacker'

    Это тоже изменение главной web-страницы, и его можно отнести к дефейсу.

    Наиболее интересными для хакера являются имена таблиц. Чтобы обновлять и уда­лять данные, необходимо знать названия объектов, с которыми вы работаете. Для этого используется таблица tables из information_schema или просто: information_schema. tables. Чтобы получить все имена таблиц, необходимо выпол­нить запрос:

    SELECT TABLE_NAME

    FROM INFORMATION_SCHEMA.TABLES

    Иногда бывает необходимость получить только одну запись из таблицы. Это легко сделать, ограничив результат с помощью оператора top n, который ставится после select, где n — это количество нужных строк. Так, следующий пример выбирает первые две записи:

    SELECT TOP 2 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

    Как можно получить следующую запись? Да очень просто, выбрать верхнюю за­пись из InformatIon_schema. tableS и ограничить запрос так, чтобы известное вам имя отсекалось. Например, вы уже знаете, что в базе данных есть таблица Users. Для получения следующего имени таблицы пишем:

    SELECT TOP 2 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME<>'Users'

    Когда известно несколько таблиц, можно перечислить их с помощью not in, на­пример, следующим образом:

    SELECT TOP 2 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

    WHERE TABLE_NAME NOT IN ('Users', 'Passwords', 'Data')

    Чтобы получить имена всех колонок, необходимо обратиться к таблице columns из I nformat I on_schema. Например, следующий запрос возвратит имена колонок табли­цы Users:

    SELECT COLUMN_NAME

    FROM INFORMATION_SCHEMA.COLUMNS

    WHERE TABLE_NAME='Users'

    1. Рекомендации по безопасности MS SQL Server

    Безопасность MS SQL Server не является темой данной книги, но раз уж мы рас­сматриваем взлом и безопасность web-серверов, то обсудим некоторые рекоменда­ции, ведь СУБД — своеобразная часть web-сервера.

    Для защиты СУБД от хакеров все сценарии должны выполняться от имени непри­вилегированного пользователя. Этот пользователь должен ограничиваться только выборкой данных, а вставка и обновление должны быть доступны лишь для тех таблиц, где это действительно нужно. Чем мне нравится MS SQL Server, так это

    тем, что он предоставляет очень удобное средство управления — SQL Server Enter­prise Manager. С его помощью очень удобно управлять и правами.











    Tm SQL Server Enterprise Manager

    - [Console Root\Microsoft SQL Servers\SQL Server Group\CYD (Windows .




    TJni Консоль Действие Вид Tools

    Окно Справка

    _ в

    ^ Haul KnfGg, if

    * vs вив m ca




    Permit


    | Console Root •zl) Microsoft SQL Servers В ^ SQL Server Group -a» CYD (Windows NT)

    В Cj Databases В U master

    Щ
    Tables 6V1 Views

    Stored Procedures Extended Stored Procedures ijfl Users Roles

    | Rules

    Hal Defaults

    P, User Defined Data Types User Defined Functions @ Q model Ш 0 rnsdb s Q Northwmd Ш й pubs s й tempdb

    В Data Transformation Services 1+ C3 Management 3 Replication В C3 Security ЁЙ Logins

    Users 2 Items










    Name

    | Login Name

    ! Database Access

    г

    Permit

    I&guest


    Database User Properties - guest

    General

    User name:

    Database role membership:

    Permit in Database Role

    db_owner db_accessadmin db_securityadmin db_ddladmin db_backupoperator db_datareader db_datawriter [ db_denydatareader db_denydatawriter
    Итак, сами рекомендации. Запрещаем все, что не используется, для этого войдите в свойства пользователя, от имени которого работают сценарии, и назначьте ему только те роли, которые действительно необходимы (рис. 6.1).

    Properties.

    Отмена Примените Справка

    Рис. 6.1. Свойства пользователя/управление ролями

    По умолчанию все пользователи помещаются в роль public. Будьте осторожны, по­тому что она разрешает слишком много. А если все же используете, то ограничьте права явно: нажмите кнопку Permissions в окне свойств пользователя, и перед вами откроется окно управления доступом к объектам (рис. 6.2).

    Это окно имеет вид таблицы. Строки — это объекты базы данных, а колонки — операторы, на которые можно устанавливать права. Если ячейка на пересечении имени объекта и оператора пустая, то права на нее такие же, как и у роли, которую наследует пользователь. Чтобы добавить право текущему пользователю, щелкните по ячейке один раз, и в ней появится зеленая галочка. Чтобы запретить (даже если у

    роли есть разрешение), щелкните второй раз — и зеленая галочка изменится на красный крестик, означающий запрет.




    Рис. 6.2. Права доступа




    Обязательно заблокируйте административную учетную запись sa и лучше исполь­зуйте авторизацию Windows. В MS SQL Server есть два вида авторизации:

    • авторизация Windows — для подключения к MS SQL Server используется учет­ная запись Windows. В MS SQL Server 2000 и более поздних версиях этот режим предполагается по умолчанию, как более безопасный;

    • смешанный режим — помимо учетных записей Windows, может быть создана учетная запись MS SQL Server. Этот режим использовать не рекомендуется.

    Смешанный режим не рекомендуется, сейчас Microsoft советует использовать Ac­tive Directory и возлагать на нее управление паролями и авторизацию.
    1. 1   ...   10   11   12   13   14   15   16   17   18


    написать администратору сайта