禁言复读机器人的注入

2019-09-25T09:57:00

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

禁言规则:

  • 在20分钟内
  • 复读次数>=3
  • 最近一条复读消息距现在超过180s
  • 在另外一条语句发送后会尝试开始禁言
  • 复读的倒数第二个人会被禁言
  • 图片 表情包也会被算禁言,均使用MD5值进行判断,所以有的时候看起来图片一样,但其实是完全不一样的两张图片,MD5不相同
  • 使用的数据库为 sqlite3

机器人的禁言流程

  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这个条件,这个哥们就被立竿见影的禁言了。

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