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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)& h% B* S4 D3 f2 M# g
8 g0 u0 y3 a9 X- x4 q
出现漏洞的两个文件为:
5 F- V5 b+ W2 Z4 j! l* N! r9 lInclude/payment/alipay.php
8 L" ^  w8 Z% t7 I7 aInclude/payment/yeepay.php
. J7 r5 R+ z5 Y" f+ d漏洞均出现在respond方法里,估计这两个文件是临时工写的。
% K* `' g1 ^9 L5 f  }3 o" Q5 F$ b3 S6 W6 F
Include/payment/alipay.php
0 `8 r. y8 \% D! }: Q
- R  A* m8 l9 c& J2 B......3 _7 j' J6 b  r) q
   function respond()4 f9 g7 E! J. z8 D3 P
    {
. f! j% T- d0 W6 C        if (!empty($_POST)): U" u- d* f2 Y. Z! h% g, |
        {: N) C+ g* B% F  g, U6 ?; I
            foreach($_POST as $key => $data)
. {- N6 F$ G9 ?6 Q            {
/ @- y% D8 ~2 v                $_GET[$key] = $data;
+ c3 o. z1 H( t# T0 x5 C            }
7 y# C8 ^4 \( ?        }" {: Z' R6 L6 q0 x; N
        /* 引入配置文件 */# s5 ~+ |4 v, L6 U# y
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
) T$ \" A5 W! S' _( L......
8 k8 L5 e4 H% i% ?9 H/ f   z6 Q! d& [% l. }" j$ Y& }* ~

; U' h$ c" k4 F# |: o7 G3 N' ]大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。& Q6 i( z/ D3 C' y( i
! I/ a4 C3 \: S4 b
Include/payment/yeepay.php
8 x4 L' N, D( j& r. m; U' Y1 R& C" c, v, S! g- I# X! c+ j; T  Q9 N
3 m  D: m% k' X8 ^4 e& k
; \3 D% u: W" L9 l- e2 {8 C9 N
......
: |, A3 y$ T1 {# c8 y    function respond()  w4 v7 Z& k& [8 l; R" _
    {; t4 ^7 o, F. R: u) V. N
: F, v* U9 L& G& g4 k0 ~9 ^4 G8 E
        /* 引入配置文件 */  f) n! K9 z6 }
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';4 ?! T8 D3 F3 F# L- q: k) E

' x- C6 G- m5 f+ u  x5 l        $p1_MerId = trim($payment['yp_account']);
# e  U% x3 O- J( [        $merchantKey = trim($payment['yp_key']);
; x- z; {$ s. o- S* v1 Q* E7 P4 [...... & R+ W2 m4 m3 B9 U0 z, ]- f3 z8 g

  S. J. [. ]+ H$ p, [% Y6 ]# s% Z9 y( p1 `
7 F  f! e) e: p8 t# P, h
( x1 f; p1 Q8 b& D  _: c
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。2 N- s/ c; b& j& F+ {: f/ x
% q+ g& `) y; @. I. s" |
这两个方法在plus/carbuyaction.php文件调用。
% ?# y/ T0 ]% _) ?0 D& p3 t7 o; |" P/ A( J/ k. U9 D" U, E+ m. x+ j
plus/carbuyaction.php
- ]3 ?0 M: \& Z3 T$ x
' l3 ~5 c! A4 r* o- r: _% _( m......3 o/ q! |9 W* x' `2 p- G! [
} else if ($dopost == 'return') {2 y$ W9 t& ~5 c: d$ s# B& I& c
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
, r0 [# G6 C9 i3 F5 D/ ?6 f    if (in_array($code, $write_list))% n& a2 a( M) u; J
    {( r( d3 g+ X$ n  o
        require_once DEDEINC.'/payment/'.$code.'.php';9 f! e# ^; W, N1 Z
        $pay = new $code;. o* X2 S" M! [: V/ |2 }, R% {1 Y
        $msg=$pay->respond();
& p& q- t( ^, A1 m* e% D! _. U        ShowMsg($msg, "javascript:;", 0, 3000);1 V8 X5 n1 {4 s8 [6 C9 z
        exit();  $ X  Y; v: h/ z, M3 k3 _8 R. J. d$ g
    } else {
* K9 G2 e1 D2 \$ |8 |- I2 U0 _' m        exit('Error:File Type Can\'t Recognized!');
) J/ g1 d. r; _2 ^( R" w    }, n- p4 a3 Z' y  t/ v* ?
}
9 P5 B, ~: z9 Z5 j7 q, N6 w......
" d  ?  j; @* M. w4 a
5 {: M! f( A# o3 f2 K; w& s# L) Y* s0 c$ O: A' Y
8 d- ]6 k- s1 [: Y* a$ s

4 b  m- Y" |- u
& i' p' h: x9 T9 V" s' v0 i
' F# ~" I% Y! r7 e# t大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
$ D% p6 E5 E" z  `所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。8 S. f  q' z7 Y% u# x# P

% j% G! v& y5 \2 P回到include/common.inc.php来看看他的机制。
0 ^# l+ n1 \$ O) A/ l1 g$ U+ J  T
  A0 C9 s# }  C) t, |8 v8 Y+ d
' i) x+ v" ]1 a6 Q
) k1 ]: k+ N: k( c/ ^: Z$ D" P0 n3 h......
! K  J0 r7 O9 n5 H9 Hforeach(Array('_GET','_POST','_COOKIE') as $_request)
' G! D2 w0 D" I7 w3 e6 k2 A{% c& V+ S% y2 [$ g3 j- @# A
        foreach($$_request as $_k => $_v) $ Q8 R5 M) o1 x; k
        {2 M) q( A/ X5 o' _' d/ R; [$ S
                if($_k == 'nvarname') ${$_k} = $_v;
7 y/ J  ]% L. p2 W, i  |; K                else ${$_k} = _RunMagicQuotes($_v);2 T4 ^+ \0 o( D3 R% H  t% y
        }  `: T' K6 D* d
}$ e3 l/ w' ^' L  m4 n* u7 R# \% U
......   A0 a7 g0 C( Q3 U* q
大概在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。暴路径:6 C4 V+ H" U7 {1 f/ i
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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