概述:
刚入手学习代码审计、试着练习和读懂代码,慢慢的一点点的接触审计相关的知识,通过“国家信息安全漏洞库”或许部分漏洞标题和内容信息试着着手学习。
HongCMS是一套开源的轻量级内容管理系统(CMS)。
相关信息:
版本:HongCMS_v3.0.0
CNNVD链接地址:http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-201806-1362
工具:notepad++ 、Seay源代码审计系统
0x01:
通过目录大致了解目录结构、其中相关功能:前台(controllers)、install(安装)、public(公共文件)、system(核心相关加载)、includes(功能)。
0x02:
入口文件: /index.php
跟进文件:/includes/core.php
第8行:
@include(ROOT . 'config/config.php'); 加载数据库配置文件
第11-17行:主要加载相关的模板文件
function __autoload($class){
if($class{0} === "S"){
$file = ROOT . "system/plugins/$class.class.php"; //自动加载系统扩展类
}else{
//自动加载模型, 模型类名: name, 文件名必须小写, 文件路径如: ./models/name.php
$file ="./models/$class.php";
}
require_once($file);
}
第22-23行:
require(ROOT . 'config/settings.php');
require(ROOT . 'system/APP.php'); //加载核心文件
跟进文件:/system/APP.php
第134~170行:关键run方法部分
public static function run(){
$splitFlag = preg_quote(self::$splitFlag,"/");
$path_array = array();
$path = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
if(!empty($path)){
if($path[0]=="/") $path=strtolower(substr($path,1));
$path_array = preg_split("/[$splitFlag\/]/",$path,-1);
}
$controller = !empty($path_array[0]) ? $path_array[0] : self::$defaultController ;
$action = !empty($path_array[1]) ? $path_array[1] : self::$defaultAction ;
$app_file = self::$appDir . "controllers/" . $controller . ".php";
if(!is_file($app_file)){
self::debug("file[$app_file] does not exists.", $controller);
return false;
}else{
require_once(realpath($app_file));
}
$classname = 'c_' . $controller;
if(!class_exists($classname, false)){
self::debug("class[$classname] does not exists.", $controller);
return false;
}
$path_array[0] = $controller;
$path_array[1] = $action;
$classInstance = new $classname($path_array);
if(!method_exists($classInstance,$action)){
self::debug("method[$action] does not exists in class[$classname].", $controller);
return false;
}
return call_user_func(array(&$classInstance,$action),$path_array);
}
其中加载的是前台公共、相关news、product 前台新闻文章展示。
0x03:
这套系统前台相关功能不存相关的利用漏洞、这里记录下自己阅读的过程。
$_GET['id'] 进入以后首先通过构造函数__construct 首先处理 -->ForceIntFrom()函数 跟进:
第178~187行:/includes/functions.global.php
function ForceIntFrom($VariableName, $DefaultValue = 0) {
if (isset($_GET[$VariableName])) {
return ForceInt($_GET[$VariableName], $DefaultValue);
} elseif (isset($_POST[$VariableName])) {
return ForceInt($_POST[$VariableName], $DefaultValue);
} else {
return $DefaultValue;
}
}
该函数的主要用途是鉴别函数传进来是以$_GET、$_POST,继续跟进ForceInt。
第147~150行:
function ForceInt($InValue, $DefaultValue = 0) {
$iReturn = intval($InValue);
return ($iReturn == 0) ? $DefaultValue : $iReturn;
}
该函数主要作用是对$_GET、$_POST传进来的$InValue做一个intval整数值处理。
通过以上阅读和学习、前台仅有的相关功能文件只有唯一的$_GET['id']一个变量、而且做了数字型的相关处理,不存在漏洞(自己还是比较菜所有没有审计出其他问题)