本文章来给大家介绍phpcms 2008 最新漏洞图文测试详解,有需要了解的同学可进入参考参考。
phpcms2008 是一款基于 php+mysql 架构的网站内容管理系统,也是一个开源的 php 开发平台。phpcms 采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。3年来,凭借 phpcms 团队长期积累的丰富的web开发及数据库经验和勇于创新追求完美的设计理念,使得 phpcms 得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。
0x02 写在前面的话
phpcms 2008 这是我看第二次代码了,之前已经发现了一些问题,只是没放出来,这次稍微仔细看了看,又发现了一些问题
这次就放2个吧,其中啥啥的getshell暂时就不会放了,比起v9来说,2008的安全性能确实差很多,模块化以及代码严谨程度也没有v9强
这次还没把代码看完,只看完几个页面,就先放2个有问题的地方,如果有更好的方式,到时候一起讨论
0x03 路径? ? ?
在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件
$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);
}
//echo query_string;
if(query_string && strpos(query_string, ‘=’) === false && preg_match(“/^(.*).(htm|html|shtm|shtml)$/”, query_string, $urlvar))
{
//var_dump($urlvar[1]);
//echo ‘test’;
parse_str(str_replace(array(‘/’, ‘-‘, ‘ ‘), array(‘&’, ‘=’, ”), $urlvar[1]));
}
这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
然后就是将我们传进来的参数进行变量化
这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
但是接下来这行呢?
if(query_string && strpos(query_string, ‘=’) === false && preg_match(“/^(.*).(htm|html|shtm|shtml)$/”, query_string, $urlvar))
{
//var_dump($urlvar[1]);
//echo ‘test’;
parse_str(str_replace(array(‘/’, ‘-‘, ‘ ‘), array(‘&’, ‘=’, ”), $urlvar[1]));
}
看看这里?
这里的query_string来自前面
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’]));
这里有个过滤,但是不影响
如果我们在这里进行覆盖这个db变量呢
因为这里 parse_str(str_replace(array(‘/’, ‘-‘, ‘ ‘), array(‘&’, ‘=’, ”), $urlvar[1]));
可以将我们传进去的/ – 进行替换
所以我们如果提交如下字符
http://localhost/phpcms/index.php?db-5/gid-xd.html
他由于这个db被覆盖就会出错,所以物理路径就爆出来了
0x04 sql注入!!!
在c.php中
$db->query(“update “.db_pre.”ads set `clicks`=clicks+1 where adsadsid’]);
$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);
//echo ‘test’;
if(!$table_status) {
include mod_root.’include/create.table.php’;
}
$db->insert($table, $info);
注意这里的http_referer这个常量
这里的常量是通过前面的common.inc.php定义好的
define(‘http_referer’, isset($_server[‘http_referer’]) ? $_server[‘http_referer’] : ”);
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈…别骂我
然后
$db->insert($table, $info);
我们来看一下它这里的操作
function insert($tablename, $array)
{
$this->check_fields($tablename, $array);
return $this->query(“insert into `$tablename`(“`.implode(‘`,`’, array_keys($array)).”`) values(‘”.implode(“‘,'”, $array).”‘)”);
//echo “insert into `$tablename`(“`.implode(‘`,`’, array_keys($array)).”`) values(‘”.implode(“‘,'”, $array).”‘)”;
}
所以你懂的
http://www.bkjia.com/phpjc/629621.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/629621.htmltecharticle本文章来给大家介绍phpcms 2008 最新漏洞图文测试详解,有需要了解的同学可进入参考参考。 phpcms2008 是一款基于 php+mysql 架构的网站内容管理…