卖女孩的小火柴的博客

禁言复读机器人的注入

为了满足群员没日没夜的复读需求,特写了个简单的机器人,用于负责自动禁言

禁言规则:

机器人的禁言流程

  1. 有人发了语句,生成一条线程
  2. 生成的线程,会先使用 SELECT * FROM data WHERE qun = "群号" AND time >= 20分钟前的时间戳 ;
  3. 这个语句会取出20分钟内所有在此群发言人的记录,并开始对其遍历
  4. 遍历发送的消息,意思就是挨个取出发送的消息,然后判断在20分钟内有多少人发送了它,如果>=3就会找记录的倒数第二条,然后判断最后一个记录者的发送时间是不是在180s外,如果是就执行禁言
  5. 在这个过程中,使用的语句为 SELECT * FROM data WHERE qun = "群号" AND time >= 20分钟前的时间戳 AND msg = '遍历的消息';

对SQL语句的分析

看起来没有任何问题对吧?
实际上问题大得很呢。

由于机器人故意使用了sql语句拼接的方式,如果在msg,也就是消息那边做手脚,那么有没有可能性混淆甚至修改sql语句为自己想要的呢?

SQL注入1

在最早的版本当中,对msg没有做任何处理,这也是最容易注入的版本
比方说,我们发送的消息是
%' OR time < 1569334920 AND QQ = '834047409
我们看起来它没有任何问题,但在机器人执行的时候,问题就大了
通过对 单引号的混淆 ,我们成功的修改了sql语句
在机器人禁言的第5步骤,使用的语句变成了
SELECT * FROM data WHERE qun = "707671481" AND time >= 1569334120 AND msg = '%' OR time < 1569334920 AND QQ = '834047409';
这个语句的含义就和原来完全不一样了
由于 msg = '%' 这个语句的存在,使前面检索出来的所有记录全为空了,也就是说没有检索到任何一条记录,等同于前面的语句全部作废,生效的只有后面的 time < 1569334920 AND QQ = '834047409'
这是个什么意思?
意思就是,找出3分钟前834047409这个QQ号所发送的所有消息,由于已经制定了时间戳,所以肯定满足180s这个条件,这个哥们就被立竿见影的禁言了。

当前页面是本站的「Google AMP」版。查看、发表评论或购买附件请点击:完整版 »