当前位置:首页 > 热点

抓漏洞

去年秋天,抓漏洞我帮一个做电商的抓漏洞朋友看他的服务器日志。凌晨三点,抓漏洞一条异常请求记录引起我注意:某个IP在十秒内连续访问了优惠券接口两百次,抓漏洞每次参数只改了一个数字。抓漏洞朋友说这正常,抓漏洞可能是抓漏洞爬虫。我说不对,抓漏洞爬虫不会只盯着优惠券,抓漏洞而且这个IP的抓漏洞请求间隔精确到毫秒,像是抓漏洞脚本在跑。

后来查清楚了,抓漏洞有人写了个小工具,抓漏洞专门扫描他们平台的抓漏洞优惠券ID。因为优惠券ID是抓漏洞自增的,从100001开始,每张券对应一个固定金额。那家伙写了个循环,从100001试到200000,把能领的全领了。朋友问我怎么发现的,我说你去看数据库里那些被领走的券,领取时间集中在同一秒,用户ID全是新注册的,注册IP和领券IP一模一样。

这就是抓漏洞最朴素的样子——不是电影里那种黑进五角大楼,而是发现系统设计时没想周全的地方。优惠券ID自增,这是开发图省事。图省事的代价就是被人用最笨的办法薅走几万块。

漏洞往往藏在“应该没问题”的地方

我见过一个更离谱的。某在线教育平台,用户做完题提交答案,前端会先判断对错,再把结果发给服务器。服务器收到什么就存什么。有人把前端代码改了,不管选什么答案都发送“正确”。三天后,这个人的账号刷到了排行榜第一,正确率100%,答题时间全是0.1秒。平台运营还给他发了奖金。

你可能会笑,这也能叫漏洞?但很多系统就是这么跑的。开发人员默认用户会老老实实走前端流程,默认请求都来自自己的页面。可抓漏洞的人不跟你讲默认。他们打开浏览器的开发者工具,看看请求长什么样,然后直接构造一个。

有个做安全测试的朋友跟我说过一句话:“每个输入框都是一个可能的入口,每个参数都是一个可能的钥匙。” 他接了个活,帮一家公司测他们的后台。登录页面有个“记住我”的选项,勾选后会在cookie里存一个token。他把token解码,发现是用户名加时间戳的MD5。他改了用户名,重新算MD5,直接登进了管理员账号。整个过程没用任何黑客工具,就是浏览器地址栏加一个在线MD5计算器。

抓漏洞的人在想什么

他们不按设计者的思路走。设计者想的是“用户会点这个按钮”,他们想的是“这个按钮背后的请求我能不能直接发”。设计者想的是“密码错了就提示错误”,他们想的是“如果我发一个空密码会怎样”。

有个经典案例。某网站找回密码功能,第一步输入邮箱,第二步回答密保问题,第三步重置密码。有人发现第二步的密保问题答案在返回的HTML里藏着,只是被CSS隐藏了。查看源代码就能看到答案。这不算什么高深技术,就是右键查看网页源代码。但设计者没想到有人会看。

我自己的习惯是,看到任何需要输入的地方,先想想“如果我不按规矩输入会怎样”。注册时用户名填个超长字符串,看看数据库会不会报错。搜索框里加个单引号,看看有没有SQL注入。上传头像时传个PHP文件,看看服务器会不会执行。这些动作花不了几分钟,但能筛掉一大半粗制滥造的系统。

抓漏洞这件事,门槛比很多人想象的低。你不需要会写复杂的exploit,不需要懂汇编。你只需要比开发人员多想一步。他们想的是功能怎么实现,你想的是实现之外还有什么可能。那个优惠券ID自增的漏洞,从发现到利用,全程不到二十分钟。写脚本的时间比找漏洞的时间还长。

最后说个有意思的。我认识一个专门帮企业做安全审计的人,他每次去客户那里,第一件事是问前台要WiFi密码。然后连上WiFi,打开一个抓包工具,看看内网里有哪些设备在通信。十次里有八次,他能在一个小时内找到某个内部系统的登录接口,用默认密码admin/admin登进去。客户每次都惊讶,他每次都一样的话:“不是我厉害,是你们没改默认密码。”

漏洞就在那里。不增不减。你找或不找,它都在。区别只在于,你先找到,还是别人先找到。

分享到: