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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯), K7 Q+ W4 ^0 G& M3 \6 h/ a2 V: h
) [# L( J' m" G' f: @  t- c2 C
出现漏洞的两个文件为:
' R: \: l( C6 f; `Include/payment/alipay.php& ^- c6 Z/ T( N8 P% b/ ~
Include/payment/yeepay.php
  `6 C8 A, `; F- ]# A& v2 W, i5 B+ l漏洞均出现在respond方法里,估计这两个文件是临时工写的。' q/ z6 `+ I/ |% Q4 ~

0 o  J5 b2 Z; M. KInclude/payment/alipay.php, _* T; I$ u- E; w' i
! f6 y* Q! \5 `* B+ {. n. j
......1 u, K1 I& o0 {; e% u8 W) @8 n( ^
   function respond(), N7 H# \$ q8 r" y. B' i
    {
; y) ^2 j& Q' h3 z% d/ z& n3 Q, M        if (!empty($_POST))4 j, K. F! o$ i" c( ^% @( c
        {
, G5 i; o& L) y6 x. K3 r/ F& Y            foreach($_POST as $key => $data)
6 L  b, M) r4 ?0 v            {. n* X! v) H( l
                $_GET[$key] = $data;- ^% n7 F2 ^2 K" e/ M/ e. b+ a
            }8 N$ B- z+ L, b5 s0 m
        }, W5 Z+ N# r/ |! R9 h
        /* 引入配置文件 */9 s$ |0 C; {3 b) A5 b* ^* {) V
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
, d2 }0 p% u% O! d......
0 t) J/ u  U% f6 }/ X; q" a ' y, m) @/ M0 ]. @, `! D

: J1 k7 F+ T7 F" ~6 X5 L3 M大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。7 W- z& Y. Q1 a4 {; r* f
, }  z! h6 \+ h4 k  Q# _& a9 L
Include/payment/yeepay.php
  z( j6 W& U1 s; G: V& {1 h: p1 {
2 w/ J  P! T6 N4 ^* Y
. T8 B+ H( R$ p$ c# X
1 C* s, M+ K  K/ p......
2 q  z3 h7 ~) n, q2 i( o% @    function respond()' G- X0 U/ A' a! Z# C6 O; p! J
    {, |2 d4 c& s7 l& u- k# D
/ b# E* s; n' ]1 F
        /* 引入配置文件 */
2 Z. ]$ a9 O! e" ~0 h* R  K        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';( |# K7 L0 B% k! @. A  g
$ |2 n( N: g/ i7 P+ e1 @! j
        $p1_MerId = trim($payment['yp_account']);4 C: H" K! K0 E) @/ W; J
        $merchantKey = trim($payment['yp_key']);) R" ?& e* N2 u1 D" k0 ~
...... ) L8 w* x; X  q# K  F4 j

( w" x; S3 X8 v' n6 P0 [* K  i7 S& H" U( g7 J

- V! H0 d8 i( M/ s1 T* E
; _# }0 W& A- l3 U, @+ o大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
5 x: q/ V+ B, H' {4 q! t( \& R1 S/ W2 o! B! f* v% Q/ X# [
这两个方法在plus/carbuyaction.php文件调用。
8 S% m! W$ a7 c
) r  P6 \; Z' c1 S: q/ E- fplus/carbuyaction.php
6 m/ @. }7 [5 F& g! _: M
; j+ Q8 M. ]8 O6 y7 C5 H......
) h0 m6 s3 \$ g5 I7 q- [} else if ($dopost == 'return') {
, |* [8 t. I# A& b0 o' G% K1 \    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
9 z( r% Q' }' q4 r  r    if (in_array($code, $write_list))
; l* }( W# \/ |8 {& T    {
' X9 ], P" s2 H        require_once DEDEINC.'/payment/'.$code.'.php';3 R5 J9 C/ Y+ }$ I- L& J
        $pay = new $code;, ?" S; a7 a& U
        $msg=$pay->respond();
; H8 L8 ]! `8 n# i' X3 a        ShowMsg($msg, "javascript:;", 0, 3000);; A* @, l. }, I0 ]) J' V
        exit();  6 i! N% X, g( L, L4 i& @7 j& o1 ?
    } else {
# x4 o0 Q; p: c, c  M        exit('Error:File Type Can\'t Recognized!');
. ^7 `3 M- m5 J1 N6 {9 \5 S    }
1 K5 Z3 g- C! d/ u3 ~8 I+ L}
7 p9 O% ~/ h( {& O/ ?! F2 w...... / A6 B, x. a( _$ g( b, m" a* S! k, p) z

$ [/ T. c6 O3 }8 d" n- g6 Q0 e3 E

4 c) l+ \) j) q% ?. ?+ m! l. B( G& b( A  B4 D1 ?

4 d/ B- l! _: l' H8 Z4 P: _0 B$ o5 n8 G
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
3 @' z# C6 _% l" e1 O0 c( ^2 D所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
3 Y  F& c: Z& ]/ ?: X& v$ n+ w5 q8 [8 G+ ]; r
回到include/common.inc.php来看看他的机制。# _* z( E& ]  I) `) S

  I' A8 ~& Y5 ^4 E5 ~& W0 }3 O
9 v4 }: V  G8 s) v$ g1 T0 d( R
8 n/ v* N. E( v8 Y$ O5 T/ M) h......
/ n& q9 S" D- c$ wforeach(Array('_GET','_POST','_COOKIE') as $_request)/ h' Q0 k9 U$ M5 x$ o' F* y
{$ {; _8 p3 t3 O' m1 l+ T0 O) `
        foreach($$_request as $_k => $_v) $ P$ |' }: s5 f9 x& ]$ p( z
        {3 \. `3 ]& K% H3 o2 D2 M. p# j5 I
                if($_k == 'nvarname') ${$_k} = $_v;
" K1 n1 x* x) s                else ${$_k} = _RunMagicQuotes($_v);& Y1 \0 E# r8 O. F
        }
9 Y2 j" [9 D( ?" f}
$ A: w' c; _, l  D......
7 f$ R) G: L' l0 I6 x大概在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。暴路径:
, ~9 E+ P, D8 M7 a/ J由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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