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

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

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

8 j! e% |  \$ ^' O* y+ {出现漏洞的两个文件为:: g. r7 ~. R, E$ r$ n* p6 K
Include/payment/alipay.php
( i) C! |- S2 l% eInclude/payment/yeepay.php8 t6 Z1 Q8 I) K) x4 Z* m
漏洞均出现在respond方法里,估计这两个文件是临时工写的。0 S2 f" r+ H  l* R
: W- G$ w3 ^' j
Include/payment/alipay.php
! p+ s3 m6 o. B2 d& C% i$ X
; M' G$ A4 Q) [5 E% S% r......
, _2 C5 D2 d& N* O* U   function respond()% j# [/ }' W2 Z1 L
    {" ]. X# f! A- F
        if (!empty($_POST))
  \2 \0 X, j7 N  g: i        {  P6 ]5 o# s  u! f* h
            foreach($_POST as $key => $data)
; p- Y/ J9 y. |0 g: u( O            {; Y& J, _* K& X6 x$ r8 X3 I( E9 c
                $_GET[$key] = $data;" o2 B' M8 b  F" S/ S* j+ ]. U+ Z
            }& z7 o8 d4 [. L" L# [
        }
$ u2 e1 ^% o# Z9 ]! e- o+ |        /* 引入配置文件 */
6 q5 P& z- j- w# r3 a0 D        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
+ N, O& G/ s( C3 y! F" P...... - H$ |7 C0 ?4 O' E
5 t8 W8 A1 }0 Y% r' }

" y0 ^+ c2 j  r6 L5 w& L* ~大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
: l& q& j; D" I! P) x0 x
. M7 a. }" S$ Q; nInclude/payment/yeepay.php) e, [( y/ F  a; Y) N  b; h

) J/ A, n" q9 ?/ r
+ t1 a- K' R: C! \! Z/ \# c4 W  Z7 ^
. B/ P- D6 a, y5 U& N......3 P: P7 e- P/ v5 n! B0 o
    function respond()( m  m8 U8 n; W. U, @  v# c& e
    {
& ^% x5 z, j0 A8 ` ; [1 h: |9 q2 H
        /* 引入配置文件 */3 \6 k5 V3 R# {# T" o: I1 Z6 ?
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
& z: R, X, A, q* j2 X. T: |2 v' M. Q* K & W2 M; i/ J0 F- v( ?
        $p1_MerId = trim($payment['yp_account']);/ f0 Y8 y$ ~* i3 j: T9 k/ P; _
        $merchantKey = trim($payment['yp_key']);2 l' X. K7 u9 _8 J
......
8 C/ }" s$ J, w9 k' v. A0 r+ J
* P! K3 y8 X. o9 f' R# f% r1 [% E, X1 M" b! |

. E% W- C# W3 B' `9 ]) m& x! I$ f8 M4 h( L4 A* V
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。# ^- y" b1 C% J% N6 J
9 `/ w8 a0 w" r1 {0 r1 i1 M
这两个方法在plus/carbuyaction.php文件调用。6 ?  s; |. l% X( `! v& n# V

- l0 [+ @7 t4 ~3 Oplus/carbuyaction.php2 x3 ?% }+ N5 c1 {7 V4 p0 l/ u4 y

$ o: E  f, F4 }2 m& ?7 o" T4 s......
- A( k3 u; s! p/ s7 g} else if ($dopost == 'return') {7 }( T" s9 c$ ^( Y0 u5 z2 f4 N9 s
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');4 L0 ?; q$ c/ ~3 w
    if (in_array($code, $write_list))
& O4 l& e& Y4 Y# u8 t, ~    {% A' @! m# T# ]& W- W: s
        require_once DEDEINC.'/payment/'.$code.'.php';4 G/ F; U$ |7 E+ r) W6 q
        $pay = new $code;, j+ I9 w& j$ D7 W$ ~! u+ X. B5 G
        $msg=$pay->respond();, y, j: p7 ]  V4 q  B0 N5 D$ u
        ShowMsg($msg, "javascript:;", 0, 3000);" m# [( n% ~* C' d2 z4 o  W
        exit();  2 K$ e, K1 R4 o+ G( F$ i! Z  d1 [
    } else {
" W* K" U" W* u# }/ k8 z0 ?        exit('Error:File Type Can\'t Recognized!');; u0 C+ i! A% b, {
    }+ x0 x* J4 u. V7 L
}9 F, g) i* t+ G! S
......
, Q/ y; A9 F% _1 j, P; x 0 h* o  k* e7 v- I. _

1 G! I, G/ g' S9 Y, l
: r3 [# V# M% ?% H$ \
  R8 Y2 |0 n" _ & \( I9 R% ?6 K9 {5 U! p" V: v
7 V5 L' k" k5 R% s$ R( Z" Z' H% B
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。4 |' h1 F/ s: t6 Y  V9 ~) V
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。: d7 t% t7 w8 r' J

9 q$ b0 S" _, x回到include/common.inc.php来看看他的机制。
; M9 j: b# g& G9 o4 W7 L1 x1 }% q
  b2 j, s0 q( c1 a  Z& K
7 W! V. U% H4 [% E  M% i8 [8 W6 N4 k% B, a5 ^5 f2 K# N+ q5 u
......# Q  V( ^& ~: D
foreach(Array('_GET','_POST','_COOKIE') as $_request)% x+ ]2 R2 O6 p- [1 B7 z+ p( R* N& k
{
6 `3 z2 H0 S2 u7 @$ V. {# z# o        foreach($$_request as $_k => $_v)
8 h0 B, G- f5 n4 i! y        {8 A# q4 _) U, t! Y
                if($_k == 'nvarname') ${$_k} = $_v;
" P+ B* V7 k0 {" y2 s5 K+ o: Z                else ${$_k} = _RunMagicQuotes($_v);
! f2 m0 s6 g) f% J  G+ L        }
' h/ d- c1 }. k& d3 V}! s& m0 H5 o: l
...... ; d# k! s& u2 H/ a; i: M
大概在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。暴路径:. O' N  g# L! |. R! N3 C8 i8 F& O
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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