0x00 前言
首先介绍一下,一个是第三方插件引起的,另一个是官方的功能。这个第三方插件是由个人开发者通过阅读官方的开发文档来实现的,也算是这个博客系统的一个功能。而另一个则是官方的功能,危害可能并不大但对于企业站点可能就会有点影响(在获取到管理员邮箱的情况下,可以不断轰炸管理员的邮箱)
0x01 正文
友链自助提交插件(第三方插件)
漏洞复现
在插件接口文档中发现了 发送邮箱验证码
这一功能,想着测试一下是不是存在邮箱轰炸漏洞
刚好之前有这个插件的授权,就用自己的网站进行了测试,果不其然,在burp当中抓包测试,发送10次数据包,同样的接收到了10个不同的验证码
功能点分析
前端源码,请求接口如下:
反编译的插件源码当中,位于
site/muyin/linksSubmit/utils/EmailService.class
,类当中的sendEmail
方法执行的代码中,从博客系统当中获取发送邮件服务的相关配置,这里构建好相关的类
再到下面进行发送
危害分析
这个过程中并没有任何校验,所以只要邮件服务配置存在,传入邮箱即可发送邮件,并且没有次数限制,可导致邮件轰炸,如果邮件服务使用的是云厂商具有额度的邮件推送等服务,就有可能导致额度在短时间内被刷完。
重置密码(官方功能)
漏洞复现
从上面第三方插件的案例,让我联想到了官方使用到邮件发送功能的场景,于是就找到了重置密码,但不同的是,这个有对传入的邮箱进行校验,如果存在才会发送邮件。
通过两次burp的intruder模块爆破,成功复现:
功能点分析
在application/src/main/java/run/halo/app/security/preauth/PreAuthEmailPasswordResetEndpoint.java
,类当中的preAuthPasswordResetEndpoints
方法监听了/password-reset/email
路由。
而邮件重置密码是在这里,先对sendForm
对象的数据进行验证,验证成功后就会调用后面的发送邮件
危害分析
这里的数据验证主要就是判断邮箱是否注册,如果未注册则不会有危害。但由于这是个博客系统,难免不留下一些联系方式,例如:友链、个人介绍mailto等,这里都可以获取到邮箱,也可以通过一些社工手段来获取到管理员的邮箱,这就有可能引起对管理员的骚扰(在管理员注册的邮箱与留下的邮箱一致的情况下);除此之外,它也可以导致在邮件服务是有额度的情况下,额度被耗尽的危害。
0x02 结尾
这次发现的两个漏洞成因主要都是程序设计不规范导致的,希望官方可以提供一个邮件发送的接口,在发送邮件前能够进行校验、限制次数等,也希望凌霞软件越来越好。