文章详情页
从黑客角度检验oracle数据库
一 State of Oracle Security (oracle的安全状态)1 来之媒体的报道:超过十分之一的于internet上公司数据库有安全隐患。一份来之750家美国数据库开发商开始对数据库安全表示忧虑。2 黑客世界的秘密:讨论会对数据库被黑的报道增多。– Blackhat, Defcon EXPliots 蠕虫侵蚀着数据库– Alpha Voyager– Spida worm攻击oracle的白皮书3 oracle网站-Alerts Web pagehttp://otn.oracle.com/deploy/securi...Info&alerts.htmPrior to July 2000-One vulnerability acknowledged by OracleFrom July 2000 to August 2002-41 vulnerability reports on the Oracle websiteVulnerabilities reported onSecurityFocus.com-About 75 vulnerabilities reported about Oracle4 防火墙后边神秘的oracle是安全的大多数的折衷安全是内部工作的结果内部威胁是最危险的数据库中的非特权用户5 面对这样状况我们要做什么对漏洞的修复警惕风险和威胁找到正确的解决方案二 Securing the Listener service1 监听(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> helpThe following operations are availablestart stop statusquit exit set*show*password rawmode displaymodetrc_file trc_Directory trc_levellog_file log_directory log_statuscurrent_listener connect_timeout startup_waittimeuse_plugandplay save_config_on_stop可以通过set password来进行设置。有两个问题在password中:password是没有lockout feature。命令审核是和标准oracle的审核数据是分开的。Password是不过期的,因为没有passwod的治理特性。3 监听包(listener packet)当一个命令输入到监听控制器中会发生:向监听发生一条命令,假如监听是远程的,命令通过网络传播,上图是发送的数据包,我们可以看到报头中一些非凡的字符。在报尾可以看到listener要执行的远程命令,在这个例子中: COMMAND=status三 listener attacke demohttp://www.jammed.com/~jwa/hacks/security/tnscmd/1 缓冲区溢出:覆盖堆栈的内存,执行恶意的代码。监听服务的缓冲区溢出:1) 一个连接字符串的例子:– (DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(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 packet4 窃取监听命令发生一下的命令:– .T.......6.,...............:................4.............(CONNECT_DATA=.)改变报头表明40字节– .......'...(DESCRIPTION=(ERR=1153)(VSNNUM=135290880)(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(CONNECT_DATA=.)ervices))CONNECT'))(ERROR=(CODE=3 03)(EMFI=1))))改变报头表明200字节– ........'..>.H.......@(DESCRIPTION=(ERR=1153)(VSNNUM=135290880)(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(CONNECT_DATA=.)ervices))CONNECT_DATA=(SID=orcl)(global_dbname=test.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 PROCEDUREexec(command IN CHAR);CREATE PACKAGE BODY test_function ISPROCEDURE 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-NOCall listener-Do not create ExtProc as another listener endpoint-Create its own entry in the listener.ora file三 Oracle in a Web application1 绕过防火墙的攻击:防火墙的配置: – Block Access through port 1521– Only allow traffic to port 80– Block UDP as well as TCPSQL 注入– 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_USERSwhere ‘q’=‘q’exploit是如何工作的?它是通过改变一个sql语句成另为一种,例如上面的例子,一个简单查询变成了2个查询。你可以嵌入第二条命令在查询中在其他的数据库中,Oracle不运行这样做,而代替的是攻击者需要去补充查询请求的结尾。注重结尾的‘q’=’q’,这样用的原因是我们可以处理第二条查询,ASP将加他加入网页的结尾,这条语句值是真的。3 Example jsp pagePackage myseverlets;<….>String sql = new String(“SELECT * FROMWebUsers 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 webpage. You should not be able to see this data, however there are many bugs thatallow you to view the source, and I’m sure there are still lots that have not yet beendiscovered.The problem with our ASP code is that we are concatenating our SQL statementtogether without parsing out any single quotes. Parsing out single quotes is a goodfirst step, but its recommended that you actually use parameterized SQL statementsinstead.4 有效的输入假如用户和密码设置为:– Username: Bob– Password: Hardtoguesspasswordsql语句: – SELECT * FROM WebUsers WHEREUsername=’Bob’ ANDPassword=’Hardtoguess’这是我们一个典型的检验机制在登陆到web site上时,然后通过select语句和数据库进行匹配,假如匹配建立,用户被鉴别。假如在我们的代码中记录集合为空,将预备一个无效的username或者password,登陆被拒绝。5 黑客的输入代替password的输入:– Aa’ OR ‘A’=‘A‘相应的sql语句:– SELECT * FROM WebUsers WHEREUsername=’Bob’ AND Password=’Aa’ OR‘A’=‘A’黑客已经进入了数据库。6 Selecting from other TablesTo select data other than the rows from thetable being selected fromUNION the SQL Statement with theDBA_USERS view.这是另一个例子取得数据从其他的表中,这与当前的查询无直接联系。最好的方法是查找屏幕中包含选项的动态列表。假如这个sql只是注重一个单值,黑客不能得到其他数据。而且一些小技巧单一查询变成2个查询或者是把他们组合起来,这有点难道,你要匹配列数还有列的数据类型。然后一些服务器提供你一个错误的消息,使得这项是可行的。一些Error类似为:Number of columns does not match Or2nd column in UNION statement does not match the type of the first statement.7Sample ASP PageDim sqlSql = “SELECT * FROM PRODUCT WHEREProductName=’” & product_name & “’”Set rs = Conn.OpenRecordset(sql)‘ return the rows to the browserOnce again we have the ASP page. An attacker does not really need this, but it doesmake our lives easier for demonstration purposes. Once again we are not usingparameterized queries, but instead are concatenating a string to build our SQLstatement.8 有效的输入:;Set the product_name to :– DVD PlayerThe SQL Statement is now:– SELECT * FROM PRODUCT WHEREProductName=’DVD Player’9 黑客输入:;Set the product_name to :– test’ UNION select username, password fromdba_users where ‘a’ = ‘aThe SQL Statement is now:– SELECT * FROM PRODUCT WHEREProductName=’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 demoASP page, IIS web server ,Oracle database四 Database Vulnerabilities1 数据库安全问题sqlnet.log普遍的oracle安全问题PL/SQL 的脆弱性。主机操作系统– Known Issues Installing Oracle-Lockdown Protection Procedures2 sqlnet.log当来自一个机器的连接失败后会在目录下建立一个文件,记录失败的连接。得到一些信息: username, IP,address, date, etc…3 普遍的oracle安全问题默认的passwords:– SYS, SYSTEM, DBSNMP, OUTLN,MDSYS,SCOTTPassword的治理特性没有激活,通过pfiles文件执行复用参数。– No password lockout by default– No password expiration by defaultPublic角色有对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 – Executeimmediate and through the package DBMS_SQL.5 动态sql语句的例子CREATE PROCEDURE BAD_CODING_EXAMPLE ( NEW_PASSWORDVARCHAR2; ASTEST VARCHAR2;BEGIN-- DO SOME WORK HEREEXECUTE 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 usingSetuid有很多问题,以前oracle捆绑了15setuid文件。最大的问题是TCL debugger,为应用程序设计在他们用于DBSNMP引擎前。这个debugger是steuid的而且由root拥有。所以很轻易获得root权限,虽然有patch,不过还是有很多文件可以被利用的,这个问题即使是dbsnmp agent 不使用也会有。Other SetUID filesWere many until Oracle8i release 2– Cmctl, tnslsnr, etc…Very important one – oracle– Main database engineRelies on ORACLE_HOME directory– To load the pwdSID.ora file– Allows you to load a rogue database8.1.6已经取消了许多SetUIDbits. Dbsnmp和oracle files然后保留,这两个都需要SetUID才能恰当的工作。推荐使用不同策略,可以是任何人不可以可执行权限除了所有者。Oracle是主要的可执行程序,假如你设置为可执行的话,任何在server有帐户的人可以开启一个实例,通过UTL_FILE package去写一些文件。这些依靠于$ORACLE_HOME的环境变量的设置。8 安装Oracleoracle在安装的时候会在/tmp目录下建立一些文件,虽然umask是022,不过有人可以在安装之前生产一些目录和文件,一些保留的旧文件使得黑客可以注入一些代码在安装的时候。而且有很多脚本使得代码注入很简单,黑客可以很轻松的创建root toolkit。9 锁定操作系统在安装之前对其他的os用户进行锁定设置TMP_DIR为一个安全的目录锁定ORACLE_HOME许可权限删除setUID从所有的文件重新命令UNIXoracle的帐户五 Resources, Conclusion, and Wrap UpHow to Combat Hackers:Stay patched –– http://metalink.oracle.comSecurity alerts:– www.oraclesecurity.net/resources/mailinglist.htmlSecurity Discussion Board– www.oraclesecurity.net/cgi-bin/ubb/ultimatebb.cgiCheck out security solutions at:– www.appsecinc.comDefense in depthMultiple levels of security– Perform audits and pen tests on your databaseon a regular basis– Encryption of data-in-motion– Encryption of data-at-rest– Monitor your log files– Implement intrusion detection
排行榜