选取了一套代码比较简洁的系统进行审计

任意文件读取

位于Blog.Core\Blog.Core.Api\Controllers\ImgController.cs:


未对filename做任何处理,直接进行读取操作,可跨目录读取文件,如:
http://127.0.0.1:8081/images/Down/Bmd?filename=../appsettings.json
http://127.0.0.1:8081/images/Down/Bmd?filename=../WMBlog.db

这里默认情况下是无需权限的,通过读取敏感文件,特别是默认情况下使用的sqlite文件,可以拿到账号密码

任意文件上传

仍然位于Blog.Core\Blog.Core.Api\Controllers\ImgController.cs:

这里只在76行处对请求包的ContentType进行了白名单校检,而82行拼接文件写入的目标路径部分,使用的是file.FileName,用户完全可控,导致可跨目录上传任意名称的文件

这里虽然是个任意文件上传,但是并没有找到特别好的办法进行进一步获取网站权限的利用方法

未能完美RCE

首先由于这套系统采用.NET Core开发,上传aspx脚本或者web.config均没法getshell

于是我翻了下代码发现改系统提供了任务调度的功能,看起来可以通过反射执行dll中的代码,在
Blog.Core\Blog.Core.Tasks\QuartzNet\SchedulerCenterServer.cs

但是经过简单查阅资料以及测试,发现这里并不能加载我们上传的dll,只能加载项目名.deps.json所申明的内存中的dll,当然覆盖该文件也是不可行的,因为项目启动时已加载过

又翻查了下目标调用Json.net和Xstream的地方,均未有所收获

结束

虽然无法完美的RCE,但是配合某些情况还是有那么点机会的

至于修复基本只需要解决跨目录的问题基本就没啥大问题了,使用Path.GetFilename处理文件名即可