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

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

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

$ Z7 d& e  V0 v6 T- m6 X# H( y    phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
4 s/ \0 O' Y0 x1 Q; N; a9 Q. |1 `8 l8 {" ?4 g* P3 D# G2 E5 M$ t
这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强, Y( x/ V' X% ?0 ^( x8 v( l
) |, |$ v' |7 ]0 j# t+ a
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论
+ p* p- N  K& x. q9 q: `. A5 r3 J( J' X3 h
0×03 路径? ? ?
' {: _) _$ o% m$ a/ X* w0 T6 x3 ~) ^) T7 C7 f
    在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件. D4 H0 Z2 V0 T8 n+ \: M

% @1 L) j$ M4 I7 n6 z$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])); }   [  M8 ~/ [4 b% V$ B9 r% F& K/ j

  g& ], s& E/ F9 Y4 G这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
4 I" T( B' J) B4 r" D# k& @" {# D1 U' g' C- p
然后就是将我们传进来的参数进行变量化
, @6 T8 f* m( X  |- \% s, @
, q+ F4 v% ~# G& g这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
& D; v/ m# q; v- @) L
) t& T1 `' d+ h6 _/ q' P! G# W8 b7 S但是接下来这行呢?; I9 Y- a9 c( D$ e$ H% ]. {& x1 \

3 f% o% h5 H! }4 |2 S# @
) a: p6 t/ o0 X" T
$ C+ b1 n3 O4 ^$ ?if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }
7 l$ [! [6 `  T8 i9 U6 N; U* z& m" D" l+ ]

& z0 q5 [' k  H8 A8 U
; Y8 p4 I' Y/ H+ o看看这里?9 }$ a2 ~" J3 g* N

% W3 l: ^4 O; C4 @+ T$ D这里的QUERY_STRING来自前面- X* I( Y& j! @0 _) }7 f6 K
7 t# u% L; M9 D' a; A0 Q) N1 I

, A: v! [- B4 Y* _( R$ x% |: f) S0 l" f
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']));
  s3 P/ M# y# y/ T这里有个过滤,但是不影响5 l; ^+ J5 H! h+ ]) M: t
8 B/ x2 r" y7 C/ ~$ r( q3 Y& _, |
如果我们在这里进行覆盖这个db变量呢6 Z" s* I! L1 C0 u2 \
: n( O  h; Y7 J& p& V3 |
因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));
) e' L; Q; N5 r% r% p! C1 @' }( C3 S
可以将我们传进去的/ - 进行替换+ T" O; }) k- B$ g, _, R) j. Q
, J, v/ b8 l5 a" d' {
所以我们如果提交如下字符
+ ]& p) h2 e+ p5 `, Y3 b8 M# f3 E
http://localhost/phpcms/index.php?db-5/gid-xd.html- P. G6 h  X, X+ M6 u0 I- C$ E
' q7 G; \' Y8 z2 ?
他由于这个db被覆盖就会出错,所以物理路径就爆出来了
  B; S! v6 i2 r3 t- U( q3 {1 Z7 C# J% ~# t2 {* X: `
0×04  SQL注入!!!/ {1 _& T0 X- |. \
/ O0 l) b, ]8 h& b
  在c.php中
0 v6 t5 B/ ^# G5 c9 l
: A% J0 D$ a9 C$ E- ? ( N4 C, ]" i. C% E! b
  U  e8 Y9 B9 J* ^$ J& ]7 D
<?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']; }
0 L2 N) Y' c4 q& G
) l# F$ {- q9 F" M
1 G6 x$ t: O1 `  Y
+ _, k2 s# C0 ~6 t. j" v4 S0 t注意这里的HTTP_REFERER这个常量
0 m+ J4 b+ r4 Y8 K
! b" l& S5 e$ ~) ]$ `# \/ N这里的常量是通过前面的common.inc.php定义好的9 T& r8 {1 {! F' J  z8 D- f6 K; w. R0 e
8 D/ b! I: _: ?  M
define(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);" M1 Q; J9 ?# C( c$ X7 Z
( T6 b& w% @$ {  @9 E6 T8 G9 k) I
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我
$ K: O* s& a! H  {7 g( |& N1 b  b0 a+ ?6 c7 T& r* N
然后0 @2 V! Y9 K# q) u/ x

" C/ l0 x  N" F. a7 G1 F2 Y$db->insert($table, $info);) u& k( N8 o; _9 T, k
我们来看一下它这里的操作3 S0 H4 L6 ]( r3 Y

+ w$ ]8 ~6 G. F2 @9 p/ Ifunction insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); }
4 v! ]+ O6 {) b5 F; q  {% n- c+ c" d# e  S, J! E+ e
所以你懂的( }* p7 G! i2 D
- d$ y$ g- t6 Q" F( k4 H0 C
1 Q  k: d. u( z/ E

5 W# e$ ^  v0 u7 O2 |+ G  F" T附EXP:http://pan.baidu.com/share/link?shareid=468231&uk=40456377378 ?9 g* U$ Q, g5 t( p

* [% `+ }+ c; X  m$ ?
/ W  n; I6 \% D9 N
" u5 X4 A$ ~4 u  \* t' a$ ]
回复

使用道具 举报

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

本版积分规则

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