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

可以看到上面的input方法中调用getData,代码如下:
根据poc,此时的$data=https://www.isolves.com/it/aq/hk/2020-07-19/用户的get以及post组成的数组,$name=axinprotected function getData(array $data, $name) { foreach (explode('.', $name) as $val) { if (isset($data[$val])) { $data = $data[$val]; } else { return; } } 这里的$data=$data[$name] return $data; }所以如果我们在post (post不行,没有深究)或者get中传入axin=calc,这里返回的数据就是calc 。接着input()函数又调用了getFilter,源码如下:
此处的$filter=''而不是null,$default=null    protected function getFilter($filter, $default)    {        if (is_null($filter)) {            $filter = [];        } else {可以看到这儿把$this->filter赋值给了$filter,也就是poc中的system            $filter = $filter ?: $this->filter;            if (is_string($filter) && false === strpos($filter, '/')) {                $filter = explode(',', $filter);            } else {                $filter = (array) $filter;            }        }          $filter[] = $default;此处$filter=['system',null]        return $filter;    }最后input函数里执行到: $this->filterValue($data, $name, $filter);
而现在我们的$data为calc,$name为axin,$filter为system,我们带着这些数据进入filterValue.
private function filterValue(&$value, $key, $filters)    {    这里移除了default的值,$filters数组里只剩下system        $default = array_pop($filters);        foreach ($filters as $filter) {            if (is_callable($filter)) {                // 调用函数或者方法过滤                echo "方法执行n";                为了更加清晰的说明,我这里打印$filter与$value的值 。                echo "$filter为:".$filter."n $value为".$value;                $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;    }


推荐阅读