xunrui-cms <=4.6.2(官方最新版)
闲来无事挖的
1.漏洞点在install.php
满足如下任意条件可进入安装程序

1.安装程序没有执行过
2.开启了高级开发模式
在install.php中会将对应数据库配置写入文件

可以看到写入了这几个参数,这几个参数都是我们输入的
$data[‘db_host’]
$data[‘db_user’]
$data[‘db_pass’]
$data[‘db_name’]
$data[‘db_prefix’]
其中
$data[‘db_host’]
$data[‘db_user’]
$data[‘db_pass’]
虽然没有过滤,但是会通过这三个参数尝试链接数据库,如果连不上会直接退出,所以是不能注入特殊字符串的
$data[‘db_prefix’]有更严格的过滤,无法注入字符串

那么我们的目光就来到了,唯一的可控点
$data[‘db_name’]
但是这个可控点会首先检测输入的数据是否存在这个数据库,如果不存在尝试创建,如果我们输入的是恶意字符串,数据库是不会创建成功的,在这里就会return,无法到达下面的逻辑,也就谈不上注入了

有没有办法呢?答案是有的,注意到此处使用的是mysqli_quer(),并且里面的sql直接拼接,并没有使用预编译,是可以存在sql注入的
那么我们假如数据为aaaa#xxxxx,这里会创建aaaa的数据库,并且创建成功,#后面的我们可以任意可控,sql语句不执行没关系,我们可以闭合单引号从而注入php代码
在不存在注入的时候,正常的代码是这样的,我们可控的便是database字段的值

尝试注入如下代码
1 | AAAA#’];system(‘ls’);exit();[’ |
request
1 | POST /index.php?c=install&m=index&is_install_db=0&step=2 HTTP/1.1 |
可发现单引号已经成功闭合,此时访问任意前台都会include该文件,从而触发php代码的执行

此处为windows环境,实际执行的是dir而不是ls命令
