程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHPCMS 2008 最新漏洞demo測試詳解

PHPCMS 2008 最新漏洞demo測試詳解

編輯:關於PHP編程

本文章來給大家介紹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被覆蓋就會出錯,所以物理路徑就爆出來了 phpcms漏洞 0x04 SQL注入!!!
在c.php中
$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);
//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)."')";
}
所以你懂的
phpcms漏洞

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved