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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
' o- I! l% m8 n+ i% F; I, _" }, T0 E2 q$ j" T+ |7 u" i& S' d+ u) l
出现漏洞的两个文件为:
  z8 g1 V( p: H* E8 s" V% r, c! o6 CInclude/payment/alipay.php8 A/ i9 x9 U5 S( c
Include/payment/yeepay.php
! t7 t4 L) e+ Z" h7 t+ k漏洞均出现在respond方法里,估计这两个文件是临时工写的。
' |5 K# v+ J7 s
# _  c% y: d( ^Include/payment/alipay.php
2 S: d0 R; J; m8 c% I" b
; u% H  a% T4 P8 Z4 j) E......  x! t) X2 p, g. ?% \  z; h
   function respond()) t+ Q5 i" ]( D* o
    {
/ `8 N/ n6 A7 r- n3 g0 Z; Q        if (!empty($_POST))
8 [2 U) f4 Z4 s* g( N( ~; W        {$ I6 w. m6 W; X4 m% {* d9 L+ {0 e# n
            foreach($_POST as $key => $data)2 N- e" W- l0 a) h5 |! Z( D1 E
            {
& l2 n, k4 c3 Z$ L" ?                $_GET[$key] = $data;
0 z6 e  T8 _8 N$ I            }4 D1 |0 H; s2 E
        }
3 b; P4 b9 U/ T0 ~9 k' P        /* 引入配置文件 */
& o9 z' T4 P9 d7 Z. ]1 h        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
2 Z8 l# T+ x3 ]: b' v( v! R......
# R/ s5 b; J( j* W% T0 @ : _& |- D1 X1 j

8 ?# u1 H( B! I% O大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
0 u" G, i3 r  e, R; H1 {7 b5 J; k4 P2 X- N, N; E& m
Include/payment/yeepay.php
" T( p9 z& N7 A( ^2 }8 w& a& \* Y' e% {0 s; g

7 j+ x. e3 x& r2 K. j; k5 w. e6 ~" M* I* x% J% C7 o
......
& X) G, Q1 [" f) I    function respond()6 Q6 g2 a0 Y; `1 U. B, ~2 g, M
    {
, X9 _. {5 m5 v& { : n% H7 H/ `! ?
        /* 引入配置文件 */; G1 A( h2 X: w) t1 z: P' y
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';0 [, q( e5 R( c  K' ?7 ?

+ n: Y& x* L8 f) K! L$ x        $p1_MerId = trim($payment['yp_account']);
9 p+ k, h% G/ e" A        $merchantKey = trim($payment['yp_key']);7 @8 R* N- i* t
......
% y# t8 q8 x' R% G
8 t* D1 w% e. ^5 E3 E) j
9 {. _+ h+ W# ?  w 7 p2 F% }+ v' L/ j, D! o6 _  d

  I. G: S; f# P; ]8 A& x2 Y' a大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
! j+ }! K/ S, |1 R- ~/ A2 M; j1 @6 D% ~4 C" ]
这两个方法在plus/carbuyaction.php文件调用。
. F8 V& |" `- j# d2 N1 t  K- j0 r" r; q
plus/carbuyaction.php
4 ?& R3 A6 {! k) F5 e' O7 [' y9 `1 Q$ Z- L+ o3 _4 V
......
3 j+ r4 p2 g' f& l. i} else if ($dopost == 'return') {8 H5 K8 n; D1 i, i
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');5 n0 Y$ B+ @; e' J
    if (in_array($code, $write_list))
% |( L; Z6 @4 P5 K    {
0 V5 w$ \- `" r+ b        require_once DEDEINC.'/payment/'.$code.'.php';9 ^# q! o5 e* U8 w4 n2 b; Z8 \4 y
        $pay = new $code;( q2 c3 o& ?# r$ R* ~. T
        $msg=$pay->respond();
  U, q3 R# H7 \+ q/ w        ShowMsg($msg, "javascript:;", 0, 3000);# p/ O0 ]' M* ?. U# l4 P/ S/ ]
        exit();  
6 e" k* [/ R$ |    } else {
& |3 P8 H6 |3 W4 `        exit('Error:File Type Can\'t Recognized!');- w: n, q+ o: ]2 I. G1 ?" c
    }
: t/ s# F; ~$ o, J2 A/ s6 l* ]3 n}. W) [. r& j! M: Y
......
7 i2 `6 Q  o3 d" ?. K
/ j( |# I( v7 _" G3 @5 Z* J5 x
1 ]% `5 {1 a1 h4 @# \& l4 f1 q2 y + |7 a$ Q( E: p8 G0 W  s
. W4 V1 n8 x/ d7 B% {6 _

; x' }( m; y- n8 M* j  \, U' L- i* F+ b) j' ?: m. @4 x
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
4 d, x2 o0 G+ S: e所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
/ f7 f. P+ E0 h6 i- @1 i3 I  m8 |4 r% V
回到include/common.inc.php来看看他的机制。
. ?1 O) z5 s2 i% g7 @( U6 p" E  u5 ^3 y9 V7 O' v1 ^$ e: x7 B
# h# a4 Q/ c8 L  |4 b' B4 s' V% B

  K3 y( H& h1 R2 u* S" S4 F5 W- i......( q+ c' u; H! q8 J6 E* {
foreach(Array('_GET','_POST','_COOKIE') as $_request)
4 C* P; o" F) o4 _7 d3 y) G6 n{
3 u- P* S4 |* `( y- I        foreach($$_request as $_k => $_v)
) C# c) F- P+ {; g        {
2 ~3 J, j) b: t5 m                if($_k == 'nvarname') ${$_k} = $_v;- k: @& R& Y, G/ N+ q% B
                else ${$_k} = _RunMagicQuotes($_v);4 E8 S8 T1 p+ v# U: r8 @
        }* O4 A( V% E' b9 g- j* a
}3 ]9 ^8 P1 |2 _' O
......
9 ^1 q  V7 {2 o, I1 Y  `) ^0 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。暴路径:
  [4 \6 O8 k( g, h7 c+ Y' ?由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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