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; }
推荐阅读
- 《金铲铲之战》黎明最强阵容是什么?
- 古茶树不能承受之重,古曼撒之冷庙古树茶
- 工夫红茶是什么意思,功夫红茶与工夫红茶字之差
- 父亲节走心茶礼,厨心熟茶品质口碑和品牌之路
- 广州旅游攻略之必去景点
- 高桥银峰的作用有哪些,高桥银峰营养成分分析
- 十大名菜之首 抗癌防癌并有“富硒食品”之称
- 凤宁号茶叶加盟信息,佛山市南海区春之茗茶叶加盟八方茶园
- 贡眉是福鼎白茶之,福鼎大白与福鼎大毫的关系
- 各用沏茶用水知识解说,沏茶用水之软水
