看了不少表哥的pbootcms的代码审计文章,决定从这里开始代码审计的学习与实践
漏洞文件:\apps\home\controller\ParserController.php 中的parserIfLabel函数:
代码执行问题出于2333行 的eval
当$content为可控前台参数时
这里可以通过使用手册提供的if标签来执行代码
{pboot:if(php code)}!!!{/pboot:if}
我们继续寻找可控参数点
get为我们获取外部数据,然后替换内容,造成解析内容我们可控
而作者也对此做了防护
在V1.3.1中
$pattern = '/{pboot:if(([^}]+))}([\s\S]*?){\/pboot:if}/';
这里正则将IF标签后面的内容取出进行过滤并执行
这里会用正则取出“(”前面的字符串取出并调用function_exists()函数 当字符串为已经定义的函数就返回 TRUE,意思是一切可执行的函数都会被过滤,但是大写EVAL实际是可以绕过并执行的……
所以在v1.3.2中作者将其修复,对eval判断不区分大小写
所以在1.3.2中其他表哥给出了其他过滤方法
但是这两种方法在我试图写入文件时失败,多次利用已知知识尝试混淆转义写入失败,回头寻找别的方法。
在执行代码之前,程序进行了一次解码:
在\core\function\handle.php
中发现decode_string
还经过了stripcslashes()
函数处理,stripcslashes函
数会去除字符串中的反斜杠,所以其实我们只需要加入一个反斜杠就能通过function_exists函数检测并且可以执行所有代码……
而在最新版本V1.40中,作者不仅去除了最后一步decode_string函数,还禁止了从外部获取数据。
至此本菜鸟的pbootcms的代码执行审计学习到这里了,希望能和大佬多多学习。