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

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

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

2 E$ J& u( o* ^" A- e- f) o. R# U出现漏洞的两个文件为:
% s8 P  M/ J& x! u( a$ b0 MInclude/payment/alipay.php
1 t& S$ ~0 B, _3 l$ _Include/payment/yeepay.php4 H& Y' A+ r& T6 u
漏洞均出现在respond方法里,估计这两个文件是临时工写的。+ W$ \- R' t$ [/ E( s: y! H
: R) Z2 o2 ]0 H5 N+ r% K
Include/payment/alipay.php
2 _, {0 Q' V. U6 K: X- v" X! y2 y3 O& _, {$ e
......, A6 e, W1 {2 k1 b! a/ M
   function respond()8 [. Q1 p( j/ M: D
    {+ ^; n9 B1 C. ]  E$ J
        if (!empty($_POST))
# ]* @1 r$ h/ b        {2 U; }2 J  @3 N$ p/ D' C
            foreach($_POST as $key => $data)
1 D  e! g4 j9 e5 ]            {
9 M- r% n0 X. e; z                $_GET[$key] = $data;
/ b; y4 @4 H0 a2 [            }  h1 z- ~0 g! v5 K7 j0 o6 N
        }7 a' ~1 y- v, y
        /* 引入配置文件 */
3 S7 p$ g0 N5 K0 ?        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
& b8 v! K4 Z7 q3 ?...... " W4 j, S. F. j: s5 n
& o! D/ [/ ^* f  ?4 R
3 h' @$ c$ ^$ ]0 ?/ a+ @
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
( R6 q% s$ k/ |; g0 W, D
; t$ v- s$ v& [& B" P/ o; [0 rInclude/payment/yeepay.php: k- I" Y/ a4 x8 A# W

6 P& d1 O2 {* C' p: T7 T
1 O  M; v: x& P3 j3 g* V" g2 \1 d  h
......
% U+ ~# w$ \/ H. w. I2 P    function respond()" \3 K( K8 i/ J. z! t$ L
    {3 @1 u1 Z9 C$ R  {  ?; w( d
" j/ D8 I" `, e+ l# f8 h2 _/ G
        /* 引入配置文件 */+ X2 L9 w  M2 D! c6 E
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
& R- T9 F# b- t1 \, J
. S- \1 C8 m+ i- q( f9 W% l  L* J        $p1_MerId = trim($payment['yp_account']);
  ]: |9 \% \& X1 H        $merchantKey = trim($payment['yp_key']);% Y- Q$ R, b8 H3 O
......
" W' {" @: o& S. ~1 V 9 u( }5 e8 I, c* k  y- _2 `6 u
. M+ U, I$ y; K' w+ @1 ^

: O( p7 c. Z3 Z9 x( F: q7 C6 O8 {
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。7 Q+ H. T; Z) O( |8 r, M" S
) e/ M: Z: }2 b" z+ G
这两个方法在plus/carbuyaction.php文件调用。
6 a! K' A$ ~* T: c  T+ L
4 r4 [" w8 V  [9 Z: D2 G& xplus/carbuyaction.php
5 A; _3 I9 t: Z
8 ]9 F7 n4 P" V5 C* f% H7 v......1 ^- k1 k7 ^( _# w; n' |
} else if ($dopost == 'return') {
' c  x2 S9 r7 {2 Q* |7 W    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
# u1 A8 }2 i% Z    if (in_array($code, $write_list)); _  H! w0 X: T3 Q6 u3 r; g9 n
    {
9 K0 z" m2 D, y$ C/ O$ I8 `        require_once DEDEINC.'/payment/'.$code.'.php';& N& l' S+ t# E* b. w3 M9 e
        $pay = new $code;
: ~( O. B  _) V+ }* z" u/ [        $msg=$pay->respond();
5 @9 d8 N* _) I9 B# B        ShowMsg($msg, "javascript:;", 0, 3000);
* F9 _5 n. Q6 A- z( S+ W: i        exit();  : K& X1 t4 q6 y
    } else {$ r: t) |  N+ J3 o/ a  k
        exit('Error:File Type Can\'t Recognized!');1 J7 C7 p. u0 p' s
    }! x3 L' U2 x% o" R% t
}  Q, ~) _- o, O
......
. Z! e- z) N0 I& \5 e( O$ w0 T
  b% Y, Z/ l8 l7 _
$ J% k$ i* M0 m' i( j
2 K. m. x- J& L7 n) v  [2 M) x6 H' q+ D8 I
* W: S& V( B: X1 d
" L6 s9 f8 r/ @2 [0 A8 T
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
$ \- V+ R' v& A! {& C5 @0 b9 d  i所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
4 A% d# j4 B/ d5 P" Z5 X. r4 M
回到include/common.inc.php来看看他的机制。  }* a- c5 d: W
- b$ x7 I# c+ `3 L4 R1 j+ C1 s: c# z4 }
9 I+ }3 s$ }9 N7 W) ]! Z
' D0 m6 J( V, [6 f
......
% Q5 ?) c) t& Z- r+ k% K* Jforeach(Array('_GET','_POST','_COOKIE') as $_request)
/ h* O4 _$ t& e. S{
# P2 ]$ t  p8 ^. e4 m- }. ]9 N        foreach($$_request as $_k => $_v)
7 F/ V9 x: w2 P& o" ^" e! {        {
5 N' M6 `  n6 F: X2 o7 E                if($_k == 'nvarname') ${$_k} = $_v;# p& i$ Z3 _8 W% r2 b; m
                else ${$_k} = _RunMagicQuotes($_v);
/ _* ?: Y/ b& `        }# r3 r6 E: B; F5 e
}
3 C5 E- X) ~$ D( g/ Y( r......
7 ^2 d+ E7 m! I7 {5 A1 S大概在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。暴路径:( A; e2 p- _1 {2 l3 z) O
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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