中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
/ }1 t8 H# q8 Q) T E/ p3 p
+ P# L$ V6 o$ v7 w- g* e& d8 M
出现漏洞的两个文件为:
" ?: G2 d. ^( c& }- t: b
Include/payment/alipay.php
, S& E' a; }/ d8 p) F
Include/payment/yeepay.php
2 g5 Q7 {1 T& X$ w/ c: L
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
+ n+ ]8 s# P9 R9 I+ F5 e
' M& u9 q( K0 l# d# U3 R
Include/payment/alipay.php
6 |' I; h( R9 h0 ]: i0 h
) s O+ f5 M3 l
......
6 P' k" |. ~5 i
function respond()
% z+ @! J, L5 Z/ W7 a% T- n! V' r
{
2 R! {8 M( z: t( B
if (!empty($_POST))
`9 l. g- h& M/ L6 { C
{
9 k) J6 \2 }% ~" b+ E9 w
foreach($_POST as $key => $data)
' |) @# J% G* A9 M* E `
{
6 e9 X1 _3 e- h' {9 _# J2 |
$_GET[$key] = $data;
. \% r3 @* o/ i% {
}
% \3 U3 {* F w3 z
}
; S$ F, U! J9 F0 H
/* 引入配置文件 */
$ b9 X, N' J `8 q7 j- z* J4 U- Y" e
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
U3 N* \4 r$ Y5 X6 Y: r' a
......
: |: e# P$ o4 \
# q5 M- ?, @- S0 a, p1 H
( s" t4 q/ h" A% M
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
$ R, l( H) h% |
; [' w5 D( p: |1 w5 Y
Include/payment/yeepay.php
. U5 X+ J' c% B0 T
/ ~: h3 Q& [5 t4 h1 Y0 Q' M
1 _$ h: f$ z( c1 Y8 E
$ A( m5 j4 J0 l; L! R, b
......
# F; n, y3 J- m
function respond()
, h7 z2 k( H4 N& a0 [, C1 i, ~- p' K
{
: ?! f6 K) M: Z+ B& z) P$ i
6 F$ O6 g7 p2 U. m4 {7 g/ u9 l
/* 引入配置文件 */
. }: R5 E" O$ Z: Q
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
! W) m: r2 {0 V$ F" X
8 @; w) C+ w; Q( i8 Y) f8 }2 l
$p1_MerId = trim($payment['yp_account']);
2 ~( S. ]; m. p' w, k# ^! _
$merchantKey = trim($payment['yp_key']);
8 g7 w+ G0 E7 @) ^6 y
......
2 D0 N% f, M: o7 `# x, a- Z; L5 E
) n% i1 e2 k& |3 v# B- F4 N
: q5 z) G1 X4 U# _+ |: Z
/ G2 m# y; [' g7 C2 n
( n" x! U a7 B* Z6 X3 x! I9 K
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
0 h ?8 g: G6 U" k
# p4 @$ m* J ?" A8 [/ }8 K$ y
这两个方法在plus/carbuyaction.php文件调用。
/ T1 h, F9 f* F4 p% W% Z0 m
, h$ y! h/ O6 ?3 W
plus/carbuyaction.php
/ p! o/ D, l2 V. F. V- A
% t D2 F0 o/ c$ f0 t( l+ t4 h
......
3 h/ c1 N. _9 L" r" j, ^1 R
} else if ($dopost == 'return') {
1 {) J9 r6 o3 A* v! b+ O
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
7 A! @8 U; a6 P0 G% i4 g. I) R
if (in_array($code, $write_list))
1 `" t+ Q- [, i
{
3 \" |& r V+ R( k7 r- [
require_once DEDEINC.'/payment/'.$code.'.php';
2 R3 t* ^0 O& T$ h7 L# S' j" d% b
$pay = new $code;
9 o6 Z) G* i& j$ _
$msg=$pay->respond();
) T: k p& K% B; O6 k. {/ {
ShowMsg($msg, "javascript:;", 0, 3000);
' p. ?* `; r. [, W- I: j) {- i) }: |
exit();
; D; R1 \( @2 P/ Y8 s2 ~/ b F% w
} else {
9 W, t/ a) O& @, B- d. X
exit('Error:File Type Can\'t Recognized!');
# j2 }1 p! H7 j' t
}
4 i ~& c2 a. @* O: N
}
6 e. ~% t$ J1 a7 O
......
E8 A3 [2 Y1 P
5 Y6 O; l; d% x7 X1 p1 s
# e2 [8 P( w% l% X- J
9 P0 v3 K" S1 E8 z6 g6 T, ~6 k/ R
( h; v; H$ n' R j6 X" y8 o. ?
3 T7 z8 a* E) D( U
4 B& z. z! X9 d& R. ^+ }0 S
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
: {$ D6 D& r) @* ^
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
9 I N. f0 d, Z1 e
! |& Q0 m5 C$ K% t4 X
回到include/common.inc.php来看看他的机制。
- A/ H9 K. U- i& }( c
& M' ^8 d% _' {, K+ G
9 L. t2 k. ~( U) `. }( @9 R
9 o1 \0 u, W( ^0 k/ B$ ?; s+ R% H
......
6 i! h" d4 ?1 R
foreach(Array('_GET','_POST','_COOKIE') as $_request)
' [) X7 E8 g4 [% _ Y6 y$ K2 v
{
/ X7 H; m# e2 F) C. z
foreach($$_request as $_k => $_v)
( ~! ~) ^2 ^" |/ P6 A8 ~0 j) u
{
9 U; V+ r4 f( ]% B. R8 x
if($_k == 'nvarname') ${$_k} = $_v;
+ H X* d& M9 N( ~5 K0 q" P) z6 t- ~
else ${$_k} = _RunMagicQuotes($_v);
$ P/ u, P& ~8 S
}
5 d5 y3 \+ r6 G, w1 z
}
0 z( V. L( P% v0 w: k+ l0 h+ j
......
, e; ~& H, a+ N
大概在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。暴路径:
1 \ W8 a* d* Z1 w- H: B$ M8 |
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2