Blog.Core任意文件读取和上传
选取了一套代码比较简洁的系统进行审计
任意文件读取
位于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
处理文件名即可