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

PHPCMS 2008 最新漏洞之通杀注入漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-25 20:43:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×01 前沿
5 {, r" f5 k% ~1 h1 \( ?- \( u) w$ r
      Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms  采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms  团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms  得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。9 i  H. L! l4 [" [' M

6 ?  k" S" ^; j: ]6 {0×02 写在前面的话
! j4 z) I$ p8 r% ]. q: z) ?
2 i+ l# O0 r6 v$ s  W3 g    phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
( m# m. P% @* y5 w$ C- ]+ ^
+ N, C/ g7 T  ~3 j  w9 q这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强2 R" g% [7 r" i+ d( ?: x% d  K
  ^5 e, V" b! d7 I% c' u
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论
- S1 h5 G* a) L9 |, Z# _
9 o/ ~) y) P: s( ^' I# M( |0×03 路径? ? ?
+ Z: z0 e& c0 U3 a
+ ]5 E( L" q" H. C7 J; j    在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件
8 B) T; A5 Z$ g) F0 k) N4 H$ i) a) [. t5 R% ]( \) S
$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])); }
) v4 P7 ?( c! Z( b" Y0 M  N  g9 ~. U4 N
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
  `. p1 J! p; h- d* o4 `% e+ x. A; V8 J/ C0 c1 Z
然后就是将我们传进来的参数进行变量化! a' Y4 A5 z$ L; t- i; e
9 ^- Q1 Z+ R' z- M( H6 _
这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
- {3 v! Q9 y( e: |+ f9 Z; S; A$ s; _0 D9 Q5 e; Y8 A, ?
但是接下来这行呢?
. H/ H6 ~# ?& h. o+ D- I) T
% p3 T' ]/ J) [% n, j1 l8 u; T
: }) E" I; E7 K% V8 S2 L$ h7 R# D0 b3 ]4 D  n( c
if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }
: ]2 n2 Q9 M2 o: r+ k
9 w5 u3 F2 s) X, g
1 V" N6 F# {) K/ U$ J3 V7 C$ [0 |5 A8 h& d; M  l
看看这里?, R, M3 [. k( j  C
, N" o7 h9 T$ e" Z
这里的QUERY_STRING来自前面
) N. {" r" ?4 V7 }7 d" i% j. J" B) d! i6 L9 L6 j3 r# ?; n& L0 F

" t' l& F0 z0 l8 v$ G9 y/ B; s  D7 ?! X5 B; L
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']));
$ y# ^- Y1 K' G5 ?9 O! }" H这里有个过滤,但是不影响8 n- q# \5 X( p- |7 \

1 O! M/ j, a" B* }( P如果我们在这里进行覆盖这个db变量呢
) L0 F; w# J8 e8 M$ T& _# `# X- _, C  l- T, T$ Z
因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));
* [$ u3 L) ~8 u$ H: g. o/ M  e5 ]3 R
可以将我们传进去的/ - 进行替换
) k. Y5 Z6 q; G9 q; F6 {- a/ {: C- p1 d$ z7 ^/ C( i
所以我们如果提交如下字符0 X6 _  M& p* a# k, M
- W. v* |1 D$ Q2 R) z: M. }
http://localhost/phpcms/index.php?db-5/gid-xd.html5 i% E9 I. N* Z5 L
1 a0 r. D1 n( F3 u3 f6 t
他由于这个db被覆盖就会出错,所以物理路径就爆出来了; V! |6 L% R% {3 G! k0 `9 O# D

, T' D% i1 W9 x, k- N0×04  SQL注入!!!
$ a: @% n( G2 j" W& ^! I" }
0 C7 G, N7 ^- m! X  在c.php中# g4 e# R; L6 S6 W
5 `6 ]* @& G+ a' \6 y5 w

4 U# q1 x4 G" |$ _8 k! m2 B( u2 `3 ~: E0 e* p  E4 Q
<?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']; }
& t, ]( ~" r$ M/ V/ D* a% D" c0 Z( T/ U3 c& a2 m  b% k
3 A$ O8 n/ z9 i6 \
8 n( H( C1 y& k+ G7 o2 Q5 H7 h# L+ n
注意这里的HTTP_REFERER这个常量" \- U6 e# w0 `9 L

" ^$ @& D5 t, q这里的常量是通过前面的common.inc.php定义好的
/ k% K$ I8 G1 T( k
& x( `4 ]4 r% W0 s' ndefine(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);
) y5 _$ k" d3 n$ }3 A  ^# z
  s& X9 B- w  a4 d( f7 q没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我
3 }6 \9 `) G- E. `% F- h9 @7 `& B$ H; L" z" ]; p8 [* S
然后: O! @, c, I$ L

8 l# q' h& ~+ y( j0 _$db->insert($table, $info);
- X1 J9 J' ]; U" X2 d我们来看一下它这里的操作% U2 j+ M5 G6 P. \1 F$ B
/ d: ]1 `( w6 x+ h
function insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); } 1 a3 B& K1 _4 C" [3 I# e

& C6 W. f7 J9 j( V所以你懂的7 T) h) L3 n( K& V3 O. p

% B4 Z# N' y8 ~6 T 5 r! F6 S! ]8 q) D( d
# F- E  m% h2 ^7 ]% H$ f
附EXP:http://pan.baidu.com/share/link?shareid=468231&uk=4045637737
/ A1 \/ i8 @& Z2 r( N1 e( w8 [4 [: q. F. M

# a! m  K; F% I7 t7 R, w
2 t. p! `- K4 X( F) r" M
回复

使用道具 举报

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

本版积分规则

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