代码审计是个技术活,需要很好的耐心.. o(︶︿︶)o
出现问题的版本是FineCMS V1.8.0 最新版。
1.顺藤摸瓜
漏洞文件:controllers/ApiController.php downAction方法
这段控制器函数主要是将前端提交过来的file文件路径进行解密并下载,如果文件是本地路径,则直接readfile下载下来。但是系统此时没有判断该文件的合法性,假设用户提交过来的文件解密后是:
,则会导致存在任意文件下载的风险。
实现方法:
注册一个会员,然后登陆进去。在“内容管理”--> "下载"中发布文档,
下载地址前面填写passwd文件相对路径,后面随便填写。然后提交,等待管理审核通过。
审核通过后,直接点击下载链接,
可以看见系统passwd文件成功被下载下来了。
2.另辟蹊径
上面的任意下载文件有点曲折,非要注册后等待审核才能下载。其实通过测试发现,文件下载的的路径与数据库存储和用户cookie没有任何关系,因此我们完全可以构造任意文件的加密链接,就可以直接下载了。
文件下载地址:
http://xxx.xxx.xxx.xxx/index.php?c=api&a=down&file=MWZlYi83YkxvZlJoUkdCS0xIVk9ZQ0pIZ1p3Zm5TZFR3dEJsK2pucm9wUjdqYXg0OTlXVjhYa1hrb2ZzYmdKa1Z2bmRwTnJ0NVZGdEQrTlBieXNaWWhJeXFUZ2dsRnprY0hCeGx3
file变量进行了加密,跟进加密函数
extensions/function.php
这里将../../../etc/passwd 作为URL参数进行fn_authcode加密生成
但是fn_authcode里SITE_MEMBER_COOKIE变量是为空字符串的,MD5固定为: d41d8cd98f00b204e9800998ecf8427e
,并没有将用户的cookie信息作为加密因子,因此可以动态利用fn_authcode函数为我们想要的路径进行加密。
完成的POC:
我们将该POC部署到另外一台服务器上运行POC,可以直接成功下载到finecms服务器上的passwd文件。
但是poc在finecms演示站没有成功,实例测试其他一个站点:
数据库配置文件