红联Linux门户
Linux帮助

从黑客角度检验Oracle数据库的安全性

发布时间:2006-08-15 10:30:49来源:红联作者:邱建元
  本文讨论的是从一种安全的角度来看黑客是如何攻击你的数据库,我们应该做什么防范。

一 State of Oracle Security (oracle的安全状态)

1 来之媒体的报道:
超过十分之一的于internet上公司数据库有安全隐患。一份来之750家美国数据库开发商开始对数据库安全表示忧虑。

2 黑客世界的秘密:
讨论会对数据库被黑的报道增多。
- Blackhat, Defcon Expliots 蠕虫侵蚀着数据库
- Alpha Voyager
- Spida worm
攻击oracle的白皮书
3 oracle网站-Alerts Web page

4 防火墙后边神秘的oracle是安全的
大多数的折衷安全是内部工作的结果
内部威胁是最危险的
数据库中的非特权用户

5 面对这样状况我们要做什么
对漏洞的修复
警惕风险和威胁
找到正确的解决方案

二 Securing the Listener service

1 监听(listener)的脆弱
监听是客户端和数据库的代理
重要性:
i) 分离了鉴定和审核
ii) 以一个独立的进程运行
iii) 接受命令执行数据库的外部任务
监听服务的脆弱性
在客户端和数据库建立的连接进程中,监听作为一个代理。客户端指向对监听的一个连接,监听依次来和数据库进行连接握手。
问题存在于监听分离了鉴证,被外部数据库控制管理。监听作为一个独立的进程,在过去称为UID,接受命令执行任务。

2 监听服务的安全问题
带有password的监听是安全的
-默认配置是无
-lsnrctl设在password
必须建立一个健壮的password
-对暴力破解是不易攻击的
保护好listener.ora文件
-password存储在这里
不要远程管理监听
-在网络上password是不加密的。

如何对监听进行安全控制:
首先:在监听服务中设置passwod,许多DBA甚至没有意思到在必须在监听服务中设置password,监听服务接受远程的命令,如果你没有设置,任意人都可以发送命令。

两种设置方法:
1) 使用监听控制实用工具 - lsnrctl.
2) 在listener.ora文件中设置。

你必须设置一个强壮的password,一个不少于8位用数字和特殊单词组成的。如果设置比较脆弱,黑客程序将会试出你的密码。Password是存在listener.ora的文件中,如果用户可以读取,可以利用password日志远程的监听。同时也推荐你不要远程管理listener,因为密码在网上被明文传播,有可能被监听。推荐你只用来进行连接。

监听命令:
-LSNRCTL> help
The following operations are available
start stop status
quit exit set*
show*

password rawmode displaymode
trc_file trc_directory trc_level
log_file log_directory log_status
current_listener connect_timeout startup_waittime
use_plugandplay save_config_on_stop
可以通过set password来进行设置。有两个问题在password中:password是没有lockout feature。命令审核是和标准oracle的审核数据是分开的。Password是不过期的,因为没有passwod的管理特性。

3 监听包(listener packet)

当一个命令输入到监听控制器中会发生:
向监听发生一条命令,如果监听是远程的,命令通过网络传播,上图是发送的数据包,我们可以看到报头中一些特殊的字符。在报尾可以看到listener要执行的远程命令,在这个例子中:
COMMAND=status

三 listener attacke demo


1 缓冲区溢出:

覆盖堆栈的内存,执行恶意的代码。监听服务的缓冲区溢出:


1) 一个连接字符串的例子:

- (DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HO

ST=)(USER=))(COMMAND=status) (SERVICE=LIST80)(VERSION=135294976)))


2) 寻找缓冲区溢出:

改变适当的值看看会发生什么情况

- Try USER= with 4,000 Xs after it

- Try SERVICE= with 4000 Xs after it

- Etc…


黑客是如何发现缓冲区溢出的:

当一个命令发生到监听服务时,黑客试图在连接字符中加很长的字符串,例如发生USER=一个很上的字符串。如果数据库开发人员只为username分配了一个1024字节长的单元,当发送超过了1024个字节,其他的字符将覆盖后边的单元。所以程序要能自能的对长度进行检查。


2 监听器服务缓冲区溢出

i) Oracle 8.1.7

发生1k的字节COMMAND= dwon机

超过4k会使系统崩溃。

ii) oracle 9.0.1

