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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
' f) O% ~+ U+ ~# d+ P- ~/ A3 _8 w7 \) p0 U4 g: x7 U3 X1 }1 I+ {& o$ {
出现漏洞的两个文件为:
* o$ k+ l  h) x: [! AInclude/payment/alipay.php, J4 ~+ _# Q: E1 j$ F& [4 e, `
Include/payment/yeepay.php" `5 g  ~% P+ a2 t
漏洞均出现在respond方法里,估计这两个文件是临时工写的。; V* T0 U3 w5 }% Q% p) m: K

8 M0 @: @6 v  \& B+ z5 c/ `8 @Include/payment/alipay.php5 R3 K* y7 @% e  N6 I3 ~

, w* Y# Z$ P$ S% m9 G5 n% }* u......# Y3 m6 ~' E  |" v5 O2 ^6 A
   function respond()
& \- f. x& z2 w/ y7 Z) B. G) v2 B& u    {- }. U1 E( E8 v+ C: I
        if (!empty($_POST))( J' g1 t# X5 v9 U3 X, p# X
        {4 f% ]1 W1 G" P! u1 J' V! v4 s' A1 Z
            foreach($_POST as $key => $data)
9 b4 a5 j/ P. K( A* o7 S6 N" K            {
5 ~# x2 ?" i7 v                $_GET[$key] = $data;$ `5 x# g0 D5 G
            }
. c6 q7 a) ^2 y, U4 [  P        }
& R/ J6 K  c5 U: J- X. Y        /* 引入配置文件 */- i* L' A1 l5 e" A( b3 D4 {: K
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% q8 A+ L, @* B7 k$ b* h8 H......   {3 q4 p( R& ]  V. S+ _3 e( K" r1 V. l
9 \; N6 ]& Q+ L
$ ]$ G. `3 W; t9 A( \- D, h
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。" A3 v8 Y0 i+ H  Y
$ ^& Z( G0 v8 L+ d$ J: q% L
Include/payment/yeepay.php6 i0 }6 B! ?) v7 Q

, _$ F- Q( T( [: l : m1 A. @+ K7 F, n

! W; F7 W$ x4 {......
7 d0 f+ B7 y; k  \) u* y/ a: l    function respond()
9 B& d1 z6 ?5 l3 v: I6 `1 G$ v    {
  n8 I- g0 y; t$ @, l( ?- i3 H
* A1 m2 C) d4 D9 S2 y        /* 引入配置文件 */
$ Z2 H# p6 ?2 r' G6 C9 @        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';9 y% p& t  a9 x& F" X0 Y
% z3 C' Q5 R6 s0 O$ p" m9 `+ c
        $p1_MerId = trim($payment['yp_account']);  L& |) W3 m- l7 E
        $merchantKey = trim($payment['yp_key']);' a, s# P/ v6 [) M( M
...... ! I3 H( z& v# n; W

( e( ?# U& z; E5 D$ U) `. c  v" k2 z; L) x, R3 [: p7 `
' i5 `) }: h! L+ d0 Q: n; f9 u: n
/ C0 c& D5 ?" m; |0 H
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。) ~- H1 y' O0 V5 F3 {" K, r$ B

, ]% h& ^  j4 R这两个方法在plus/carbuyaction.php文件调用。4 _3 V7 }3 _6 t; N, n$ y

! R6 Y9 q& v3 S. X9 f# Yplus/carbuyaction.php/ v: r4 G8 f: T! |" l

! V$ z* ~) R3 J- b, x6 E......
) s% S5 {2 T' w) ?5 s! `5 W; L' l) w} else if ($dopost == 'return') {4 N; @( K1 q4 o+ n* q; L: `
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');/ b8 t" O# T6 u# [3 M2 b
    if (in_array($code, $write_list))+ V0 q& i0 Y) l; g- z
    {% P) w0 }+ A3 E/ C% V4 @
        require_once DEDEINC.'/payment/'.$code.'.php';& j' ^/ x% C+ Y# Y' r5 i
        $pay = new $code;- R0 _9 ~; S2 T+ `
        $msg=$pay->respond();8 [. J  V. x6 F
        ShowMsg($msg, "javascript:;", 0, 3000);
  v( ]+ g5 N: ?+ F2 b        exit();  0 s5 l( s  L4 a
    } else {
+ ?& J/ S) N6 R) T( @4 a0 m+ e        exit('Error:File Type Can\'t Recognized!');
- N5 o5 }  M& V9 D  m* h. N6 _    }
0 R! Y/ j2 b0 ^% w5 \}
% @5 x/ o2 a% o) r......
! J; O7 j2 `+ ]) y
! ^- Z8 L- M/ f: z, ^" b+ b, @* n7 B1 y; g" X6 C2 m
0 b- u: I) M7 p5 m6 r" ?5 F
& Q+ g$ j8 `3 d
, Q' }2 u  r  s/ [  Y
4 g8 G; o( o; ~! J, u1 V" C' @" E
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。/ h9 F* c, I; s# E7 y7 T/ w
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。( [0 R" H7 B1 F+ U
# r" o2 T7 D6 |) |5 k, m- `
回到include/common.inc.php来看看他的机制。
$ R9 M5 a  i: f
1 O& g8 g" s) c; o/ r - t4 K6 p& X! `0 m8 ?$ q) Q( C

" x: O, O2 v+ H6 t4 ?9 g....../ z$ v; K! N. i# K
foreach(Array('_GET','_POST','_COOKIE') as $_request)2 M& r7 b/ A5 a2 a9 B
{" D9 y. m; F# ~" `7 p* m
        foreach($$_request as $_k => $_v)
9 B6 ?! j6 q' w* D3 z( z        {
) [$ k9 s; J! E  _& f- N$ N  \8 o                if($_k == 'nvarname') ${$_k} = $_v;
$ A$ P  q1 ~$ N, U+ U" j, F$ V                else ${$_k} = _RunMagicQuotes($_v);1 e( Q/ e! l0 }6 \
        }
, b5 O/ V  q2 i1 A}$ e  ^( f0 Z8 x* }
......
3 i! G* Y$ L/ ~1 G+ W2 d  R大概在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。暴路径:
5 B7 w, @# K& O/ x8 {4 A# M由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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