漏洞分析之thinkPHP反序列化:这就是黑客的世界吗( 六 )


    private function filterValue(&$value, $key, $filters)    {        $default = array_pop($filters);        foreach ($filters as $filter) {            if (is_callable($filter)) {                // 调用函数或者方法过滤                $value = call_user_func($filter, $value);            } elseif (is_scalar($value)) {                if (false !== strpos($filter, '/')) {                    // 正则过滤                    if (!preg_match($filter, $value)) {                        // 匹配不成功返回默认值                        $value = $default;                        break;                    }                } elseif (!empty($filter)) {                    // filter函数不存在时, 则使用filter_var进行过滤                    // filter为非整形值时, 调用filter_id取得过滤id                    $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter));                    if (false === $value) {                        $value = $default;                        break;                    }                }            }        }        return $value;    }通过全局搜索找到input函数,但是input函数处的参数也不可控,然后继续往上找调用input的地方,找到param函数,同理参数不可控,继续回溯,找到isAjax函数,可以看到在isAjax方法中调用了param方法,且参数$name可控,这就是网上公开的完整攻击链了,在真实的漏洞挖掘过程中需要一点点回溯,但是在分析过程中,我们就结合PoC顺着这个链来看,这样更加便于理解.
先来isAjax(),可以看到这个isAjax完全满足我们之前说的那种条件,不需要传任何参数,并且里面调用param()函数的参数又是可控的 。
public function isAjax($ajax = false)    {        $value  = $this->server('HTTP_X_REQUESTED_WITH');        $result = 'xmlhttprequest' == strtolower($value) ? true : false;        if (true === $ajax) {            return $result;        }  此处调用了param函数,并且传入$this->config['var_ajax']作为 $name,而在poc中this->config['var_ajax']为axin        $result           = $this->param($this->config['var_ajax']) ? true : $result;        $this->mergeParam = false;        return $result;    }


推荐阅读