发生1k的字节SERVICE=


3 利用报头区的值


典型的命令:

- .T.......6.,...............:................4.............(CONNECT_DATA=.)

垃圾字符描述了报头的信息

- Offset to data

- Size of connection string

- Size of packet

- Type of packet


4 窃取监听命令

发生一下的命令:

- .T.......6.,...............:................4.............(CONNECT_DATA=.)

改变报头表明40字节

- ......."...(DESCRIPTION=(ERR=1153)(VSNNUM=135290880)(ERROR_

STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(CONNECT_DAT

A=.)ervices))CONNECT'))(ERROR=(CODE=3 03)(EMFI=1))))

改变报头表明200字节

- ........"..>.H.......@(DESCRIPTION=(ERR=1153)(VSNNUM=135290880)

(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(CONNE

CT_DATA=.)ervices))CONNECT_DATA=(SID=orcl)(global_dbname=te

st.com)(CID=(PROGRAM=C:\Oracle\bin\sqlplus.exe)(HOST=anewman)

(USER=aaron))')) (ERROR=(CODE=303)(EMFI=1))))


如果你伪造数据包的大小,监听将随意返回任何数据在它的命令字符中将超过你发生的字符长。例如一个用户上交了100字符的命令,而对你的返回要10字符,监听将先返回10字符对你的原先的拷贝,但这样的返回不会终结,还会返回90个先前命令的字符。可以获得username,当然这样是难的,不过这样的危险还是存在的。


6 外部程序

动态库和共享lib中的函数能被pl/sql调用的通过创建lib和packages进行设置:

- CREATE LIBRARY test AS ‘msvcrt,dll’;

CREATE PACKAGE test_function IS PROCEDURE

exec(command IN CHAR);

CREATE PACKAGE BODY test_function IS

PROCEDURE exec(command IN CHAR)

IS EXTERNAL NAME “system”

LIBRARY test;

有许多安去问题和外部服务进程有关,Xprocs允许在oracle中创建函数,参照DLL或共享库文件在操作系统上。这个很强的特性使得数据库能任何操作系统可以做得事情。当然权利越大责任也越大。创建一个Xproc可以指向操作系统的任何一个dll,使得你可以执行操作系统的命令。同样象获得数据库服务器的资源那样,来获得系统资源。第一关心的是你有没有给一个用户creat library和create procedure的特权。


7 远程回调外部进程

非‘正式’支持

但它很有效

ExtPorcs 是监听的另一个连接点

- SID_LIST_LISTENER =

