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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
; S; e4 R* n+ Z) O/ Z: x( n9 G2 K; n" O& C/ K# k5 h
出现漏洞的两个文件为:
1 J; i1 E/ X& ]! w$ n" hInclude/payment/alipay.php
- ?9 H( P1 ^: Y: _) pInclude/payment/yeepay.php. p  x: N  M. a6 n% ^# j5 p+ }
漏洞均出现在respond方法里,估计这两个文件是临时工写的。5 {. ]& W) |& n0 o/ r: ^% |
' ^9 M5 P7 }4 q) U7 V0 y9 q# T
Include/payment/alipay.php, g9 i: O9 T3 z$ }7 \9 N
* r# S; X: }9 C# q
......
* b  K# p/ u/ {. q. I   function respond(), O. R! T) ^% w5 O5 E* m/ }
    {
: N7 W* z1 g) V) A        if (!empty($_POST))
. _( ?4 i% ]- ]. k        {
; Q2 ~3 Q" N% I' b7 k            foreach($_POST as $key => $data)
* W! U% t* Q' S4 M            {
. b( Z7 E  S9 X0 u& s) t4 P1 ~                $_GET[$key] = $data;
* p4 b# ^' i& u8 N1 X9 M6 j            }) v7 G0 s; D; _2 u3 v
        }
/ k6 d3 m: V. X# O" k. R+ n        /* 引入配置文件 */
8 a/ m) k: m! q& ]) \$ |. S" u        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';9 ?7 }% |$ q1 V* C( t$ T
......
) f/ z8 t* V1 K9 j
  j8 A& K- x' C$ a8 `) p& ]' k( g3 j6 U3 g% c6 Z
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。. I: f3 J0 i, K* C" ^7 B) [* m

$ F! V3 G: H+ `" t1 P2 `6 j- P1 y( EInclude/payment/yeepay.php
  Y) R3 |: A5 u9 I. j% _/ n6 Q3 o5 V5 u, ~3 [% G
0 ^, U/ w+ |, n9 P! D
6 k; u+ W* [+ A1 q2 E8 I  `5 F
......
2 d6 R& T% Y$ i" N2 G* S    function respond(), E' Z( |. b. z; W
    {
3 }; c: n4 X$ S; Y& I( D8 `" R6 | # A7 x& b" _8 `3 l3 d8 y1 K0 f$ F
        /* 引入配置文件 */* a  }* h, p. N* M
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';, f. Z6 G' R$ }) K+ P, u0 |
4 ?; }* q+ c; C% {$ ?6 _0 W; a$ z
        $p1_MerId = trim($payment['yp_account']);
+ d+ q6 U6 L4 ]7 B! M% W2 G$ m) K! {        $merchantKey = trim($payment['yp_key']);
/ F: V. @3 \: d, L* K$ O9 V3 B......
, P+ ^* s6 |* h2 }* X
# l! {  U; [8 t" @( j& [4 Y2 C1 A8 A5 C9 h& E
# i) I2 T1 L- Y; s
2 I( m0 Z$ S- y+ ]+ D( D" F
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。% q- [' B9 z& x

! z  W' D# K+ x6 F这两个方法在plus/carbuyaction.php文件调用。
' s% N6 h$ d2 ]* G
. L( }- @5 f( P( f. `+ x$ rplus/carbuyaction.php* @$ ^5 ]2 i0 ^8 w5 `3 e

( S* X% k+ H4 T, `7 G......2 m) ~9 U* S9 d9 ]7 v4 z2 ^  `
} else if ($dopost == 'return') {( N, Z) C( v" }7 |1 c% s/ P+ t
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');! I% p: @* A) L$ @4 b
    if (in_array($code, $write_list))8 M  K) y) O5 @2 v; ]& u. B
    {) \6 S# P% c* b8 q/ t! X2 q
        require_once DEDEINC.'/payment/'.$code.'.php';, r# g& O6 w: k( ^7 @3 d
        $pay = new $code;  c& a4 f1 r; J
        $msg=$pay->respond();" p% D4 f- W$ A# q4 p; c% u: }6 p
        ShowMsg($msg, "javascript:;", 0, 3000);! X1 l  i3 S) l6 d$ ^
        exit();  9 Q- U& A" I. p6 M5 w& T! Y
    } else {) \$ |4 I* C* N
        exit('Error:File Type Can\'t Recognized!');. I2 b+ L) y+ g/ z
    }
( x7 x& B) E' Y( n7 t}
% _6 ~; |  B0 m! y/ f2 O6 n4 m5 i" F; Q...... 1 W* ]6 I: [/ f

$ ^* B, n2 k+ V  q  E6 W& ~: K# l: C
' W1 ?* v/ ]1 N' W9 m 1 |# s7 w# M# s& B! R# d3 P
# H) `; e8 B9 [

6 J  V; C3 r' \1 J7 l7 V6 r0 l! e- {  O  p1 q
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
0 \  n7 e- v  j3 G, j0 t所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。( y3 G" B7 x/ ], Y1 ~* {" Y

, f& z8 t7 E) W# F$ W% [9 H3 J4 H回到include/common.inc.php来看看他的机制。# W* J8 a( O2 c; q/ S( o
) F0 f7 X) J% H, z

/ v) g1 [: t2 c* M  i* e$ T( |5 {+ O4 t$ a( o2 G! K- O
....../ e2 \8 O2 i5 Z+ x3 G0 d( ~4 A* i" h
foreach(Array('_GET','_POST','_COOKIE') as $_request)
2 D) U' `9 _/ G' q{
) }/ r* B& k4 [, A/ F        foreach($$_request as $_k => $_v)
: {( ~: s" N% Z$ T        {
; y- y& ^4 s/ Q7 Y1 Y4 _                if($_k == 'nvarname') ${$_k} = $_v;
: S! p1 s. `0 p/ u# ?/ U                else ${$_k} = _RunMagicQuotes($_v);
  y8 v, g/ z3 Z, [  D) W4 W  ?        }
* k1 \( O6 u( N* @1 b7 F, f# b}: H9 P! W5 e8 F2 ?5 l4 }
...... " f6 r6 t8 A$ l. V' }
大概在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。暴路径:
5 H3 A" J+ h: z! a8 R由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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