脱库漫谈

引言

最近网易邮箱 163 邮箱用户数据泄露事件又让安全圈子高潮了一回,
目前网易公关给的解释是当然不会被脱库啦,你们想什么样呢,别闹了,好好上班。
外界自然是唏嘘声一片,就着那 100 条还有密保问题的可疑数据,居然有家电视台也跟着
凑起了热闹,闹就闹吧,好好的乌云就被报道成了 UCloud。

UCloud:怪我喽?

事实是什么,反正我不知道,我也不敢乱下定论,我又不认识某种产业的人,
我也不认识 163 的,前面都是说给你听的,认识我也要说不认识。

上一回高潮是今年 9 月的 Xcode Ghost,哦不,上一回应该算是前
两天的支付宝实名认证的漏洞了。我想支付宝的公关估计现在正在偷着乐吧。

话说回来,今天我们就来谈谈脱库。

首先解释下”脱库”和”撞库”的概念。

“脱库”也有人喜欢打成作”脱裤”,”拖库”,和你看的 AV 没一点关系啊。就是黑客
通过安全漏洞,直接将数据库下载到黑客计算机,于是乎,目标站点的所有
用户数据通通被黑客收入囊中。

“撞库”就是黑客利用现有的网上泄露的用户数据去尝试登录一些其它站点,
总有一部分人,为了方便大部分网站用的同样的账号和密码,你自己想想你有
没有中枪。这个概念很形象,比如说黑客利用 QQ 泄露的数据,这里我们就想着
只有 QQ 号和密码数据量暂时定为 1 亿吧,然后黑客就用 QQ 的账号密码去批量尝试登录支付宝的账号
总有那么几个人就是用 QQ 号来当支付宝账号的,然后密码也一样,于是乎,这些人
的支付宝账号就被盗了。

脱库利用的是目标网站的漏洞,而撞库利用的是用户习惯的漏洞。

支付宝:

今天不谈别的,只谈三件事。

第一件事,脱库。

第二件事,脱库。

第三件事,还是他X的脱库。

常见的脱库手段

1. 注入漏洞,使用注入直接强脱数据库

有些时候,目标站存在一个 SQL 注入漏洞,但是权限又限制的各种死,没法拿到 Webshell,但是你又可以通过 SQL 注入遍历用户数据这张表
select * from user limit 0,1,于是乎,你就可以一条一条地注入出来,最终把对方的整张用户表全 DUMP 到你的计算机。

这里我推荐使用 sqlmap.

1
2
3
4
5
6
sqlmap.py -u "目标站点" -D "目标的数据库名" -T "目标表名" -C "字段名1,字段名2" --dump-all

# -C 如果不指定就是整个表的所有字段
# --dump 是把目标的整个表结构 dump 出来
# --dump-all 是把整个表的实体(也就是数据)下载下来
# 使用多线程就在命令上加 --thread 10

这里再谈下这种方法的缺点,每 dump 一条数据,就要向目标服务器发送一次 HTTP 请求,这还是建立在你能一次请求就能下载一个实体的情况下,如果对方数据量不大,还能接受,如果说数据量太大,首先时间是个问题,其次目标服务器承载能力有限,最后,这么大的流量,管理员要是不傻,一看流量异常,直接查 web 日志发现这么多请求,直接 ban ip, 修复漏洞。然后你就可以说洗洗睡了。

2. 数据库配置不当,直接连接数据库

通过文件下载漏洞,搞到了数据库配置文件,或者是弱口令爆出了数据库密码,反正就是人家知道你数据库连接的密码了。一般情况下,数据库的配置都是只允许 localhost 登录,但是有些管理员会修改这个。

这个管理员居然允许了远程访问,这个管理员居然允许了远程访问,但是你不能一张口就说人家傻逼,可能是因为业务需要呀,但是那种直接让所有来源都可以登录的,就说不过去了啊,拖出去枪毙 5 分钟。

说下 MySQL 数据库,一般会用 mysqldump 命令,用法如下:

1
2
mysqldump -h[hosname] -u[user_name] -p[password]
--default-character-set=[char_set_name] [db_name] [table_name] [save_path]

给个例子:

1
mysqldump -h111.111.111.111 -umysql -pmysql123 --default-character-set=utf8 inn0db --skip-lock-tables /tmp/inn0233.sql

上面的例子,就是使用 mysql 这个用户名,密码是 mysql123,把 111.111.111.111 这台数据库服务器的 inn0db 数据库中的所有表全导出到本地的 /tmp 目录下面,文件名是inn0233.sql