- (SID_LIST =

- (SID_DESC =

- (SID_NAME = PLSExtProc)

- (ORACLE_HOME = E:\oracle\ora81)

-(PROGRAM = extproc)

ExtProc任何审核一个用户

——它是无效的!!!!!


8 默认设置-对外进程

自动配置

-Oracle 8i -YES

-Oracle 9i-NO

Call listener

-Do not create ExtProc as another listener endpoint

-Create its own entry in the listener.ora file

四oracle in a Web application


1 绕过防火墙的攻击:

防火墙的配置:

- Block access through port 1521

- Only allow traffic to port 80

- Block UDP as well as TCP

SQL 注入

- Not specific to Oracle

-a web programming problem

许多管理都认为防火墙的数据库是安全的。及时是你的防护墙配置是很恰当的,也可以通过web应用程序进行攻击。这些攻击主要是由于开发应用程序者一些错误的编程所致。我们可以发现许多站点在这个方面都很脆弱。虽然因数据库不同攻击而异,但基本问题还是相同的对所有的数据库来讲。简单的一个检验你的数据库是否脆弱,是通过嵌入一个请求在没有地方,然后来验证结果。有些站点会返回语法错误。而许多只是捕获了错误,没有报道。当然这些站点仍然有脆弱,但是这些可以不被利用如果你不过任何错误消息发送反馈信息。


2 How does it work?

修改请求

改变这样的查询:

- Select * from my_table where column_x = ‘1’

To: - Select * from my_table where column_x = ‘1’

UNION select password from DBA_USERS

where ‘q’=‘q’

exploit是如何工作的?它是通过改变一个sql语句成另为一种,例如上面的例子,一个简单查询变成了2个查询。你可以嵌入第二条命令在查询中在其他的数据库中,Oracle不运行这样做,而代替的是攻击者需要去补充查询请求的结尾。注意结尾的‘q’=’q’,这样用的原因是我们可以处理第二条查询,ASP将加他加入网页的结尾,这条语句值是真的。


3 Example JSP page


Package myseverlets;

<….>

String sql = new String(“SELECT * FROM

WebUsers WHERE Username=’” +

request.getParameter(“username”) + “’

AND Password=’” +

request.getParameter(“password”) + “’”

stmt = Conn.prepareStatement(sql)

Rs = stmt.executeQuery()

Exploiting the problem is much simpler if you can access the source of the web

page. You should not be able to see this data, however there are many bugs that

allow you to view the source, and I’m sure there are still lots that have not yet been

discovered.

The problem with our ASP code is that we are concatenating our SQL statement

together without parsing out any single quotes. Parsing out single quotes is a good

first step, but its recommended that you actually use parameterized SQL statements

instead.


4 有效的输入


如果用户和密码设置为:

- Username: Bob

- Password: Hardtoguesspassword

sql语句: - SELECT * FROM WebUsers WHERE

Username=’Bob’ AND

Password=’Hardtoguess’

这是我们一个典型的检验机制在登陆到web site上时,然后通过select语句和数据库进行匹配,如果匹配建立,用户被鉴别。如果在我们的代码中记录集合为空,将准备一个无效的username或者password,登陆被拒绝。


5 黑客的输入


代替password的输入:

- Aa’ OR ‘A’=‘A‘

相应的sql语句:

- SELECT * FROM WebUsers WHERE

Username=’Bob’ AND Password=’Aa’ OR

‘A’=‘A’

黑客已经进入了数据库。


6 Selecting from other Tables

• To select data other than the rows from the

table being selected from

• UNION the SQL Statement with the

DBA_USERS view.

这是另一个例子取得数据从其他的表中,这与当前的查询无直接联系。最好的方法是查找屏幕中包含选项的动态列表。如果这个sql只是注意一个单值,黑客不能得到其他数据。

而且一些小技巧单一查询变成2个查询或者是把他们组合起来,这有点难道,你要匹配列数还有列的数据类型。然后一些服务器提供你一个错误的消息,使得这项是可行的。一些Error类似为:

Number of columns does not match

Or

2nd column in UNION statement does not match the type of the first statement.


7Sample ASP Page

Dim sql

Sql = “SELECT * FROM PRODUCT WHERE

ProductName=’” & product_name & “’”

Set rs = Conn.OpenRecordset(sql)

‘ return the rows to the browser

Once again we have the ASP page. An attacker does not really need this, but it does

make our lives easier for demonstration purposes. Once again we are not using

parameterized queries, but instead are concatenating a string to build our SQL

statement.


8 有效的输入:

• Set the product_name to :

- DVD Player

• The SQL Statement is now:

- SELECT * FROM PRODUCT WHERE

ProductName=’DVD Player’


9 黑客输入:

• Set the product_name to :

- test’ UNION select username, password from

dba_users where ‘a’ = ‘a

• The SQL Statement is now:

- SELECT * FROM PRODUCT WHERE

ProductName=’test’ UNION select username,

password from dba_users where ‘a’=‘a’

黑客可以从password的拷贝中获得一些杂乱的信息,来进行暴力破解。通过添加UNION的命令和第二语句,来得到dba_users表的内容。


10 防止SQl的注入

验证用户的输入

解析避免单一查询为双重查询

使用对象参数来设在参数

- Bind variables

回顾升级你的CGI脚步,ASP page,etc… 建议你对web设计者制订程序的方针,主要着重使用参数化查许和对sql语句的无连接字符串。


11 SQL Injection demo

ASP page, IIS web server ,Oracle database

五 Database Vulnerabilities


1 数据库安全问题

sqlnet.log

普遍的oracle安全问题

PL/SQL 的脆弱性。

主机操作系统

- Known Issues Installing Oracle

-Lockdown Protection Procedures


2 sqlnet.log

当来自一个机器的连接失败后会在目录下建立一个文件,记录失败的连接。

得到一些信息: username, IP,address, date, etc…


3 普遍的oracle安全问题

默认的passwords:

- SYS, SYSTEM, DBSNMP, OUTLN,MDSYS,SCOTT

Password的管理特性没有激活,通过pfiles文件执行复用参数。

- No password lockout by default

- No password expiration by default

Public角色有对ALL_USERS视图的允许权限。


4 PL/SQL的脆弱性

动态SQL的问题

- EXECUTE IMMEDIATE

- DBMS_SQL

允许用户传递sql语句中的参数危险性

这些问题和sql 注入问题几乎一样。

There are two ways to create SQL Statements on the fly in PL/SQL code - Execute

immediate and through the package DBMS_SQL.


5 动态sql语句的例子

CREATE PROCEDURE BAD_CODING_EXAMPLE ( NEW_PASSWORD

VARCHAR2 ) AS

TEST VARCHAR2;

BEGIN

-- DO SOME WORK HERE

EXECUTE IMMEDIATE 'UPDATE ' || TABLE_NAME || ' SET ' ||

COLUMN_NAME || ' = ''' || NEW_PASSWORD || '''‘ WHERE USERNAME=

= ''' || CURRENT_USER_NAME || ''';

END BAD_CODING_EXAMPLE;

有效的输入 from any OCI connection, ODBC connection, SQL*Plus, etc…


- EXEC BAD_CODING_EXAMPLE( ‘testabc’ );

• SQL Created

- UPDATE APPLICATION_USERS SET PASSWORD = ‘testabc’

WHERE USERNAME = ‘aaron’

这个要求有一个有效的帐户,和对过程的可执行。

黑客的输入

- EXEC BAD_CODING_EXAMPLE( ‘testabc’’, ADMIN=1,

FULL_NAME=‘’TEST’ );

SQL Created

- UPDATE APPLICATION_USERS SET PASSWORD = ‘testabc‘,

ADMIN=1, FULL_NAME=‘TEST’ WHERE USERNAME =

‘aaron’

通过在输入中附加一条语句,使得ADMIN列更新,使得用户成为应用程序的管理员。

注意我们应该附近另一列在末尾来出来最后的单一请求。


6 Getting to the operating system

在NT中oracle以localSystem身份,作为系统权限的一部分。

在Unix为oracle user来运行,对oralce的所用文件有权限。

进程:- UTL_FILE, UTL_HTTP

系统权利类似于create library

一但用于了对数据库的权限,就可以进入操作系统,可以使用很多进程- UTL_FILE是最致命的,给你对文件的读写权。不过UTL_FILE_DIR参数可以进行限制,管理员可以修改这个参数。Oracle运行你加载libraries到一个独立的进程空间使用EXTOROC可执行文件。一些共享libraries和DLL也是可行的。


7 操作系统

• Oracle 有许多tUID文件

• Oratclsh was setUID root

- TCL debugger

- Allowed you to run a script as root

- Change setuid immediately, even if you are not using

Setuid有很多问题,以前oracle捆绑了15setuid文件。最大的问题是TCL debugger,为应用程序设计在他们用于DBSNMP引擎前。这个debugger是steuid的而且由root拥有。所以很容易获得root权限,虽然有patch,不过还是有很多文件可以被利用的,这个问题即使是dbsnmp agent 不使用也会有。

Other SetUID files

• Were many until Oracle8i release 2

- Cmctl, tnslsnr, etc…

• Very important one - oracle

- Main database engine

• Relies on ORACLE_HOME directory

- To load the pwdSID.ora file

- Allows you to load a rogue database


8.1.6已经取消了许多SetUIDbits. Dbsnmp和oracle files然后保留,这两个都需要SetUID才能恰当的工作。推荐使用不同策略,可以是任何人不可以可执行权限除了所有者。Oracle是主要的可执行程序,如果你设置为可执行的话,任何在server有帐户的人可以开启一个实例,通过UTL_FILE package去写一些文件。这些依赖于$ORACLE_HOME的环境变量的设置。


8 安装Oracle

oracle在安装的时候会在/tmp目录下建立一些文件,虽然umask是022,不过有人可以在安装之前生产一些目录和文件,一些保留的旧文件使得黑客可以注入一些代码在安装的时候。而且有很多脚本使得代码注入很简单,黑客可以很轻松的创建root toolkit。


9 锁定操作系统

在安装之前对其他的os用户进行锁定

TMP_DIR为一个安全的目录

锁定ORACLE_HOME许可权限

删除setUID从所有的文件

重新命令UNIXoracle的帐户
文章评论

共有 1 条评论

  1. 丁丁 于 2006-08-22 07:50:23发表: