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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
& o4 W6 h! @% H, I0 _" A
  Y7 L7 M6 u+ R出现漏洞的两个文件为:
* ~7 _7 e/ O0 A, ]3 TInclude/payment/alipay.php
; U( e5 K4 Q, o, @9 [Include/payment/yeepay.php
+ l/ b& q8 I9 y; h5 {漏洞均出现在respond方法里,估计这两个文件是临时工写的。
' u7 b% [$ X( L# F
: i- X' d8 l* \Include/payment/alipay.php% J: d3 P( n# G: V* O; T

: Q+ [. U/ i5 ~" W) b2 T, \......# y! Z+ d% @6 }
   function respond()0 v$ N/ m3 d8 {. [. p
    {5 }" O3 B: }5 R& h9 {
        if (!empty($_POST))
, S6 e: \& K4 B* t" l8 `( H8 s        {
5 A" C1 w' c1 S. ?0 k1 g            foreach($_POST as $key => $data)& H# v: ^% N- _
            {; @# V5 S9 V7 U# Y3 I9 P) t
                $_GET[$key] = $data;
5 c* c7 `8 v1 G! S+ j& T            }
) o% a2 ^6 [' }6 P9 D* W8 v        }6 l) X, V" ]7 u# X
        /* 引入配置文件 */
/ A, W( C  W. c) K* I        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
  ]" a$ Y9 @  c+ g8 j0 S& U3 p...... 1 G# x- ^& W8 F  o7 Z

# w/ |8 |% W9 Z1 _0 a; c. j5 M$ l! U- w% N
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
2 x" p* w% g- b- s/ H: c3 h
/ O5 ]0 ^' |5 u; |( VInclude/payment/yeepay.php! W1 n- _. ?# P% E7 Q& y

/ w9 v9 w4 D) i( {  f; M 9 Z7 k7 p  X- x
: d+ W* m' m" x8 N9 N' W- y
......
) _. l: ~0 M; h2 m* j    function respond()" X1 Z/ E/ @: w1 m9 w! {
    {: F$ l" C/ g- C( {

7 w1 z$ L' \( ?, q$ H" C/ f        /* 引入配置文件 */
6 w$ W& _$ C9 Z# ]        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
+ T/ p/ N7 i) n9 a' N
6 I" `5 q3 m2 i- j( S        $p1_MerId = trim($payment['yp_account']);
  E; V& [3 ]% Z$ z* |1 n        $merchantKey = trim($payment['yp_key']);
: v/ I0 U, [. H( h6 g- a. b9 ?* d...... , h' ?1 G9 S. ~
8 M, a0 Y; ~% O
- p) Y0 h6 y6 C
0 h+ a8 Z* w, s* j4 F0 D* p
) Z7 S* r0 ]5 ^/ R2 t
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
; M0 t1 Z1 G+ T1 U8 S; @; B9 c# j# x
- ~0 y0 t/ r) Z% a这两个方法在plus/carbuyaction.php文件调用。, K% h) a2 Z8 _* |
1 |- H' b# E+ g4 d- @
plus/carbuyaction.php
8 s/ J3 y- ~4 `& j" A9 q5 L$ `5 {% e5 B* t" X* P. P, @
......
  S$ X+ S) y7 @$ C! A! k} else if ($dopost == 'return') {
4 v4 A, I' o' r/ B+ t    $write_list = array('alipay', 'bank', 'cod', 'yeepay');- \1 X* H( j2 B
    if (in_array($code, $write_list)), K/ T2 z! v4 @8 {  h3 ^5 j4 R
    {# \0 D/ Y  k0 b1 u0 c4 X+ z
        require_once DEDEINC.'/payment/'.$code.'.php';. K& F# o+ i6 J0 |5 s
        $pay = new $code;
8 d$ l; k" q$ t0 ?1 E        $msg=$pay->respond();
; d$ d0 G9 h$ `1 q9 Z        ShowMsg($msg, "javascript:;", 0, 3000);9 G3 }$ d$ Z. C3 h9 f/ Y
        exit();  
1 x7 p. K% D9 n    } else {6 C/ A4 [$ u8 J3 W" H
        exit('Error:File Type Can\'t Recognized!');1 |; U: V! G' H  ]- F) G, N
    }! {# N- q# \# C# e1 n" R6 w0 H: R
}
. X6 }3 r  K6 e...... 7 e4 Z/ w- l, r; T* v0 Y

9 e7 E3 c1 ?- ~$ ?3 |3 x( e  P0 Q7 g- E5 P

3 S/ r- H$ A/ d9 t3 c
8 Z/ ?  i" ~+ h4 b; j; H+ r9 w4 v
! }0 `  N9 a* `! y9 E9 C: D
. G- ?9 k2 r! n4 l大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。6 \* g, u4 z, r# C+ I
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。. B1 D7 ^; d" |$ y+ _& [' p" ~
: Y9 E& _. ?) Q7 ?) @% E
回到include/common.inc.php来看看他的机制。" Q1 z7 l: Y* l, w; R

0 n5 V1 M; ]8 I- [1 y$ Q
5 ]. O0 U: i( i+ h4 B# j& {
9 \; c* ], m7 x; b......& k% ~- x. v3 U7 }& N
foreach(Array('_GET','_POST','_COOKIE') as $_request)
9 X: ~' {, f7 g) z  b# ]{# ]! i4 m( U7 h) M5 t4 ?5 a" S
        foreach($$_request as $_k => $_v) # p2 Y$ ~0 X6 r: P: U* R# k' x! y, n
        {9 B7 ~/ q( k) J0 m; k2 l8 j
                if($_k == 'nvarname') ${$_k} = $_v;
. e. X2 _0 ~" u5 w3 b  {                else ${$_k} = _RunMagicQuotes($_v);5 c/ p+ k! I, C) e% |
        }
" d$ p( [& |/ d: u/ S& x- d}
( _$ u$ _4 o/ M. Q4 c+ m7 r......
/ E9 J$ |8 ^2 t1 v( `大概在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。暴路径:
' X9 H( s: E. k! g; f' C4 o% q由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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