I Doc View /doc/upload分析
鉴权绕过
直接访问/doc/upload,会提示:请先登录,或通过token来访问
传入token参数,会提示:不存在该应用
定位代码,可以发现调用了this.appService.getByToken(token)来获取appPo,其不存在就会提示:不存在该应用
查看this.appService.getByToken方法,其调用了this.appDao.getByToken(token)方法
appDao有2个实现类,AppDaoMySQLImpl和AppDaoImpl
它们的getByToken方法都是从app表中获取根据token值进行查询,一个是mysql、一个是mongodb
在数据库初始化文件中,可以看到app表中存在token值为testtoken的数据
传入?token=testtoken,满足条件了
文件上传?
继续往下看,接受文件上传请求,会调用this.docService.add方法
在this.docService.add方法中会调用this.addDoc方法
this.addDoc方法中会调用FileUtils.writeByteArrayToFile方法写入文件
文件的保存路径是RcUtil.getPath(rid)生成的,rid前面有生成
getPath返回内容
getDirectoryByRid返回内容
getFileNameByRid返回内容
上传请求
不过这个无法getshell,能上传和解析html
文件读取
当不是上传请求时,接受url参数,调用this.docService.addUrl方法
在this.docService.addUrl方法最后,在判断data不为空后,会调用this.add方法
同样的也会保存文件到本地,data就是文件内容
看下data是怎么赋值的,如果传入的url匹配(file:///?)?(\w{1}:.+),那么就会利用url.replaceFirst(localPathRegex, "$2");获取其第二个捕获组的内容作为文件名,读取文件内容
这里就能够读取服务器上的任意文件,比如C:/windows/win.ini
如果传入的url是以//开头的,就是读取网络共享文件的内容
如果传入的url是以ftp开头,就是读取ftp服务上的文件内容
还有就是访问http或https的web服务
data为请求的返回值