找回密码
 立即注册
查看: 3058|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-25 20:43:29 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
0×01 前沿
' B. X9 Q5 ]" i2 V' i. D0 o$ d- q3 w2 ^" |
      Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms  采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms  团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms  得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。
* t/ F% o4 i, N) \5 E7 V8 F' w
6 O$ `' C* ^$ J/ J0×02 写在前面的话
# C( G& n$ b5 [$ ~& j& ]# L$ Y
! z+ [# I+ K2 j8 G9 [! u    phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
! i/ ]2 `( J* P# Z8 \  y
( \0 N# [0 u6 {! _6 ]/ S这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强
) d* G- Z7 c2 Z, m! T
! H6 u6 U! D* b% K; E这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论2 {/ }0 s. O8 q2 Z/ G* z
" P: R) ]+ A5 C' v
0×03 路径? ? ?
9 W, S! `8 A; O3 }  ?4 g
% Q  F; P' ?; v" D2 ~    在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件) e- Z' q7 `1 [; [% c$ L

, E  ?$ x* }  G  A# l$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])); } : E% A: A. v2 L# s& b% @. x
& w5 Y9 r$ X1 Q* l9 g
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
8 W9 `3 ^( t" V# f
) o* ]. S9 ^! m4 ~, a7 l/ h然后就是将我们传进来的参数进行变量化
6 C# a9 O4 ^7 v- Y8 H! Y" c0 w
这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
6 S: F0 S  D5 r  a0 ?
9 F9 T( a) v, A( Z9 H& H3 Z但是接下来这行呢?- I$ }% G3 ^, \& [" Z% c
4 z7 Z( ]( Q2 Q5 |' u
6 N$ M5 f& f" c3 `7 t9 W
$ s% k3 i# B! C2 t1 `
if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }
9 M, t4 {* N6 G; t1 d! |( |' h& E. U7 P- K& c5 e& I( c0 q
+ _- _1 s; o1 ?" b$ `
( [+ z* H) w) H, s
看看这里?# f. ]3 p' s( U9 {3 i5 j" P

0 g( b3 h0 y8 L# r" [/ S  r这里的QUERY_STRING来自前面
0 e4 u; X: \1 ~
& U5 a: j8 W; O& @% A6 q. }( O ! f8 h/ Q5 F/ Q5 Z0 P

0 ^" T- ]1 L& Pdefine('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']));- o4 ^6 Y# d8 L2 y
这里有个过滤,但是不影响
6 E% u/ e2 L1 l- H, g/ A$ Q* r7 A# I$ C$ e7 B
如果我们在这里进行覆盖这个db变量呢" Z$ t; {6 M# p* ^
3 t' @- v# M6 p7 @0 l, }
因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));& ~' B0 N. i# g, T6 o

$ R- P/ [% L8 W7 u9 p4 m  Y可以将我们传进去的/ - 进行替换' {" K5 p: {* ?- N3 V

% |3 c/ t% _! B+ b4 x所以我们如果提交如下字符
; @/ N! [; X6 \6 I
" N1 d5 I* u8 U/ z+ X3 T8 `3 s3 Uhttp://localhost/phpcms/index.php?db-5/gid-xd.html
, Y2 ^  o1 @3 Z7 {
0 K) w8 f$ h2 ^" y- o0 o他由于这个db被覆盖就会出错,所以物理路径就爆出来了5 D7 C2 O7 H3 @. j. f; w9 x
. C, P( d9 _  [5 q6 x& G- U" m* R
0×04  SQL注入!!!
% n9 S8 W3 _+ c" x/ b$ U
# s: {$ A! N: L5 B% c  在c.php中, x3 S9 A8 ~. ]5 g

( H1 V8 N' d/ j 2 a/ {  E1 i# i4 r( j

. D7 t9 P4 V/ Z* D+ ]) G<?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']; } 5 T5 _0 C+ B1 V) \8 V, u* M' O
# K5 V5 Y0 j6 H& }2 v
5 v- H& v& d, E

8 N" G  V% C( ^1 W" \- C注意这里的HTTP_REFERER这个常量
2 E2 g8 ~8 b% o! Y* X. r) T: z( M
, l- h0 A9 @+ I$ |这里的常量是通过前面的common.inc.php定义好的
1 c  O5 S$ c: c: y" Z+ @- a8 X
4 m: J  Q& E/ y- Xdefine(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);' T4 F6 ?6 o* M, d, I% R

/ E. T# B7 ]: m0 ], ^* A没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我
3 e% g. ?# ]$ h; g/ {) o( X
3 [5 t$ w+ m8 G5 ~然后3 P; A6 }3 m0 n4 q

" O' S" R6 |+ g/ f$db->insert($table, $info);
' m4 f8 ^. n! m$ U! V我们来看一下它这里的操作6 {) c- i3 I$ l
* _9 D7 j( Z: n$ X) ~
function insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); }
* _9 G9 n7 ~) I( j! h: y
8 f% L" Z; i  G所以你懂的
3 y# ?& ?8 g2 x# f9 l" J2 {, ]
; X  A$ g9 M, `( r7 y6 K* C. S 9 H4 u% n9 F; o; y
' z0 j/ Y5 ?7 q% H' X8 n
附EXP:http://pan.baidu.com/share/link?shareid=468231&uk=4045637737
! H" l7 _( `# _" e" M
1 @* g7 G7 A& H% ^9 O
8 n/ i+ s8 |* h
% i0 ^$ f+ p9 _) `' Z
回复

使用道具 举报

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

本版积分规则

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