记录一次针对本站waline评论系统的恶意攻击。

前言

首先,本站在切换到butterfly主题之后,基本都是使用artalk评论系统进行评论,之前有一段时间使用了butterfly的多评论系统共存的功能,但是在我关闭该功能之前,waline没有收到任何新的评论。

本站的waline评论系统是采用vercel部署的,在hexo配置中虽然取消使用了该评论系统,但并没有取消vercel的部署和域名的解析,即本站旧的waline的服务依旧可用。

根据配置文件的git提交记录,2023.12.10的提交中,本站的waline评论系统被彻底隐藏,而且在keep主题留档站点中也没有开启评论系统。

1
2
3
4
5
commit e7ca8edf4f2c0512bf654abed9b911e78871e32e
Author: musnow <muxue@musnow.top>
Date: Sun Dec 10 15:05:13 2023 +0800

配置 取消waline选项,仅仅使用artalk

也就是说,理论上在2023.12.10之后,waline系统不应该被本站的普通读者发现和使用。

过程

但是,在2024.09.03上午,也就是撰写这篇文章的同一天,本站的waline博客收到了不明生物的小规模“攻击”,主要情况如下:

该用户使用不存在的邮箱test@example.com在waline发送大量评论,触发邮件系统的大量邮件退信。因为waline需要用户注册才能以已登录用户的身份发送评论,此时会有用户注册的验证邮件,该验证邮件被退信,大约24条。

image.png

该用户发送了大量只包含GIF动图的评论,尚且不清楚这些只包含图片的评论中是否暗藏玄机。它还发送了包含SQL语句的评论,尝试对评论系统后端进行SQL注入攻击。

image.png

该用户尝试在waline的用户邮箱、用户名字、用户域名、甚至url处进行SQL注入攻击。

image.png

image.png

SQL注入攻击

这里将评论中的这条sql语句剥离出来,问问GPT它的功能(我对SQL注入攻击不太懂)

1
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/

以下是GPT的原话:

  • 这段注入代码的主要部分是(select(0)from(select(sleep(15)))v),这是一个子查询,使用SLEEP(15)函数来延迟SQL查询的执行15秒。SELECT SLEEP(15)会让数据库在执行该查询时暂停15秒,然后返回结果(在这里返回0)。
  • /* ... */是SQL中的注释符号,用于忽略注释中的内容。在注入中,这可以用来闭合或注释掉原有的SQL代码,使得攻击者的代码得以执行。
  • '+ ... +'+"+ ... +"是用于拼接字符串的符号,分别针对单引号和双引号上下文。这些符号试图适应不同的SQL拼接方式,以确保注入代码能够在各种情况下都被正确执行。

最终的基本理念就是,通过sleep(15)尝试让数据库进行休眠,根据接口返回的延迟,判断SQL注入是否成功。

再看看link中的SQL语句

1
0'XOR(if(now()=sysdate(),sleep(15),0))XOR'Z

GPT原话:

  • now()sysdate() 是SQL中的时间函数,通常返回当前的时间戳。尽管它们在大多数数据库中返回相同的结果,攻击者利用它们来测试是否可以执行代码。
  • if(now()=sysdate(),sleep(15),0) 是一个条件判断语句:如果now()sysdate()相等(几乎总是相等的),那么就执行 SLEEP(15)。否则,返回 0。
  • 这个逻辑使用了 XOR 来试图绕过某些简单的SQL过滤机制。XOR 是一种位操作符,用于在两值之间执行异或操作。在这里,它被用于修改SQL查询的逻辑,试图绕过常规的过滤机制。

这个注入代码的意图是通过引入条件语句和时间延迟函数来探测SQL注入漏洞。如果注入成功,数据库将执行 SLEEP(15),导致查询延迟15秒,从而帮助攻击者判断注入是否成功。

后话

可惜了,waline用的数据库是leancloud,压根不存在SQL的操作,SQL注入自然是失败啦!

发现这个问题的时候,我使用腾讯云微信小程序紧急关闭了指向waline的子域名的DNS解析,但在关闭解析后对方仍然在不断地发送评论(因为此时对方已经知道服务器的IP地址了,请求并不存在DNS解析步骤),于是直接通过手机操作vercel,删除了waline的项目部署,恶意请求才得以消停。

感觉vercel应该出一个停止服务的按钮,这样就不用删除整个项目了,以后想用也不需要重新配置。可能vercel有这个功能,但是当时在手机上并没有找到。

此次攻击,准确来说是攻击的尝试,规模较小,发送评论的时间间隔大,发送的内容差距大,慕雪认为这是一次人工操作,并非脚本自动化攻击。

最后,还是希望大家不要去做这种没有任何意义,只会给别人造成损失,甚至违规违法的操作。切记,网络不是法外之地!