中国网络渗透测试联盟

标题: PHPCMS 2008 最新漏洞之通杀注入漏洞 [打印本页]

作者: admin    时间: 2013-3-25 20:43
标题: PHPCMS 2008 最新漏洞之通杀注入漏洞
0×01 前沿4 u! @1 R' n/ ~! t! c5 e' f; m

9 I" A7 Q9 l4 D% b1 ]& |' i/ Y      Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms  采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms  团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms  得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。
) Z' U1 K$ T5 e9 M& _' M5 h6 |
$ u" R& M) ?" P0×02 写在前面的话
) Y2 u+ r& i! P* M. ~2 o1 y, u. e
7 @0 l9 u1 }' _    phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题' d& m+ e* @* T$ r* u( D: t

7 F9 N) V. k# o, ]6 [( }6 k这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强9 P# J) T: R8 r5 w* g0 m+ I

! u; d+ \7 L4 u6 b& z) T" K$ Y这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论' {5 J% V  P. |& J8 D3 r
5 j1 Y0 J( h) S! s1 S, l3 M" W
0×03 路径? ? ?
2 W3 N6 D+ k  R' N8 m' @
9 x/ \; O7 h9 y9 F3 M% N) z    在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件( @: W. W/ I4 [: \$ r

( [: U6 {$ ]7 ?% F$dbclass = 'db_'.DB_DATABASE; require $dbclass.'.class.php'; $db = new $dbclass; $db->connect(DB_HOST, DB_USER, DB_PW, DB_NAME, DB_PCONNECT, DB_CHARSET); require 'session_'.SESSION_STORAGE.'.class.php'; $session = new session(); session_set_cookie_params(0, COOKIE_PATH, COOKIE_DOMAIN); if($_REQUEST) { if(MAGIC_QUOTES_GPC) { $_REQUEST = new_stripslashes($_REQUEST); if($_COOKIE) $_COOKIE = new_stripslashes($_COOKIE); extract($db->escape($_REQUEST), EXTR_SKIP); } else { $_POST = $db->escape($_POST); $_GET = $db->escape($_GET); $_COOKIE = $db->escape($_COOKIE); @extract($_POST,EXTR_SKIP); @extract($_GET,EXTR_SKIP); @extract($_COOKIE,EXTR_SKIP); } if(!defined('IN_ADMIN')) $_REQUEST = filter_xss($_REQUEST, ALLOWED_HTMLTAGS); if($_COOKIE) $db->escape($_COOKIE); } if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }
' d8 X/ J+ f( }+ T% i9 W1 W& i1 c$ ^  X* u9 _& @; J* b
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的* V8 t, N4 c& `2 C8 S2 S
2 z# X+ Y5 @- A0 }
然后就是将我们传进来的参数进行变量化
# j( l: F. V0 b3 U) y5 e- ]% ]# |
) r0 G6 j$ Q, W) k* b! P这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
+ u' E; k: L. h' h, F
/ u! B5 \; z$ w: X5 B但是接下来这行呢?5 A$ }+ f7 i0 T; t

" y1 u  J( G+ r) H# p3 p$ S " X/ r/ a+ u/ u" j- Y+ Q
% v8 l5 f' \. k; k% m2 o
if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }
* M  t4 Z9 T. I1 ~
5 ^& C5 N, c0 [  M6 u 4 O2 n7 u( m, M+ Y9 W2 r& m

- B' [5 C( ]0 l  \2 W看看这里?
. ~/ N! H7 `+ ]
1 k! {. e! `  l这里的QUERY_STRING来自前面
: c3 }1 j: K! V" G
( m9 C- _! i0 v+ F . R5 g/ g9 X, {* H! b4 l# M5 B+ J; o
! s. }# q4 e6 ?7 q1 B
define('IP', ip()); define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''); define('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : preg_replace("/(.*)\.php(.*)/i", "\\1.php", $_SERVER['PHP_SELF'])); define('QUERY_STRING', safe_replace($_SERVER['QUERY_STRING']));; C% |$ v/ Z! B1 L
这里有个过滤,但是不影响4 S7 H' {5 u6 k2 _
, Q. T4 {6 B( F; }" ]; @  x1 i
如果我们在这里进行覆盖这个db变量呢
/ @7 H: B" H1 Z2 n# s: [: a1 a. g
1 _) {- B( l6 ^+ b( P* u因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));
. z8 r. _" U, C3 |5 V$ C0 S- j9 Y/ ~. h+ U
可以将我们传进去的/ - 进行替换8 `2 R* p' a& G# r% c% E8 h

/ E4 x" x( W  G2 W! b  ~* @所以我们如果提交如下字符
$ {9 h* Z8 u% G  X' i# d7 X; X1 o$ p
http://localhost/phpcms/index.php?db-5/gid-xd.html6 }4 X7 o% ?7 _# M+ U

7 O* p( F) f/ m" B/ t3 h他由于这个db被覆盖就会出错,所以物理路径就爆出来了2 R! u, r  G5 B6 ~
+ x. J  ]; D& `
0×04  SQL注入!!!0 \* Q4 w8 t- C( A0 j, q1 k7 ~
7 \- D" t) y7 y, r, H# e
  在c.php中. ^; i* ~; {& a

! J% p' C6 q$ s. q0 F/ T / \+ W9 m: `: t% l! n" k( m
4 H3 P! ]2 O* q# ?9 h) W7 O6 M
<?php require './ads/include/common.inc.php'; $id = intval($id); $ads = $c_ads->get_info($id); if($ads) { $db->query("UPDATE ".DB_PRE."ads SET `clicks`=clicks+1 WHERE adsid=".$ads['adsid']); $info['username'] = $_username; $info['clicktime'] = time(); $info['ip'] = IP; $info['adsid'] = $id; $info['referer'] = HTTP_REFERER; $year = date('ym',TIME); $table = DB_PRE.'ads_'.$year; $table_status = $db->table_status($table); if(!$table_status) { include MOD_ROOT.'include/create.table.php'; } $db->insert($table, $info); $url = strpos($ads['linkurl'], 'http://')===FALSE ? 'http://'.$ads['linkurl'] : $ads['linkurl']; } - x+ n( ~# w1 Y$ K

  _# l. W& X) p! f. m+ y; H
* Z/ @4 u: V' \# u  |% J/ S% L/ e. [6 K3 `, S# y( W+ f
注意这里的HTTP_REFERER这个常量) \- Q& B* p7 S) T0 C3 p% v( L; L
7 H' q+ u$ U5 ?- _, ]
这里的常量是通过前面的common.inc.php定义好的
. ^! o, N8 B4 c- O3 A/ C& Z6 q3 Q; b% e% ]$ N' e2 ~) S4 H+ N$ u
define(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);
. G5 k$ V6 D5 D; x. R7 K2 L; G) n3 A2 |6 u1 O3 ^
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我  B% k7 w  x2 H7 V

) v. L8 |/ i5 g# d" @9 j( n# B, @然后
( w/ u( ~; r7 w2 E1 h3 J
+ W$ w: f& E4 R. N. a- C" E$db->insert($table, $info);9 Q$ e$ ^0 z% E3 o, B/ ]* k  R
我们来看一下它这里的操作1 Q8 R0 Y8 Y0 a1 q+ s% ?

' T# q( Y+ ]% Z' z6 vfunction insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); } $ A& d7 G: M' x

0 O6 d+ [, u+ l$ o; J; {/ c所以你懂的
9 [, [3 l/ g/ L9 E* d6 ?& v/ P( m* i5 A

5 ^: e: S' x" ]. j, @
" d8 E& ?# S6 c. A2 I附EXP:http://pan.baidu.com/share/link?shareid=468231&uk=4045637737
0 r! J1 t9 @6 K' F/ R: x9 h4 }% p! G5 E% P% }) V! b$ V
: t/ J6 W% Q- s
3 i* I2 }9 ]' D' D1 @





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