某开源企业站CMS审计报告 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

某开源企业站CMS审计报告

申博_安全预警 申博 91次浏览 已收录 0个评论

媒介

近来渗入测试某站点的时刻触发了一个报错,然后发明了站点运用的CMS,百度了一下是一个国产开源的企业级CMS。从官网拉下来审了一下,再此纪录一下

进口

下面是index.php进口文件

<?php
if( !file_exists(dirname(__FILE__) . "/include/config.db.php") )
{
    header("Location:install/index.php");
    exit();
}
require_once( "include/common.inc.php" );
$mod = str_replace( '../', '', $mod );

if( empty( $mod ) )
{
    $mod = 'index';
}

$action_file = WEB_INCLUDE . '/action/' . $mod . '.php';
file_exists($action_file) && require_once($action_file);

$cls_tpl = cls_app:: get_template( $mod );
$cls_tpl->display();

?>

很罕见的cms进口情势,然则能够注意到第八即将../替换为空,这里疑心会不会存在目次穿越,能够接纳…/./如许的情势来穿越到上一层。然则第15行限定了后缀必需为php,且由于前缀也被限定因而不克不及运用zip伪协定拿shell,若是php版本为5.2能够接纳00截断包罗恣意文件,这里临时卡住,继承审计,第2行应该为设置装备摆设文件略过,跟进第7行的common.inc.php
某开源企业站CMS审计报告
common.inc.php开头先界说了很多常量,然后更改了一些php设置装备摆设,接着又引入了两个文件,跟进发明设置装备摆设了一些变量,先不论,继承向下审计common.inc.php

<?php

$req_data = array();
foreach( array('_GET', '_POST', '_COOKIE') as $_request )
{
    foreach( $$_request as $_k => $_v )
    {
        ${$_k} = _get_request($_v);

        if( '_COOKIE' != $_request )
        {
            $req_data[$_k] = _get_request($_v);
        }
    }
}
unset($_GET, $_POST);
?>

上面代码能够很明显的发明,cms把$_GET,$_POST,$_COOKIE注册为了全局变量。以是以后能够存在变量掩盖,以后的代码引入了全局函数和全局类。这时刻CMS进口以审计完毕,能够最先审计函数和类

重装置破绽(Getshell)

由于装置文件一样平常是破绽的重灾地,因而这里直接跳到了装置文件,果真找到了破绽点。
在install_action.php中,装置完成后会把前端文件重命名,然则后端逻辑文件照旧存在,以是若是晓得装置文件地位便可重装置

<?php
function install_end()
{
    //装置扫尾

    //把装置文件的名字换了
    @rename('index.php', 'index.php_bak');
}

这里只重命名了前端文件

而且在文件280行,存在写文件操纵,文件名为php且文件内容可控

<?php

$db_tablepre = $_POST['tablepre'];

write_db_config($db_type, $db_host, $db_name, $db_pass, $db_table, $db_tablepre);

function write_db_config($db_type, $db_host, $db_name, $db_pass, $db_table, $db_tablepre)
{   
    //写入数据库设置装备摆设
    global $db_code;
    $db_config = "";
    $db_config .= "<?php\n\n";
    $db_config .= "\$db_type = '" . $db_type . "';\n";
    $db_config .= "\$db_host = '" . $db_host . "';\n";
    $db_config .= "\$db_name = '" . $db_name . "';\n";
    $db_config .= "\$db_pass = '" . $db_pass . "';\n";
    $db_config .= "\$db_table = '" . $db_table . "';\n";
    $db_config .= "\$db_ut = '" . $db_code . "';\n";
    $db_config .= "\$db_tablepre = '" . $db_tablepre . "';\n\n";
    $db_config .= "?>";
    require_once("../include/class/class.file.php");
    $cls_file = new cls_file('../include/config.db.php');
    $cls_file-> set_text($db_config);

    return $cls_file-> write();
}

由于文件内容可控,我们能够经由历程tablepre=exp来写入一个歹意php文件

tablepre=dcr_qy_';?><?php phpinfo()?>
由于写入的是设置装备摆设文件,以是接见站点恣意文件都邑包罗此文件,以是还能够当后门来用。

某开源企业站CMS审计报告

以太坊CVE-2018–10468与CVE-2018–11411合约破绽剖析

