Cms安装处Getshell
我们首先看cms安装代码,比较容易出现问题的一般是执行安装时获取数据库信息环节
private function step4()
{
if ($this->request->isPost()) {
if (!is_writable($this->root_path.'config/database.php')) {
return $this->error('[config/database.php]无读写权限!');
}
$data = $this->request->post();
$data['type'] = 'mysql';
$rule = [
'hostname|服务器地址' => 'require',
'hostport|数据库端口' => 'require|number',
'database|数据库名称' => 'require',
'username|数据库账号' => 'require',
'prefix|数据库前缀' => 'require|regex:^[a-z0-9]{1,20}[_]{1}',
'cover|覆盖数据库' => 'require|in:0,1',
];
$validate = $this->validate($data, $rule);
第9行获取了POST()数据,我们看下具体
public function post($name = '', $default = null, $filter = '')
{
if (empty($this->post)) {
$this->post = !empty($_POST) ? $_POST : $this->getInputData($this->input);
}
return $this->input($this->post, $name, $default, $filter);
}
判断是否为空,然后利用三元运算符返回了POST()的的值。目前到这里是没有做过滤的我们继续往下看
$validate = $this->validate($data, $rule);
if (true !== $validate) {
return $this->error($validate);
}
$cover = $data['cover'];
unset($data['cover']);
$config = include $this->root_path.'config/database.php';
foreach ($data as $k => $v) {
if (array_key_exists($k, $config) === false) {
return $this->error('参数'.$k.'不存在!');
}
}
// 不存在的数据库会导致连接失败
$database = $data['database'];
unset($data['database']);
// 创建数据库连接
$db_connect = Db::connect($data);
在最后一行,142行,没有对$data进行处理,然后写入了database.php
于是
查看配置文件
任意文件上传漏洞
有时候黑盒比白盒效率高一些
我们看下源码
public function index($group = 'base')
{
if ($this->request->isPost()) {
$webPath = './';
$data = $this->request->post();
$types = $data['type'];
if (isset($data['id'])) {
$ids = $data['id'];