中国网络渗透测试联盟

标题: dedecms本地文件包含及物理路径泄露0day [打印本页]

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)0 Z; X7 g: h( \

& f5 m  L$ C$ Z6 z出现漏洞的两个文件为:
3 R  J  U) H1 ]5 c- G7 s) u. nInclude/payment/alipay.php
) F7 s# h# r, O( D0 |Include/payment/yeepay.php# T, }1 H- s& z3 {
漏洞均出现在respond方法里,估计这两个文件是临时工写的。( ?/ q+ [  @2 U  x
& t* |% R7 Z5 Q* F. ]) B8 {& \# ?: @
Include/payment/alipay.php- R6 H- D2 B% r% [- F% L2 @
3 L( X& y2 [8 l! S# r! G% {1 u
......
1 [6 r" g# s& X3 @) i   function respond()" i! `5 o  `  e
    {
# f, O1 c3 A% `, D3 o2 l# r        if (!empty($_POST))% c; f% N  f# n. ~( b1 Z8 @
        {
5 U: K! M+ g; f# X( i# H7 ]" J            foreach($_POST as $key => $data)' F+ S+ G* ^4 H8 E& i; h
            {% q+ p" X0 ]% S6 W! U- ~
                $_GET[$key] = $data;
' m! ~: i+ Y6 L# _            }
. u- n) c: V, f' C/ L: s6 J        }- ^0 L; B4 ^- ?
        /* 引入配置文件 */
: h/ d" b+ H5 [: S$ {% P) H        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';5 m  r& u' D6 H# l* r6 M/ A
...... $ a7 [9 R- O3 E: h: _& e: H: B
8 u! @2 u  a1 a% b0 n
8 h6 d. A- ~/ U* z3 T
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。5 r" x. B2 k3 D$ ]
, I' U3 @4 |! {/ b4 e& g
Include/payment/yeepay.php# t9 [* ]1 n+ Z0 ^. X* w

3 b* @. @  M' A- I
* t' a2 d4 J8 m9 D  }
: O8 Z/ c- p. b1 S0 N......
0 ]$ s. v4 b5 R- k& p    function respond()+ c3 o9 N, C( q  u5 x- B
    {
/ J! d( Z% n, P, R, }: z9 |
. v3 S7 A2 l  Q/ I" o- J& W7 c        /* 引入配置文件 */
0 P$ Z) w7 v6 A2 M3 |. @        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
1 C2 l) q+ B; c( B
) M7 S, z- m1 }3 m        $p1_MerId = trim($payment['yp_account']);
+ C  k7 M2 a: X: I8 @* I# a6 h6 T        $merchantKey = trim($payment['yp_key']);
, q5 |4 V& J! c& _/ N( N...... % S( G4 O# C. z. B
) _) z( W/ V1 G
8 X8 Y5 f/ ^  G* K/ G# X4 `% D
; i3 u* j1 g9 ~8 e) j" O- T2 m

: u$ ?& L1 R4 k大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。; w/ `' ]0 X, Q

/ y0 e' Q( z; u# t这两个方法在plus/carbuyaction.php文件调用。
; M( A1 r+ s4 S8 V7 x
0 X) |3 S9 f% Y9 m! d0 O4 i6 Vplus/carbuyaction.php
& b3 R0 N, B: l7 ?5 a7 n( m1 r" r9 R5 g7 E, f+ T
......4 K" D6 R- S2 I: S: C2 L2 U, a
} else if ($dopost == 'return') {+ k% n' t6 V9 _9 p# B$ X, R- j3 V
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');% K* B) ^  H4 S
    if (in_array($code, $write_list))
% \+ N; Z) K  M$ K7 I    {9 K$ W. t+ w5 j
        require_once DEDEINC.'/payment/'.$code.'.php';( k1 E* F, |- o  m. y
        $pay = new $code;
- m) E. l* R1 r; Y; f        $msg=$pay->respond();/ ]0 e2 E) j9 z6 e, o3 q0 w
        ShowMsg($msg, "javascript:;", 0, 3000);
4 Z2 J, v! b/ A& u        exit();  2 @& f8 |! `! n
    } else {# m. w" B. @! X" B$ J1 S1 F+ n
        exit('Error:File Type Can\'t Recognized!');
% ^) y, B) S2 i  b% J3 D* P    }
3 K. M! E5 `5 {6 y& H) a}
. `/ |+ E) O1 O, m% f) ~* x...... . v6 @  j2 G2 Y. G+ T" g3 e

# `4 [; U; l5 r4 y( P8 a- m$ g. `+ {" d$ U6 P1 m- j

1 q4 C  ?  S% w, p; I5 m7 [- l" a3 y  X( I3 {/ A/ {
, y9 c4 E2 P, V- P, s: m

5 m. u/ D/ t# l% s0 p大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。! V  A2 H2 @5 E' n! K7 Z
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。9 X: ]. t2 a! X" \
! S6 b. h( `) \- u
回到include/common.inc.php来看看他的机制。& E% E* _. B9 x: {
0 y$ w( N" R- U& I, M. b; m" f

, d% s# E3 R! h5 |- u( n6 L
' J2 g3 D4 ~7 O1 b8 J3 q......) x& _, i% o( S* C! h
foreach(Array('_GET','_POST','_COOKIE') as $_request)( {  P2 P8 z% ?. H4 s
{; f5 @4 N: O- u
        foreach($$_request as $_k => $_v) & O$ F+ G& T1 ?6 @$ ~, l5 P
        {
" {$ m/ T4 A5 _- A+ V                if($_k == 'nvarname') ${$_k} = $_v;
/ y4 X7 o' c) v% U5 f% L                else ${$_k} = _RunMagicQuotes($_v);
1 W8 f: C" y  g5 z" L, N% K$ C1 o        }
( x7 D" B& U0 ]& S+ h3 s}
* K  o3 ^. Z7 v6 @. F& P...... ( ]0 ?) m% d0 V* t& m: g+ \; v( e! ]/ ~
大概在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。暴路径:
" l% \: u$ O# [+ G由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2