如何使用 MySQL 处理 18GB 社工数据库
如何使用 MySQL 处理 18GB 社工数据库
lololowe1. 前言
最近网上冲浪时,看到有人分享了一个泄露数据库的种子文件,叫做qq8e,里面包含了近8亿条QQ号码和手机号码的绑定关系,解压缩后大小约18GB。我比较好奇这个库里面有没有我的QQ号,于是便给他下载了下来,准备用MySQL数据库进行处理。
注意: 本篇文章仅用于技术交流,请勿用于非法用途,本文涉及到的相关文件在测试过后已删除。
2. 预览文件
种子下载完成并解压缩后会得到一个18GB的纯文本文件,此时如果直接用文本编辑器打开,很容易导致电脑爆内存或者卡死,因为多数情况下文本编辑器会一次性将整个文件加载到内存中。
为了解决这个问题,可以使用一些命令行工具来读取文件的一部分,比如Windows的type
命令:
Linux的head
、tail
、less
等命令:
3. MySQL数据库
以下操作是在CentOS 7.9的MySQL 5.7数据库上进行的。
3.1. 创建数据库
1 | CREATE DATABASE qq8e; |
3.2. 创建表
因为建表时建立索引会导致后面导入数据时非常耗时,所以这里先不建立索引,等数据导入完成后再建立索引:
1 | CREATE TABLE user ( |
这里字段类型不使用TEXT类型,是因为TEXT类型中的每个数字都会占用1字节,并且还会额外占用1到2字节的长度信息。而BIGINT类型固定占用8字节,最长可存储19位数字,并且不会占用额外的长度信息。
3.3. 导入数据
导入之前需要先编辑mysql配置文件(/etc/my.cnf
),设置安全文件目录,否则导入时会报错:
1 | [mysqld] |
设置完成后,再将qq8e.txt文件移动到/tmp目录下,然后重启数据库:
1 | sudo systemctl restart mysqld |
接着在数据库中执行以下命令进行导入:
1 | LOAD DATA INFILE '/tmp/qq8e.txt' IGNORE |
命令开始执行后,终端不会有任何输出,需要等待一段时间,等待时长和设备性能有关,我这里使用戴尔的PowerEdge R550服务器导入了1小时18分钟才完成,导入过程中有196_230个警告,总共导入了719_806_832条数据:
距离8亿条数据还少了约8千万条…
3.4. 建立索引
为了提高查询速度,还需给qq和phone字段单独建立索引。因为只通过qq号查询手机号或者只通过手机号查询qq号,所以不需要建立联合索引。又因为库里面有重复数据,所以不建立唯一索引:
1 | CREATE INDEX idx_qq ON user (qq); |
建立qq字段的索引耗时49分钟,建立phone字段的索引耗时1小时1分钟:
如果只通过qq号查询手机号,可以只给qq字段建立索引,反之亦然。
导入并建立索引后,存储占用了63G:
3.5. 查询数据
建立完索引后,就能秒查询了:
1 | SELECT * FROM user WHERE qq = 123456789; -- 通过qq号查询手机号 |
我试了查询我自己的QQ号,没有查到我的手机号,但是我查我的一个小号,可以查到我以前绑定过的手机号码:
并且这个小号是2020年注册的,说明这个库的泄露时间在2020年以后:
也查了下朋友的QQ号,可以查到他现在绑定的的手机号:
QQ号和手机号能够匹配上,说明这个库没有加盐(Salt),并且是可信的。电报里的大部分免费社工库可能也是用了这个库。
后面在github上面还发现了一个可用于该泄露数据库的前端项目:
简直离谱…