前言
很久没有审计了,周末特意找了个了小众的cms来学习学习。这次对象是鱼跃cms,官网下载的最新版,提前去相关漏洞库看了看,基本上都被大佬们挖完了,本人安全小白,就找到了3个的洞,各位师傅嘴下留情。这次主要是分享我在这次阅读代码中的一点感受。
审计之前
工欲善其事,必先利其器。好的工具事半功倍。每个人都有自己习惯的工具和审计套路,也不必过多评价,这里只分享自己的,如果对各位位师傅有用,那也是我的荣幸。
- phpstorm + phpstudy + burpsuite + 自动化审计工具
感觉这一套就行了,分别说下我个人认为的优点吧: - phpstorm
相比于一些静态的文本编辑器,它可以动态调试,配合phpstudy来进行debug对像我这种新手来说比较友好,定位函数、跟踪传参呀都比较nice。 - phpstudy
本地搭建环境,方便快捷,不需要懂那么多,就能快速上手。 - burpsuite
有时候本地环境搭建起来后,会先黑盒搞一搞,这个时候挂上bp的话,我个人觉得最直观的就是有助于上手cms的路由,通过浏览之前的抓包情况,结合MVC框架特点,很快就能搞清楚路由,我觉得这个很重要,因为涉及到一些方法的调用,漏洞的利用等等,不用再从头跟一遍传参呀什么的。 - 自动化审计工具
这个种类很多,好坏也很明显,报的很全,但是误报很多。 - 再提一句,之前看到一位师傅的思路是遍历cms中的文件,然后爆破看是否有未授权,当时觉得这个思路不错,就简单写了个复现,也用在了这次审计中(但是没收获),代码附上(水平有限,见谅见谅):
# 作者:juju
# 日期:2021/11/22 18:21
import os
import sys
import re
try:
path = sys.argv[1]
file_ext = sys.argv[2]
current_root = sys.argv[1].split('\\')[-1]
list = []
# path = '/home/jhxie/Workspace/namesort'
for root, dirs, files in os.walk(path):
for file in files:
file_name = os.path.join(root, file)
if file_ext == file.split('.')[-1]:
url = file_name.split(current_root)[-1]
url = re.sub(r'\\', '/', url)
print(url)
except:
exit(print('用法:python list_file.py 文件夹路径 后缀'))
审计
本地搭建环境进行审计:
通过用户名密码进入后台之后发现其url为:
http://127.0.0.1/yuyuecms_2.2.15/admin/index/index.html
感觉像是TP的框架,再看一眼目录结构:
大概可以确定。
在yuyuecms目录下:
发现admin、index、install、login模块,每个下面有个存放控制器的文件夹,再结合上面的url,路由的方式应该是
http://127.0.0.1/yuyuecms_2.2.15/模块/控制器/方法.html
知道路由后,思路就很清晰,主要看控制器里面的方法:后台插件上传导致任意文件上传:
跟进1中发现需要验证verification:
通过比对登录数据包发现,登录成功后返回一个固定verification,且后台调用方法时都要进行传参
通过对比2和3处发现,上传时验证了后缀为zip,但是却直接解压文件,并没有对解压后的文件验证,导致了上传
写个phpinfo,打成压缩包,通过后台上传插件处直接上传:
后台主题上传导致任意文件上传:
和上面分析一样:
一样的利用方式导致上传shell:
在主题上传处上传新主题:
后台任意目录删除:
发现后台存在deltheme()方法:
可以看出路径可控,跟进deleteFolder:
继续跟进delFolder:
完全没有限制,但是只是删除目录,比较鸡肋
在根目录新建test文件夹:
删除:
可能的sqli
在install下控制器的step3方法中:
通过post获取name后直接拼接到exec,但是这个是安装时的,没什么实际意义,就没继续跟下去
后话
那个遍历目录爆未授权的方法也测试了,没有收获,可能是这个cms是框架结构,这些方面做的比较好吧
能力有限,时间仓促,就找到了3个简单的洞,若是有师傅找到其他的洞,快快评论一下,师傅们带带我呀