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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-25 20:43:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×01 前沿: ?! k2 i* y  `9 _7 F% p
' b: @* Z: Y) o% K
      Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms  采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms  团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms  得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。
- o; c" u1 K& X; e
8 n7 `5 S8 N( c+ S0 t* t6 ~, S0×02 写在前面的话
) k9 y7 ~3 i2 I' C: h  `# F1 E0 u' |8 Z4 q
    phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
% K/ Y$ D* T2 D1 n3 f/ h8 g5 I3 T2 @% j# [- Z# E; J( k
这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强% X: h$ q# T. H6 d- c( |
1 T8 t. p! ^# g) [
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论
0 {2 L3 E% E) Z# K% F$ l% |$ S; q
! g5 p' c8 `+ ~/ A! Q. r0×03 路径? ? ?- w- B/ n! x9 k, |: G' F

- X7 e4 j0 ^5 l# m# y    在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件) g. L9 i% C; B1 h& Q
- ^* W2 v7 K% |5 C/ v4 {
$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])); }
+ z4 N: T$ e4 E8 R8 ]. H) b6 J9 X* A* R1 B; N- f! Y& l/ _
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的; A8 e% l2 V0 d0 `! R. p- I( I, z' i

+ d' P7 M5 Q0 g2 a/ Q然后就是将我们传进来的参数进行变量化" P4 s7 ?8 Z' ~; h+ E$ K4 a

4 T4 c6 F: q) h, M这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量' R! J9 c3 C6 X2 Z$ [2 a' L

( }# C* q- g5 X& F! n但是接下来这行呢?
# [* {  b5 L3 G7 x' `  j+ X# D0 p: _! a$ Y+ o" x
) V$ Z3 d8 g& f1 \

3 H0 g: J5 }0 Q' i5 _if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); } 0 J+ U1 O7 x7 h" r3 a+ p* k& ?

. c) d! n* q, p) o# L, `$ I# Z4 \ + I2 e7 ^9 X) {% o

: O/ D6 ?# T& u7 F) [. Y" }看看这里?! x5 X$ j7 l+ n. K9 b2 S6 f* y, Q

% {) ]4 N# T5 Z9 y这里的QUERY_STRING来自前面
* O7 l! a' E6 _9 U! O
5 @6 ^) s( l/ _' w% k
# a( S6 a) o, b" h
7 L8 @4 H) D& N& i! }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']));
* [7 A- }. s5 Q这里有个过滤,但是不影响) F! L, [' k  s% }" u5 x. ]
+ ~8 b5 z$ Z& X+ e/ |% L
如果我们在这里进行覆盖这个db变量呢; g6 ?1 h8 W0 y9 D6 F

1 V- ?2 S" z, j# @& r因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));
( y& L9 N4 ~5 l8 J* o  V" E4 h! s7 I+ t% Y- c* G
可以将我们传进去的/ - 进行替换
9 V! G, p5 u2 o# o9 ~. b( |3 j6 a, F
所以我们如果提交如下字符1 D: {+ x# Q9 e& w$ ~2 p0 r5 ]: I6 b
3 O2 ~' x2 I8 D) R* X
http://localhost/phpcms/index.php?db-5/gid-xd.html
# L8 \' Z# N7 F' I& n3 S) G' B: e1 `; `; Z& T% u
他由于这个db被覆盖就会出错,所以物理路径就爆出来了
7 [! G3 a3 D/ Z! b0 J7 |0 C/ ^
: ?7 |- n5 v. N7 U% u( _0×04  SQL注入!!!9 I, z: D( }" q' E) W( w% O, {+ n
  h- T0 r0 P8 F+ K8 ?8 n) y) a
  在c.php中8 m" X# t& j- A) a

7 N/ M: {" q: L  j' W( P
- B. w) N$ Q) t9 u* w9 _8 e) Y/ h* |. N' R# i" g8 e+ u! ?
<?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']; }
: J# U, I4 p3 g) _1 u5 F5 M7 i
( p: E0 e- p8 ]& t
% I$ j: j  N+ P1 Q$ n4 x8 f; P& o, H' j) s. P' `- i/ H5 j; l% X
注意这里的HTTP_REFERER这个常量
! F! o& V. w: c8 x* F2 X0 L- j( M  P- z5 [
这里的常量是通过前面的common.inc.php定义好的
0 h9 H$ E& {8 G
) e( X  X' b& u) b' udefine(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);, r9 \$ U1 Y- F4 `2 h& a
7 U. y; V3 \( I$ g3 |! v1 q
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我. p5 u; E% ~$ x) h4 `0 A

7 M$ z1 c% a- m1 r然后
; c9 V% s! Y5 v9 S4 M: U" E
/ f8 `. u4 u& M$db->insert($table, $info);* d3 @# K# U$ t2 R6 t# E6 S
我们来看一下它这里的操作* I+ y9 W1 W4 X+ ]8 s; I

4 ]3 _) [# A/ |function insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); }
0 v9 N3 @, y; Z* c) J/ U& W' Z/ A' C8 f; k- m, Y6 K
所以你懂的
  a2 p0 `' h  d, _
/ \5 e1 L6 W! p; |5 d2 C+ O; B8 `
+ [- N, n: l! @6 n- q1 e$ t" z3 t) X4 i
附EXP:http://pan.baidu.com/share/link?shareid=468231&uk=4045637737
9 o& n* V+ `4 S* o) J
2 \' C" \& y, |1 W8 m+ }3 d
& x9 \- |! F5 \' D1 L6 T  d; t* C: l5 \7 w+ I. L
回复

使用道具 举报

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

本版积分规则

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