如何使用 MySQL 处理 18GB 社工数据库

1. 前言

最近网上冲浪时,看到有人分享了一个泄露数据库的种子文件,叫做qq8e,里面包含了近8亿条QQ号码和手机号码的绑定关系,解压缩后大小约18GB。我比较好奇这个库里面有没有我的QQ号,于是便给他下载了下来,准备用MySQL数据库进行处理。

注意: 本篇文章仅用于技术交流,请勿用于非法用途,本文涉及到的相关文件在测试过后已删除。

2. 预览文件

种子下载完成并解压缩后会得到一个18GB的纯文本文件,此时如果直接用文本编辑器打开,很容易导致电脑爆内存或者卡死,因为多数情况下文本编辑器会一次性将整个文件加载到内存中。

为了解决这个问题,可以使用一些命令行工具来读取文件的一部分,比如Windows的type命令:

alt text

Linux的headtailless等命令:

alt text

3. MySQL数据库

以下操作是在CentOS 7.9的MySQL 5.7数据库上进行的。

3.1. 创建数据库

1
2
CREATE DATABASE qq8e;
USE qq8e;

3.2. 创建表

因为建表时建立索引会导致后面导入数据时非常耗时,所以这里先不建立索引,等数据导入完成后再建立索引:

1
2
3
4
CREATE TABLE user (
qq BIGINT,
phone BIGINT
);

这里字段类型不使用TEXT类型,是因为TEXT类型中的每个数字都会占用1字节,并且还会额外占用1到2字节的长度信息。而BIGINT类型固定占用8字节,最长可存储19位数字,并且不会占用额外的长度信息。

3.3. 导入数据

导入之前需要先编辑mysql配置文件(/etc/my.cnf),设置安全文件目录,否则导入时会报错:

1
2
[mysqld]
secure_file_priv = "/tmp/"

设置完成后,再将qq8e.txt文件移动到/tmp目录下,然后重启数据库:

1
sudo systemctl restart mysqld

接着在数据库中执行以下命令进行导入:

1
2
3
4
5
LOAD DATA INFILE '/tmp/qq8e.txt' IGNORE
INTO TABLE user
FIELDS TERMINATED BY '----'
LINES TERMINATED BY '\n'
(qq, phone);

命令开始执行后,终端不会有任何输出,需要等待一段时间,等待时长和设备性能有关,我这里使用戴尔的PowerEdge R550服务器导入了1小时18分钟才完成,导入过程中有196_230个警告,总共导入了719_806_832条数据:

alt text

alt text

距离8亿条数据还少了约8千万条…

3.4. 建立索引

为了提高查询速度,还需给qq和phone字段单独建立索引。因为只通过qq号查询手机号或者只通过手机号查询qq号,所以不需要建立联合索引。又因为库里面有重复数据,所以不建立唯一索引:

1
2
CREATE INDEX idx_qq ON user (qq);
CREATE INDEX idx_phone ON user (phone);

建立qq字段的索引耗时49分钟,建立phone字段的索引耗时1小时1分钟:

alt text

如果只通过qq号查询手机号,可以只给qq字段建立索引,反之亦然。

导入并建立索引后,存储占用了63G:

alt text

3.5. 查询数据

建立完索引后,就能秒查询了:

1
2
SELECT * FROM user WHERE qq = 123456789;  -- 通过qq号查询手机号
SELECT * FROM user WHERE phone = 12345678910; -- 通过手机号查询qq号

我试了查询我自己的QQ号,没有查到我的手机号,但是我查我的一个小号,可以查到我以前绑定过的手机号码:

alt text

并且这个小号是2020年注册的,说明这个库的泄露时间在2020年以后:

alt text

也查了下朋友的QQ号,可以查到他现在绑定的的手机号:

alt text

QQ号和手机号能够匹配上,说明这个库没有加盐(Salt),并且是可信的。电报里的大部分免费社工库可能也是用了这个库。

后面在github上面还发现了一个可用于该泄露数据库的前端项目:

alt text

简直离谱…