用户
搜索
  • TA的每日心情
    奋斗
    2017-6-10 15:08
  • 签到天数: 24 天

    连续签到: 1 天

    [LV.4]经常看看II

    i春秋-核心白帽

    Rank: 4

    18

    主题

    406

    帖子

    292

    魔法币
    收听
    0
    粉丝
    5
    注册时间
    2016-3-19
    发表于 2018-10-19 14:11:37 38160
    本帖最后由 w_uai 于 2018-10-19 14:13 编辑

    接上次发的v1.1.9前台注入后,详情:https://bbs.ichunqiu.com/thread-46897-1-1.html

    v1.2.1的注入:

    \apps\api\controller\CmsController.php 还是那个search方法:
    它是这样修复的上面那个注入:

    $order = get('order', 'var') ?: 'date';

    因为get方法使用了第二个var所以导致不能引入逗号,括号等字符了。order by后面的注入也修复了。

           // 数据接收
            foreach ($_GET as $key => $value) {
                if (! ! $value = get($key, 'vars')) {
                    $where[$key] = $value;
                }
            }

    但是他却有这样一段,直接将$_POST的键赋予了$where函数,并且将$where数组带入了getList方法:

    // 列表内容
        public function getList($acode, $scode, $num, $order, $where = array())
        {
            ....
            return parent::table('ay_content a')->field($fields)
                ->where($where1, 'OR')
                ->where($where2)
                ->where($where, 'AND', 'AND', true)    //这里直接带入了where方法,跟进可发现存在注入
                ->join($join)
                ->order($order)     //$order变量又直接传入进了order方法。v1.1.9中造成注入的地方
                ->page(1, $num)
                ->decode()
                ->select();
        }
       final public function where($where, $inConnect = 'AND', $outConnect = 'AND', $fuzzy = false)
        {
            if (! $where) {
                return $this;
            }
            if (isset($this->sql['where']) && $this->sql['where']) {
                $this->sql['where'] .= ' ' . $outConnect . '(';
            } else {
                $this->sql['where'] = 'WHERE(';
            }
            if (is_array($where)) {
                $where_string = '';
                $flag = false;
                foreach ($where as $key => $value) {
                    if ($flag) { // 条件之间内部AND连接
                        $where_string .= ' ' . $inConnect . ' ';
                    } else {
                        $flag = true;
                    }
                    if (! is_int($key)) {
                        if ($fuzzy) {
                            $where_string .= $key . " like '%" . $value . "%' ";
                        } else {
                            $where_string .= $key . "='" . $value . "' ";
                        }
                    } else {
                        $where_string .= $value;
                    }
                }
                $this->sql['where'] .= $where_string . ')';
            } else {
                $this->sql['where'] .= $where . ')';
            }
            return $this;
        }
    $where_string .= $key . " like '%" . $value . "%' ";

    可以看到直接将$_POST的键拼接进入了语句,造成了语句。
    还是需要开启api接口,默认关闭,实战鸡肋。

    V1.2.2中修复:

            // 数据接收
            foreach ($_GET as $key => $value) {
                if (! ! $value = get($key, 'vars')) {
                    if (preg_match('/^[\w-]+$/', $key)) { // 带有违规字符时不带入查询
                        $where2[$key] = $value;
                    }
                }
            }

    对$key进行了匹配。

    发表于 2018-10-19 14:28:38
    学习学习。。。。
    http://www.anonymou5.com
    使用道具 举报 回复
    发表于 2018-10-23 13:31:23
    666666666666666666
    使用道具 举报 回复
    谢谢大佬的分享
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册