一、前言 最近在审计代码的时候发现了两则十分相似的代码,审计之后发现代码存在一些问题,后来查询发现两则代码确为2018年的CVE。即:CVE-2018–11411与CVE-2018–10468。由于者的漏洞点十分相似,所以在本文中我将两代码一同进行分析。 经过简单的分析,我发现两则漏洞均是由编写者在编写代码过程中错误撰写合约判断条件从而导致攻击者可以利用条件传入合适的参数从而绕过判断进而作恶。 代码并不长,但是危害性极大。 二、代码分析 由于代码十分相似,所以我们仅分析其不同点与关键点。 合约如下: /**
* Source Code first verified at https://etherscan.io on Wednesday, June 28, 2017
(UTC) */

pragma solidity ^0.4.10;

contract ForeignToken {
function balanceOf(address _owner) constant returns (uint256);
function transfer(address _to, uint256 _value) returns (bool);
}

contract UselessEthereumToken {
address owner = msg.sender;

bool public purchasingAllowed = false;

mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;

uint256 public totalContributi

审计历程还发明,若是接纳sqlite装置,sqlite数据库文件名会以php末端,而且我们能够掌握数据库名数据库表,然则cms最先会新建一个名为<?php的数据表,sqlite文件的文件头会存在多个<?php,php剖析到这里直接报错了。不晓得怎样绕过。

sql注入

在install_action.php中还存在sql注入

<?php
$db_table = $_POST['table'];
$sql_db_exists = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$db_table'";

很明显的注入,就不细讲了

恣意文件删除破绽x2

全局搜刮风险函数unlink
某开源企业站CMS审计报告
一个个跟进审计,查找拿些变量可控,终究找到两个恣意文件删除破绽

在fmanage_action.php中供应了文件删除功用,然则未对文件途径做过滤,因而能够删除恣意文件

上面提到cms把一切url变量注册为了全局变量,因而只需接见action=del_file&cpath=../../../../../../../1.txt便可删除恣意文件

cls_dir类中也存在一个恣意文件删除破绽
某开源企业站CMS审计报告
cache_clear.php引用了这个类

<?php
$cls_dir = new cls_dir();
$cls_dir-> delete_dir( WEB_CACHE  . "/template/{$tpl_dir}" );

同理,经由历程掌握url参数tpl_dir便可恣意文件删除

失利的审计

在db.class.php中的组织要领里,能够举行数据库衔接

<?php
class cls_db
{
    private $pdo;

    private $db_type;
    private $host;
    private $name;
    private $pass;
    private $table;
    private $ut;
    private $conn;

    private $result;
    private $rs;    

    private $str_error; //错误信息

    /**
     * 组织函数
      * @param string $db_type 数据库范例
      * @param string $host 数据库地点
     * @param string $name 数据库用户名
     * @param string $pass 数据库暗码
     * @param string $table 数据库名
     * @param string $ut 数据库编码
     * @return resource 胜利返回一个衔接的resource
     */
    function __construct( $db_type, $db_host, $db_name, $db_pass, $db_table, $db_ut )
    {
        $this->db_type = $db_type;
        $this->host = $db_host;
        $this->name = $db_name;
        $this->pass = $db_pass;
        $this->table = $db_table;    
        $this->ut = $db_ut;
        if( !$this->conn )
        {
            $this->connect();
        }
    }

由于组织要领只要在实例化新类才会被执行,以是理论上,若是我们能够恣意实例化恣意类,我们能够掌握数据库衔接的ip和端口,再经由历程mysql恣意文件读取破绽,便可到达恣意文件读取,全局搜刮new $
某开源企业站CMS审计报告
遗憾的是,这三个变量审计后发明我们都不可控,因而这条路没有走通,然则我以为思绪照样很不错的

失利的审计*2

class.email.php文件中会存在恣意ip竖立套接字,发送数据可控,因而我们能够经由历程crlf来SSRF,能够进击内网的php-fpm,redis等运用,然则在刚最先竖立套接字的时刻,cms会推断对应ip是不是返回2或许3,

<?php
function smtp_ok()
    {
        $response = str_replace("\r\n", "", fgets($this->sock, 512));
        $this->smtp_debug( $response . "\n" );


        if (!ereg("^[23]", $response))
        {
            fputs($this->sock, "QUIT\r\n");
            fgets($this->sock, 512);
            cls_app::log("Error: Remote host returned \"" . $response . "\"\n");
            return false;
        }
        return true;
    }
?>

若是进击内网,必需要对应内网效劳在竖立衔接时,返回数据中带有2或许3,我们能力发送数据,否者顺序会直接退出。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明某开源企业站CMS审计报告
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址