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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
+ u" `3 G+ }, r/ i5 X, F. Q, X8 h
  r& m2 B7 `% }9 k出现漏洞的两个文件为:' O& Z6 ?4 V. t, }; z
Include/payment/alipay.php
: E. n! V8 a7 l& w6 @! A, [Include/payment/yeepay.php
# j( a; ~2 N6 Y. R) E/ Q# b' W漏洞均出现在respond方法里,估计这两个文件是临时工写的。
/ \8 ^% |" }, `$ w6 ^8 R" @- C% h2 T
Include/payment/alipay.php' g" ^' L3 R7 E

7 _9 @9 O" G' \6 _; C/ F......
/ ^" w0 h& d' B, H+ m" A   function respond(). _" t/ _. _% L& d# Z
    {3 H- Q# \4 H+ C/ Y3 c* d
        if (!empty($_POST)). Q& y3 G+ ^7 R5 v6 p( X
        {
" R1 q. @, r+ R& f1 G            foreach($_POST as $key => $data)) {3 [+ A7 Y* P+ K. k' g
            {; [0 W" x2 @, f/ I
                $_GET[$key] = $data;3 W- B1 T' f% d5 |- n4 _* w  M
            }; p) N1 t) U/ E) |5 h: D
        }" C( ~7 d; a# A5 n. ~
        /* 引入配置文件 */
2 Z/ j' b7 K# S! U: B        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';3 h' I& V, l4 v# y, Q3 Z* \
......
, u1 x; q5 K, X1 ~. t% ?1 i9 A8 d # e8 E. B4 V, y- N

+ }  K/ n  N# _* E  z7 V) O" q% \大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
. @; `- |; r$ h: `0 }) n8 F! u, Z  ]8 t
Include/payment/yeepay.php
) H3 {% e' }0 `1 Q# g
5 U4 c% F& y5 @4 S& O
' C- L! J$ s; l/ y7 m7 O( J: i9 L0 _3 u$ }
......8 Q" m* z- i5 z/ w- `( m! `) \
    function respond()
! K' n; A! J8 X* G$ k+ R$ f    {) Q' x: y  y& H6 B& l& _* ?
6 V$ `# K( K/ q( g2 ~
        /* 引入配置文件 */7 w, n- p% P9 u3 A7 ?3 w# {4 r, k
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
; [: Y4 i/ h- ?  o9 j. i- M$ N$ N 8 f7 O" C' }( B: [& e: o4 g
        $p1_MerId = trim($payment['yp_account']);1 H& M5 s1 X. j! _# c# ~0 i
        $merchantKey = trim($payment['yp_key']);$ i* T. C0 Q9 B* H' \: Q8 `
......
# w7 o+ }; R5 M
" ^: J3 u3 M4 g0 V: D. ]1 p
5 F3 w/ V; Q: v9 Q& p 4 I& S" {" M# T* w, K  a
0 E" p3 w% \: b
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
+ U. A* c7 x- e1 o& y* @9 A
, k- O' W- ?. T( c这两个方法在plus/carbuyaction.php文件调用。
8 v) C& c+ b% x: n  s0 c) H8 K$ A' d: z7 {, g7 X; e
plus/carbuyaction.php
) u  {, h& s# v& E1 _! i7 V- R( _7 a( L* ~5 K% A
......4 Z  Z; Q, G( \& w; f
} else if ($dopost == 'return') {
) p8 m; d8 _3 N: q4 }% r- b    $write_list = array('alipay', 'bank', 'cod', 'yeepay');" t& m: O9 v2 `$ d) x
    if (in_array($code, $write_list))
; {* K. U. k* |* j8 [) J    {
$ \( y0 F$ J4 A/ C6 D; q        require_once DEDEINC.'/payment/'.$code.'.php';
; G; T# M% {9 ~- [  Z7 g3 K        $pay = new $code;
( g) `; F" c" E7 ]        $msg=$pay->respond();
' O9 y8 b& `& `/ K2 Y$ S- l1 @% Q        ShowMsg($msg, "javascript:;", 0, 3000);
9 X& S/ u" r5 U; |; f        exit();  
- H% m- }% K% L7 A4 o    } else {
: h, r! V  V1 }% F1 @. t( F        exit('Error:File Type Can\'t Recognized!');
5 O9 e+ L3 K9 U2 v$ K: _4 B, ~    }5 b, g, |0 Y1 C, z9 O; k
}2 c1 |9 J7 ]6 b2 ~5 Q
......
) U/ @! m7 B5 f $ f  T5 C7 _1 k  u. x; z9 [9 ^

2 r! e0 _# M: w4 @9 N3 G' B6 d ) u0 ]3 i' U" B+ j( m+ J0 ]

7 W8 j; s7 _) ]2 D# x 7 `1 ^7 A9 k% l  k! p+ F$ a. N; c

  i, h* T; Z5 }+ g! `( }大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。: R) }4 K/ o% S/ ?0 J" C5 B, I
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。5 |+ D7 n; _5 J0 y8 P- ?: `5 k8 o

/ _" f6 Z" V% G( O) B8 {; `回到include/common.inc.php来看看他的机制。
* H' Q) u5 {7 u2 D# }( S; Q2 `# e8 d
# w7 V3 e: y! P8 t0 X  I- K0 A; L1 \
( i6 ]( L/ Q. d" M/ f2 Y. M% j5 e
......
+ X+ Z, K' c# h( @; Q4 o& A2 |foreach(Array('_GET','_POST','_COOKIE') as $_request)
  a; P* N1 z* F) U( t  E, n{
8 n; K% u% I3 `1 J        foreach($$_request as $_k => $_v) 1 F5 l; I% [  U. F
        {% T4 B; k) ?! G& M' x3 C
                if($_k == 'nvarname') ${$_k} = $_v;8 E; x* }( x6 K$ s, u
                else ${$_k} = _RunMagicQuotes($_v);  O4 M$ ^1 e8 T$ o
        }
4 g8 R. w3 o1 H  y: K, d" K. }5 t}
, X, D$ j5 {& k, e. \. i- C......
: J  s  Y9 R8 v7 @0 O大概在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。暴路径:; Z  y: w4 n. b, L
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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