这个工具那么强大,具体怎么用,你要么去 Google 要么去百度,或者直接 –help。

至于像 Oracle 数据库,SQLServer 这些都是类似的。

如果数据库服务器没做日志记录的话,管理员都不会发现自己什么时候被人把库给脱了。

3. 通过 WebShell,上传脱库脚本导出

这种方法也叫 数据库桥接,意思就是,我这台机器的 IP 不在你的数据库受信列表里面,我访问不了你,那我就用你信任的主机当个跳板来连你,然后就把你的数据全拖了。

这个方法也是用的最多的。大部分的数据库设置都会限制陌生的主机来访问,但是当这个脱库的请求是信任的主机发出的时候,那妥妥地放行啊,信任的你都要拦下来,你这是要大义灭亲还是要六亲不认?

还有一个特点就是方便,有一个 WebShell 就能搞,一个脱库脚本传上去,什么复杂的命令,什么权限提升,这些一般都可以不操心。最主要的,很难被管理员发现。Web 也会有日志记录呀,来我们先看看 一般的日志记录

这是 access.log 的

1
127.0.0.1 - - [15/Oct/2015:17:13:35 +0800] "GET /test.php HTTP/1.1" 200 57 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0"

这里面会记录 IP地址,日期,请求的文件,UA 等等,这个请求的文件就是我要讲的了,如果你的脱库脚本名字是 tuoku.php, 管理员查日志的时候,一眼就看出来是什么了。小隐隐陵薮,大隐隐朝市。把文件名改成一个不起眼的名字,管理员疏忽了就很难发现你了。等他发现的时候,数据已经被你脱到手了,再 Ban 你的 IP 也为时已晚。

这种小脚本的原理都是通过查询然后保存数据,多不胜数了,我就不罗列了。

4. 备份文件处理不当

有些网站会有自动备份的功能,但是因为某些配置不当,把备份的 SQL 文件直接放在了网站某个目录里面,还没有做任何权限处理,你只要猜对了文件名,这些纯文本的数据库文件全是你的。

5. 命令执行漏洞

这个我就不想多说什么了,你都能执行命令了。上面这些基本上你都能做了。

6. 其它

话不能说死,毕竟我是个娱乐型程序员,我得给我留个台阶下。

什么时候拖库

这个问题,其实是要结合着现实来说的。

小偷什么时候去你家合适?当然是要趁你家没人的时候啦。你在家的时候进门偷东西的,那叫强盗,要么就是傻逼,正常人哪里能做得出这种事。

我们来想想管理员一般什么时候不在线。

  1. 中午 12点至 13 点,午休时间,一般会去吃饭睡午觉什么的,但是这个时间太短,万一人家点了外卖坐电脑面前正吃着呢,你跑服务器上去胶库,那么多网管不干死你,最后说不定自己还会被反爆菊花。
  2. 凌晨 3 点至第 5点,这个点都是睡觉时间,脱完之后还会有时间清理痕迹。黄金时间
  3. 周五晚上,为什么挑这个时间呢?周末不是工作日,是休息时间,管理员放假的时间,不是很紧急的事情都有会放到周一来处理的。发现了问题也不会是立马就十几个抠脚大汉围杀你。这个必须是黄金时间啊
  4. 其它时间。我说话就是这么严谨 2333,不排除人家在上面说的时间以外脱你数据库呀。

一般很少有人会在晚上加班,有的话也是一两个人值守,利用的就是目标防御最弱的时候。所以,网络管理员也不好当啊。

善意地提醒

重要的数据都会有监控,一有异常就会有提醒,别以为挂几个 VPN 多搞层代理就没人抓得了你了。网管也不要因为有这些防护产品就消极怠慢了,也总有世外高人让你防不胜防。

呀,我这话怎么跟没说一样。

被脱库了怎么办

  1. 发现黑客正在脱库,Ban IP 立刻,马上。
  2. 查找后门,修补漏洞,如果需要很长时间修复,或者你修复不了,如果服务不是很重要的话,暂时可以把相关的程序服务停掉。
  3. 提醒用户修改密码。
  4. 联系公关,说明情况,必要时报警。
  5. 准备辞职报告。

最后

上面的都是我乱说的。从我的文章理解,感觉很简单,其实涉及到的东西和方面特别多,一两句话要是能说清楚的话,你让这些人怎么活?