中国网络渗透测试联盟
标题:
PHPCMS 2008 最新漏洞之通杀注入漏洞
[打印本页]
作者:
admin
时间:
2013-3-25 20:43
标题:
PHPCMS 2008 最新漏洞之通杀注入漏洞
0×01 前沿
! F; M+ [3 T& u3 o5 l
) j/ Y: O3 B. _0 ?' M+ I6 J; ~
Phpcms2008 是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个开源的 PHP 开发平台。Phpcms 采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 Phpcms 团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得 Phpcms 得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。
: _; s9 @. j' v0 V! b+ C; Z f
! f' U, C4 k8 t( R, H3 ]$ c0 n
0×02 写在前面的话
+ Q) q+ u# B, B2 b
4 H1 L4 x$ l6 b% h
phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
$ E8 Y2 q! z8 h2 N& f! d
' S1 Z7 [% X) h+ S. h
这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强
3 u0 b5 Y1 M) E+ N7 u: W \7 n
7 D: {& ?! H' n) o3 X( S
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论
5 H% r- c( v' l3 R5 Y
, s# o# U) Z* [8 `$ c$ j/ ]
0×03 路径? ? ?
8 G/ Y9 B8 b; L! Z
/ t6 @3 I" j: x: U, a5 |
在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件
0 m, o* k& c" h) d; }5 n
x& r+ c; f- e% X" j/ T
$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])); }
" g8 H) B7 Q0 ?) N9 V
/ Q9 f$ ^6 M; X. r* N$ ~+ |
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
, E/ [- j3 u, o/ f) \7 s9 N4 x
) z% i' H3 {4 O6 ~# |
然后就是将我们传进来的参数进行变量化
, ]! d6 ?9 @9 }2 i
! X6 `" N/ X6 A, q* [5 X
这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
* h9 M( ^. |6 Z
- c) k$ J& W* t2 F& y+ \0 M
但是接下来这行呢?
8 Z8 H+ R4 V# m1 a( S
+ @/ i n6 M8 o6 M0 s
$ v3 W2 F3 ?- X
: q$ e! U* V9 _& V' L' w) O
if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar)) { parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1])); }
- W6 X1 |7 ~2 A0 b' B- f
8 R$ i X& f- Q9 C! }" |
2 B$ F. i* L1 W; u: l8 w6 X
& i, L9 o: d! [1 k
看看这里?
/ k" h2 R. R# v* a
% L3 }6 U+ i! ~9 r% C8 I
这里的QUERY_STRING来自前面
+ h' b, @4 J8 \
! m3 u& s) Z7 A9 }8 C4 L
( v; o9 G+ U) {! w, Q7 }
' o0 N- e7 ]& Y6 [, g
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']));
) u; z( L& u z: N
这里有个过滤,但是不影响
" n1 m* x- c5 m+ B2 s- N# x' Y8 h7 Z
( O4 v4 `7 F, N+ ~1 e+ J3 y
如果我们在这里进行覆盖这个db变量呢
5 N9 V9 s4 e: s7 j/ D) W0 |' _; |
$ [# Z- w* D- O1 g/ n2 [/ T' L2 I2 |
因为这里 parse_str(str_replace(array(‘/’, ’-', ’ ’), array(‘&’, ’=', ”), $urlvar[1]));
! O4 q+ ^7 G# f# K- B
6 T) L6 i4 A3 H2 q1 N5 q* s( i( D, l
可以将我们传进去的/ - 进行替换
1 q7 M1 @9 r0 `4 | I# ~: K' g
6 m3 p3 V g0 Y, g! X& m
所以我们如果提交如下字符
: j% |0 {5 }3 i, Q& t
7 Q. [: \$ @( E4 h. l. p; ~
http://localhost/phpcms/index.php?db-5/gid-xd.html
* S* l: t, O1 x3 O2 Y- B
- p& O. N: l' Q* D' V
他由于这个db被覆盖就会出错,所以物理路径就爆出来了
8 C Y9 [+ d4 `# T$ q2 X2 N; _) s
& Y$ m$ \; z1 U: f$ x# ?
0×04 SQL注入!!!
) u( @% `! @! P2 F+ q0 V a' d
7 t5 H4 _) E4 h' F! L3 V; G, T9 m; _
在c.php中
8 D& G0 g0 w& ^4 V% E! _. [
; i4 E& _4 m% J3 v4 A0 i/ e
) M& }# @3 ^) b- l
+ x8 u5 U3 I. Z$ y
<?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']; }
$ ? N) L1 z% q8 K& z" j1 N
. X; H, z2 k+ j' a- y
$ o6 v# h9 t! G$ H
; J& K' f. q5 _$ r/ z2 }
注意这里的HTTP_REFERER这个常量
& f- D* J5 d8 U* |4 Y$ n5 q/ y! ^
9 G0 Y# q1 `* l/ k2 ?
这里的常量是通过前面的common.inc.php定义好的
; k3 z- r0 @! n
7 T4 m; q# y6 ~9 K6 R/ j0 L. c
define(‘HTTP_REFERER’, isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ”);
* H6 W& t& o. c) V* M ?
2 A2 z' |. \% u! t* O
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我
7 c5 j$ x( L3 ^
~ Q4 x% S& J6 \& h, w( E
然后
6 V- U; r/ U( c F& i7 c8 L3 b
F3 @$ s1 `/ y& w
$db->insert($table, $info);
+ @6 Z; b1 K- c' S
我们来看一下它这里的操作
1 C; C- @- k- z7 ^' ^
' h8 _6 O% `4 |" s% w1 f' j
function insert($tablename, $array) { $this->check_fields($tablename, $array); return $this->query("INSERT INTO `$tablename`(`".implode('`,`', array_keys($array))."`) VALUES('".implode("','", $array)."')"); }
! V* P3 p* y7 i+ F) S7 O: i
$ P) ?( \. S5 N; s2 c k
所以你懂的
. w& d) Z+ e/ e5 y
$ q4 M) }4 r$ o& k0 S* Z
: y/ J& N ?, _" u1 e0 U' n$ _
7 \& I$ a* _: S" }
附EXP:
http://pan.baidu.com/share/link?shareid=468231&uk=4045637737
( s3 h2 |, V; y4 `3 L
8 \& u; f6 R: R# y( e
" D2 |& f' s: B0 T0 @; \$ K
$ t8 j2 Y1 ?2 {. ^4 u* U
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2