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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-25 20:43:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0×01 前沿
1 K! I0 s) r9 f, U6 j) w/ m8 P& h9 n% m; m. w+ ], F9 z2 e* H
      Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms  采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms  团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms  得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。. G: a9 A/ x8 C* h8 \4 N
* d% D6 l* b5 ^# v
0×02 写在前面的话3 L" r: s( x8 Y
- B9 V! l2 X! q
    phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题. k8 l0 U# {! j

' e  c- G, a, g( H. x+ s这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强
+ y* o# f! k: r" [0 f! {0 V1 B8 X' u0 y4 m$ _0 a0 N
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论9 C+ T1 M/ P1 |' `" y" v

! o; @9 {3 s, a0×03 路径? ? ?4 I6 W  ^4 f- G/ x" H
3 n& t' q6 K' P: {
    在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件
; c, G6 @+ a$ r% F
$ L$ y  y2 ~( {, a/ M$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])); } , r7 t7 ]7 ?7 I- h9 N: z! C

. X8 a$ A" ?- Z) v, H) Q: u: b这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
& ^5 K  Z, }! d2 }3 R2 D9 o  F9 w4 `! N% s& D
然后就是将我们传进来的参数进行变量化3 B: }; i  \. M' o. ]2 g

" Y3 t1 ^; d! `4 q6 j" A, y- l这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量5 J7 ?/ D% ]& `% S$ Z
' t1 ?8 d& R( t1 A0 _
但是接下来这行呢?& m( i- b/ `9 l5 `
1 s0 W9 Z5 J9 d! f! H  S, z8 K

, @% Y9 p5 Z$ i/ F6 Y1 b6 w5 X
" x, }7 t  p/ s! Vif(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }   E9 Q" a6 A; E: m' z
! s4 w) `" r& U8 g

$ X- J7 I$ _; v3 T" _, ^: B* Z: a4 E4 a2 g  M6 l# }1 Z# }
看看这里?$ p: H  g/ }1 y( a0 U$ q0 {3 N

: J5 K. z0 G9 B7 D这里的QUERY_STRING来自前面
5 H8 i5 I+ {" X% U9 t
( j& q1 ]9 {3 Q% m% G * L, a2 ?. h" S$ L! t* g$ ?

, U% x: U: r+ ?/ r/ P; G6 Zdefine('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']));4 L5 r+ N- H5 x9 p
这里有个过滤,但是不影响# {5 S+ Y  K- K% a1 c5 [
3 ~+ ^1 Q+ {3 `( c$ _* r# u
如果我们在这里进行覆盖这个db变量呢7 @% a, f8 H# D9 Y& E% y! S8 O' K

6 t& l4 G& `0 g0 p因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));2 q1 A2 E  q% ^7 [$ _. m
1 x- m; y/ A2 l6 y2 Y' h4 K( j
可以将我们传进去的/ - 进行替换
/ y, n( x. x0 }1 x/ W% Y2 a2 a! L% q+ L4 @, a- P& E; X+ ?
所以我们如果提交如下字符! I3 G& ~8 b/ c
( l9 B$ d! D; g0 S
http://localhost/phpcms/index.php?db-5/gid-xd.html
& q1 s  S) U* y0 C4 f6 ^% k1 I2 b- n9 }% i
他由于这个db被覆盖就会出错,所以物理路径就爆出来了
, `2 W6 ~1 {) C: B( w" p1 H, U  J
$ k9 |9 Z$ N( v* _0×04  SQL注入!!!
! x# k  |  s; W# I2 @' T
0 }2 F% o. `/ R# M: B. \  在c.php中' W  M9 i4 ]9 L0 G& V
: u+ i4 X; u, c1 X) {

1 E& c+ x, X9 j, t. _7 e# f# q/ O( c2 P& n( e8 X
<?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']; } 7 `" w" q$ ?0 P
0 B/ x$ ]+ w* D
- |/ ^" C/ Z: f' J0 A" I

1 q# w  w$ a( `5 I注意这里的HTTP_REFERER这个常量
1 }- F6 ^- V0 f8 H; {* c3 l
/ l& E  N2 s; w; D这里的常量是通过前面的common.inc.php定义好的
3 ?/ `  `3 |) b, f9 B5 Z4 A
" X1 K; a6 `1 X; [: m1 n! z1 n  jdefine(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);
/ h7 n* }4 d* h9 J
, A" t) u2 a/ l- O没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我1 e- R) a/ {7 c) ]* r# V: T
. v" J0 Z* m- n7 V
然后
; N. @6 |" ?) v/ _8 @9 q; g) d! X# S+ I8 v9 ~6 C; v4 [5 a
$db->insert($table, $info);
( ?1 u+ C0 E% I我们来看一下它这里的操作/ m% j) ]2 g2 m# G+ |

# {3 q, P- r7 ?6 |3 Tfunction insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); } ! x* U5 O% u0 }2 i( H
7 I# a3 m3 V% q* R: t, A. B% G
所以你懂的7 w) x) M& A, m, B  l
/ y  q1 k( w2 C( X, I* f# j
: u# r' ~" j8 M( v5 p! `
- L7 f' [; \% `  r; {" d
附EXP:http://pan.baidu.com/share/link?shareid=468231&uk=40456377372 [2 H# W& r8 _9 @5 l/ G
& c1 \2 r( C/ z  ^1 V) D

5 g; l+ w+ i8 @! W
$ Y* R" E- G/ p0 W; U  Q
回复

使用道具 举报

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

本版积分规则

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