师傅分析的pbootcms1.2.1版本getshell文章

后台代码执行

下载最新版本,apps/home/controller/ParserController.php中的parserIfLabel函数的实现代码如下

// 解析IF条件标签
    public function parserIfLabel($content)
    {
        $pattern = '/\{pboot:if\(([^}^\$]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
        $pattern2 = '/pboot:([0-9])+if/';
        if (preg_match_all($pattern, $content, $matches)) {
            $count = count($matches[0]);
            for ($i = 0; $i < $count; $i ++) {
                $flag = '';
                $out_html = '';
                $danger = false;

                $white_fun = array(
                    'date',
                    'in_array',
                    'explode',
                    'implode'
                );

                // 还原可能包含的保留内容,避免判断失效
                $matches[1][$i] = $this->restorePreLabel($matches[1][$i]);

                // 解码条件字符串
                $matches[1][$i] = decode_string($matches[1][$i]);

                // 带有函数的条件语句进行安全校验
                if (preg_match_all('/([\w]+)([\\\s]+)?\(/i', $matches[1][$i], $matches2)) {
                    foreach ($matches2[1] as $value) {
                        if ((function_exists($value) || preg_match('/^eval$/i', $value)) && ! in_array($value, $white_fun)) {
                            $danger = true;
                            break;
                        }
                    }
                }

                // 不允许从外部获取数据
                if (preg_match('/(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)/i', $matches[1][$i])) {
                    $danger = true;
                }

                // 如果有危险函数,则不解析该IF
                if ($danger) {
                    continue;
                }
                eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');


                if (preg_match('/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[2][$i], $matches2)) { // 判断是否存在else
点击收藏 | 0 关注 | 1
登录 后跟帖