禁言复读机器人的注入
浏览 2144 | 评论 0 | 字数 1222
卖女孩的小火柴
2019年09月25日
  • 为了满足群员没日没夜的复读需求,特写了个简单的机器人,用于负责自动禁言

    禁言规则:

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

    本文作者:卖女孩的小火柴
    本文链接:https://www.shinenet.cn/archives/49.html
    最后修改时间:2019-12-23 19:33:56
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    如果文章对您有帮助,不妨打赏杯可乐?微信-赞赏码
    评论
    如果可能,请填写真实邮箱,有回复会送至邮箱。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论