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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
% v4 U( E% t! E$ U1 r; O$ Q( R4 Y/ p3 I# J$ k; T  X: G
出现漏洞的两个文件为:( N# h: M& z1 d; M2 S+ I; ?
Include/payment/alipay.php
+ c8 l6 [, u2 _/ JInclude/payment/yeepay.php$ W. S1 }& f) i% a# T
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
! w! U# o+ y* H- `4 `% O5 s3 E9 p: [5 g
Include/payment/alipay.php
7 D7 X  l' w1 p8 n  l$ C3 W% o
......: M) ]$ ]) `7 U
   function respond()3 S1 p9 z( a. U8 n) f
    {" Y9 z+ N( w7 d2 b0 C$ y' }0 b: v2 T. u
        if (!empty($_POST))
! C$ v2 \& T; K! T4 c/ h        {
, d8 B$ Y) n. L4 V# w( H. Z            foreach($_POST as $key => $data)8 C+ ^4 K4 `7 K. i0 {6 `( r. B" O
            {
7 b1 U& c, C+ @2 J8 s7 @                $_GET[$key] = $data;; X+ _( k4 J5 C# v9 T" ^
            }
6 ?" B2 Y' S, Y( Y! s; C) ]        }3 H9 I' T8 y' l4 a9 o
        /* 引入配置文件 */' [, o5 B) }, z* r9 v
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';! I, J1 a% p# V; w( S4 W& ^
...... & s/ a1 _7 A% |

5 g3 o9 w5 |+ B7 Q- J
! q. d# D7 v- z5 c# }' d* J& x8 I* ^大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
% h+ V) v! W4 c9 C5 y# A+ I$ e1 k/ d' w
Include/payment/yeepay.php5 }  l8 B, G$ B

1 O3 _! _, ]: x
9 B5 K* C  G4 V0 V- D6 ^+ g" j2 c8 d2 t# W9 p+ ]
......) s6 m, F9 |' r0 H6 g5 {, u
    function respond()
& E: ]4 c: Q: T2 X# u" }    {
5 \  A( S& \5 s* @( l& p( A4 k' \" E
( o: [) e5 I% l* P! i% N        /* 引入配置文件 */
: w' K# Y) D! j        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
% {1 A6 P4 l+ i
9 Q1 h. `  _% j2 c0 {$ T" m        $p1_MerId = trim($payment['yp_account']);
" H$ q* E! L1 o6 @6 I        $merchantKey = trim($payment['yp_key']);! {) \  E( h# @9 N
...... 2 L- Z! M/ d8 w

# h+ i3 x8 `8 `9 D7 o" k1 {
0 q+ w" l( |5 ]- F0 m
$ ?- s7 v1 n% t( h' K3 z+ z% d! Z( d% Q7 K) `: i
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。+ ]3 ~% \# m: i; k; N) B% s

& M, C% U* }& v# v$ s这两个方法在plus/carbuyaction.php文件调用。  y! u0 \! A6 g+ Z8 f' C

9 l- F+ O9 |( D8 F# {$ ^# T8 J+ tplus/carbuyaction.php
  t% ~% K8 {/ N0 y$ w% v+ m
5 N) T: F9 a2 s....... N" t4 w) C& F+ z  L9 C' Q4 D
} else if ($dopost == 'return') {
* m9 j* ]5 l$ g) P    $write_list = array('alipay', 'bank', 'cod', 'yeepay');+ H& y7 j6 }7 N$ ~' Y# }  _
    if (in_array($code, $write_list))' p" a$ }) `9 ^/ L. Z
    {+ h, K9 P( x& V
        require_once DEDEINC.'/payment/'.$code.'.php';
6 O  g* Y/ q7 `' x2 D' B        $pay = new $code;
5 {  G7 p; Q1 e+ o( Z        $msg=$pay->respond();9 F: u* y( g* t+ \" @
        ShowMsg($msg, "javascript:;", 0, 3000);
/ v) U) w9 n$ }8 Y4 Q: |  P) ]        exit();  
3 n3 A9 d# ^2 O' w# K0 b    } else {5 H# h2 F4 s  f( ~  j
        exit('Error:File Type Can\'t Recognized!');6 c" B+ O5 a! p% C8 m: \  n8 ~4 U* M
    }5 G& i: \, u3 X% _: w9 }& b8 l
}
4 B" l: D8 d( _: Q......
- f, l4 V! l1 f! a' s * H# l% V  H9 Q

. y# V# w1 b1 e- o5 q! @8 Q
1 M7 T( }7 _- w8 \( [) I" C. k" t4 ~. n

, K; j5 p. q$ o: l$ M
7 n) g6 P( W6 v  ^! d, K. y9 x大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。- e; c6 B" {# L1 Q0 U" I
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
9 n& E4 L" Q9 M& }
. \+ W1 A( Z( ]$ B+ d! Q回到include/common.inc.php来看看他的机制。2 l0 Q8 i% j  N
, _9 P" w! r- H5 _

! y8 _9 a  H, @/ I
& y, f, s, f( A/ M! d......# H, ?1 m' H$ \/ F! V
foreach(Array('_GET','_POST','_COOKIE') as $_request)
3 k% M9 U* U: M  h6 i{
+ L8 y. ^" B6 V  P# v- s        foreach($$_request as $_k => $_v) 3 Z4 Y, S; B) Y( Z7 q6 r
        {/ J9 a" y$ w7 i7 `* S0 H
                if($_k == 'nvarname') ${$_k} = $_v;
; Q8 b4 |2 O9 Y                else ${$_k} = _RunMagicQuotes($_v);; S1 l" }' v/ r" V
        }
% ^( r; S0 n: v+ E& c& G/ ^% P& Y6 a}
! r, U- [: f* t4 O! ^. F# h......
) ~! _% ^. p& z6 e! X8 v大概在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。暴路径:2 R0 F3 ^$ c' W  i' T4 a
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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