中国网络渗透测试联盟
标题:
PHPCMS 2008 最新漏洞之通杀注入漏洞
[打印本页]
作者:
admin
时间:
2013-3-25 20:43
标题:
PHPCMS 2008 最新漏洞之通杀注入漏洞
0×01 前沿
- R5 R/ H& X! P) E; x
' | a+ X5 Z/ D7 E
Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms 采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms 团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms 得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。
9 |% P8 z3 {) e$ ~7 z
$ P1 \: N0 X3 | D m7 m3 v
0×02 写在前面的话
4 E% [% W: |! M* Y
8 t& P" U0 ^* A; [ W I' K; K' E# i
phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
/ t: d. q+ P: U, e# X
: @% |+ U' q6 W8 Y7 Y! ~
这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强
' x9 Q3 O, ?1 a% B$ t, e
. Q; N P2 p$ _; C8 |' q! a
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论
+ e% a/ F0 Z' ?1 Z
/ Y/ s1 u5 a7 p' X: n8 n) u
0×03 路径? ? ?
- i. B* p8 E$ N1 V7 J! v
. C/ s/ F0 N' Y8 Z" `8 ]4 o. W& `
在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件
- k5 y/ ?# m0 P6 k( @
: E) l2 Z2 T* N8 @* ^) N- a: y+ c p2 ?
$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])); }
. |7 ]: X4 i E
; x3 G: x: r$ e1 R! {( {
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
6 H0 D/ |8 h1 B
; {0 u9 Z# U- @7 d- O
然后就是将我们传进来的参数进行变量化
. G J$ [" J I% s8 X) i
5 `# f& D: n2 e9 y7 j. A' ]
这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
. a2 _2 T, f2 \& J' w( R; k! R
5 ?% h2 r& J0 n* w% q7 h1 _, I
但是接下来这行呢?
5 l7 @- L9 w/ g+ o( h) w, D
; A9 O7 b+ W2 [, {
& P& S X0 y$ O% T
6 [% Y O' |, c( Y* Q
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 x& v% I/ e7 _/ u$ |- ]
( F x4 a" V+ r5 V# `
( E: R9 d+ _% L
0 c9 g. K- K9 X$ Y$ k
看看这里?
& [4 K& F j6 |) W" q) @" \
X ~4 g1 @' h& S- }# u0 E
这里的QUERY_STRING来自前面
2 ^/ d& Q/ d, A
1 O! T( o& i/ k& C
! I. M5 z- U; P" V2 J, H
" y/ l; \$ o. Y4 H' n: m. T4 n
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']));
6 L) G8 {# d9 c
这里有个过滤,但是不影响
; ?9 ^; |4 v& s. X
* p& n1 y" c5 y' @
如果我们在这里进行覆盖这个db变量呢
/ ?+ b/ ?9 y0 i+ p5 s6 g' n, I
% P H! o J7 G) n$ g5 I
因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));
' T9 o" \( s( A3 N1 @$ E8 L& S( K; p
y ?+ W! W1 `- L
可以将我们传进去的/ - 进行替换
* ~& l, B, n+ e1 S
% h' _8 J" Z, a' ~
所以我们如果提交如下字符
6 N# z; k- p3 p3 X( a
2 d$ Q3 \. \. |$ q9 x
http://localhost/phpcms/index.php?db-5/gid-xd.html
0 [9 ]6 H9 T- S& c
3 F# j1 M& l- @7 @! b& w# k
他由于这个db被覆盖就会出错,所以物理路径就爆出来了
! a9 z1 V7 j9 u) F
7 F' b8 z/ b7 X* I7 t3 G
0×04 SQL注入!!!
! d% a& \2 g/ f( J. q( j
0 ?# O+ X; ]# j. H
在c.php中
0 X1 F i% V J( P# J7 n
2 }* v$ k/ ?4 P) P7 r( E- j
& m. c j* _9 C. N$ c
7 E; p' e5 O( L3 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']; }
% [: C0 D* @, o
. J! G# ]! b5 i# N: r6 G
1 b( U0 q4 t% k1 @/ l
* Z K4 I# \ [! ^# o
注意这里的HTTP_REFERER这个常量
$ Q8 ?4 R# M3 T" m# ~3 m
' X' \$ \" `2 ?: E" R6 m3 a5 _* H
这里的常量是通过前面的common.inc.php定义好的
9 `* b7 W1 j+ E$ n3 u& H
; o( r' }4 O" [6 P2 P
define(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);
8 H" }3 [# f/ i0 Z: e
3 m; ?0 d" F9 a5 ?2 ?& G
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我
+ v$ _+ ]2 {8 A% S/ b J2 b$ |* D& [' |
5 B! K: ~# _! n h2 A# z7 e
然后
# O! |+ g: N5 `& L3 [8 i
8 r, N4 T& `, x& S
$db->insert($table, $info);
& n9 `$ t: L; i. L; |' M
我们来看一下它这里的操作
8 I6 L' R. O7 E
% w& ^! c4 l/ j8 Y. |2 Y. r, I! ]
function insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); }
# O! a, P6 F! a2 e. A! h& l
1 x& q w+ t" P5 j
所以你懂的
8 R2 ] k3 b5 z6 o9 a
. t6 H1 V. K0 o: g* k
* S( F- D* F7 I Q- y, U* @$ M* {
6 ^! I. |2 A& {) ^4 G$ P
附EXP:
http://pan.baidu.com/share/link?shareid=468231&uk=4045637737
: z7 W- f! R3 @$ |% Z
$ F. F6 o2 l' z9 f* y" b( i! f- J
/ ~# ]9 g7 |( C' r \. m
) W9 C' t1 Z! M( e9 l8 t) a! y' Y
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2