目录
github获取ShowDoc源码,版本:ShowDoc v2.8.2,使用phpstudy本地搭建环境。环境搭建参考官网:ShowDoc
由于showdoc使用了ThinkPHP框架,需要对ThinkPHP路由熟悉。漏洞路由:?s=/api/page/uploadImg。可以在源码中Ctrl+Shift+F全局搜索/api/page/uploadImg,或者全局搜索uploadImg方法(一般路由最后几个字母就是对应的方法)。

该方法在Home和Api目录均出现了。需要做后续的判断。判断方法:后台找到漏洞上传功能点,分别在这两个方法处下断点,看它走到哪个方法中。

说明对应的是Api\Controller\PageController.class.php。之后F7、F8继续跟进。

进入uploadImg方法可以看到checkLogin()方法首先做了登录判断。所以该漏洞利用的前置条件是需要进行登录。
接下来上传png后缀的写入phpinfo()php文件,将$_FILES的文件name属性修改为:phpinfo.<>php,继续跟入。

上图中217行代码使用allowExts()方法设置白名单仅允许上传以下文件类型
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型

可以看到经过strip_tags()方法处理之后,输入的phpinfo.<>php,成功变成.php。但是前面的allowExts()方法已经设置了白名单,那.php应该是无法上传成功的,那为什么上传成功了呢?继续走:
strip_tags()方法:
strip_tags()—函数剥去字符串中的 HTML、XML 以及 PHP 的标签。


在这里我们可以看到,参与检测的是file变量的exts属性,而在上面设置的白名单属性是allowExts。猜测应该是开发者手误写错白名单变量属性,导致白名单失效。从而有了CNVD-2020-49480文件上传漏洞。使用这个方法上传的还有/api/page/upload接口。
正确修复建议:
将Api\Controller\PageController.class.php中的allowExts方法改为extss方法使白名单生效即可。
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型

开发者修复:

以上代码先将文件名转换为小写,然后再去除html相关标签,再检测文件中是否包含.php的后缀。
\b(strip_tags)

测试:

更多文章请前往:https://blog.csdn.net/qq_41490561
更多精彩内容请关注我们
往期推荐