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

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

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

! ~; }$ D4 l, o  {出现漏洞的两个文件为:2 p( t# I: D  @$ }  u* c- m
Include/payment/alipay.php
' B# j3 n8 J! P) ZInclude/payment/yeepay.php9 f2 I9 ~% o2 ~1 u5 j- ~
漏洞均出现在respond方法里,估计这两个文件是临时工写的。3 |! K! z8 c! J, ?) z: N; l" \- w, ?# E

* D' ?# N" U8 i! d7 |Include/payment/alipay.php; {) C. x; \# V" ?& {; x

* R; m- f2 i- t6 E......
& {7 G& W( B- W& f1 l   function respond()
& y" C) t' Y0 H& h* G3 ]    {
3 \* K: d" Z- n3 h7 \0 }0 `        if (!empty($_POST))$ A3 u# q) x3 S# y
        {
; w" ~. e% q- M  @            foreach($_POST as $key => $data)5 X$ ^; o7 v# z& f9 _1 O) m
            {
+ M2 D& J, H5 I' x" z4 _; a                $_GET[$key] = $data;
4 X9 G( u. s: q5 K( ^8 T            }
( L) u: R9 h5 [) @        }
. p3 d2 a* h' e& F        /* 引入配置文件 */0 {# e6 t0 {* C, F! P& I
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
- ?6 d% r; ^: o9 C& D; O...... 8 z+ G- A/ E% F2 P' b4 F1 \/ x

! N2 z5 C* I/ U3 g+ z/ R" {
6 ]6 k6 ?* T# A7 a, M0 i大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。, D% R, B) T1 e0 |9 e# G

8 z4 b$ k3 L2 l4 Q8 dInclude/payment/yeepay.php* T. M* Q3 A3 b' ?) B, W
( z: H4 z4 M# d9 ^: g

$ v" @1 b6 k4 ]0 P, A
0 l8 c; j8 L5 x1 ]. G......6 o% Q6 b1 A% x
    function respond()
4 m% `9 O# x3 _+ A: p    {
4 T0 a) r& c  R1 Y6 H8 h7 J 5 K# ^( D# ]' L2 z
        /* 引入配置文件 */3 [, `$ w" Z0 {3 ]8 ?
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
- B5 [, _. ]9 j4 ~
# v5 R0 D) z. w        $p1_MerId = trim($payment['yp_account']);
! |% k7 e' Z, R0 p$ @        $merchantKey = trim($payment['yp_key']);
% `: @: [7 F- ~......
) j: g2 m' y4 I5 K6 I3 q2 I( a ! Z' e) w+ k. H6 L2 ~6 n2 _, t
1 T! s: c; G- U

7 O1 _9 |6 Q; m6 Z) J# Z" K- w0 V- B+ _3 _  Q7 B) J# V
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
( o/ F0 @  z  J- {  L- T/ @4 B! b2 k3 k
这两个方法在plus/carbuyaction.php文件调用。
: \0 _3 I5 \" S7 j4 m. i& @3 Z( g/ J+ [! X6 A8 Y1 s. Q( a
plus/carbuyaction.php
' w/ ?. T( r3 `9 w' r) N8 n2 l: F/ S
......
! |; w0 v0 y' Q4 \} else if ($dopost == 'return') {
) e5 B; Q4 i- @7 h    $write_list = array('alipay', 'bank', 'cod', 'yeepay');) i/ {# G) @2 X# s* M, L
    if (in_array($code, $write_list))
4 v  ]2 h, B# I+ e& ~    {. e- {! q- w7 ?3 q' r% d
        require_once DEDEINC.'/payment/'.$code.'.php';5 N8 ~  F$ g. H
        $pay = new $code;2 L0 }7 \; F( |" K" o9 h( f& T
        $msg=$pay->respond();4 B/ q* j8 j. g; x0 K2 m. D
        ShowMsg($msg, "javascript:;", 0, 3000);
; [1 C/ g* ?. R$ G8 J; {        exit();  
! t6 [, F5 N; V  s1 p# m2 I: M8 d    } else {
4 D' D# N; x# J* r0 w& c0 U' O        exit('Error:File Type Can\'t Recognized!');
# h7 e5 Z9 S. W' c: R    }1 t9 J. \( Q: V( q9 U
}: W" V2 _4 L% ^/ }2 Q' D" I
......
. M# {+ A" L8 j( S5 ^' N 3 i* i* f% ]: K) r3 f8 @
2 C2 G2 |# A( H5 t  G" N2 |
: f4 f' k* n+ }; f; N4 [) Z

9 A& ~& O# Y+ d( Z9 }* J7 W- V
! i! P, z! N! H  Y; T# i, C9 Q* X# v  c. d
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。% T1 ~9 r1 q6 I
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
7 V) \% H6 _; [! \' f8 k6 X1 T6 D- G! I1 O9 u
回到include/common.inc.php来看看他的机制。
+ G& @  p' p! H% _+ M; V; \; V: o1 {2 Y6 H9 L+ f4 H# ]0 W

' t* O1 F7 n# J- H/ X( q. b2 g& d( O& N
......
. X, \% L" d8 ^/ L/ g8 O9 Fforeach(Array('_GET','_POST','_COOKIE') as $_request)' Q3 j  c( @* G& Q, r3 c8 ~# R( L
{
7 a5 K: F! K4 h& t        foreach($$_request as $_k => $_v) 9 G$ O4 L' C/ h: m$ y3 }: h
        {
6 i% ?0 z9 @8 d5 h6 w$ D7 _                if($_k == 'nvarname') ${$_k} = $_v;
8 k; z. N( i5 G  p7 {                else ${$_k} = _RunMagicQuotes($_v);' d3 |7 L7 w& d# z; G" T
        }
5 t; [, K3 u5 `/ I}( k; a; w! N) l3 d
......
+ V3 \" q3 m" M7 d& N" B( P大概在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。暴路径:
8 G. m) m) c( e1 i8 \由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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