一 State of Oracle Security (oracle的安全状态)
1 来之媒体的报道:
超过十分之一的于internet上公司数据库有安全隐患。一份来之750家美国数据库开发商开始对数据库安全表示忧虑。
2 黑客世界的秘密:
讨论会对数据库被黑的报道增多。
– Blackhat, Defcon Expliots 蠕虫侵蚀着数据库
– Alpha Voyager
– Spida worm
攻击oracle的白皮书
3 oracle网站-Alerts Web page
http://otn.oracle.com/deploy/securi...Info&alerts.htm
Prior to July 2000
-One vulnerability acknowledged by Oracle
From July 2000 to August 2002
-41 vulnerability reports on the Oracle website
Vulnerabilities reported on
SecurityFocus.com
-About 75 vulnerabilities reported about Oracle
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
http://www.jammed.com/~jwa/hacks/security/tnscmd/
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:Oraclebinsqlplus.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:oracleora81)
-(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