游客发表
电话是电话下午两点十七分打来的。座机。说公司网我盯着屏幕上没写完的站网周报,听筒里一个南方口音的络安漏洞男声说:“你们官网首页的登录框,SQL注入能直接拖库。全存”他停顿了一下,电话像是说公司网在等我反应。我第一反应是站网诈骗——最近这种“安全公司”推销渗透测试的套路太多了。但他没提钱,络安漏洞也没让我点链接,全存只说了句“你打开F12看看登录请求的电话响应头”。
我打开网站,说公司网按了F12。站网Network面板里,络安漏洞登录接口返回的全存HTTP头里赫然写着Server: nginx/1.14.0,下面还有一行X-Powered-By: PHP/5.6.40。这版本PHP 2018年底就停止维护了。我心里咯噔一下。他又说:“你试试在用户名框里输 ' or '1'='1。”我没敢真在线上环境试,但把请求复制到Postman里,改了个参数,返回的JSON里直接带出了三个测试账号的哈希密码。MD5的,没加盐。
他说得对。网站确实有洞。而且不止一个。
我问他怎么发现的。他说他本来是给另一家公司做资产测绘,用fofa搜同C段IP,看到我们官网的favicon图标有点眼熟,顺手扫了一下目录,发现/backup/目录没关,里面躺着2021年的数据库导出文件。他下载了,解压,看到用户表结构,才决定打电话。我问他为什么不直接提交到漏洞平台换积分,他说:“你们那站一天没几个访问量,提交了也排不上号。我正好午休,顺手打个电话。”语气平淡得像在说帮邻居收了件快递。
挂了电话,我干了三件事。第一,把登录接口的报错信息全关了,现在返回统一是“用户名或密码错误”。第二,让运维把PHP升到7.4,虽然老代码跑起来一堆warning,但至少不在EOL列表里了。第三,把/backup/目录整个删了,顺手在nginx里加了一条location ~ /\. { deny all; }。做完这些花了不到四十分钟。期间那个南方口音又打来一次,说“你们数据库端口3306对公网开着呢,密码是root123,我刚试了能连上”。我汗都下来了。
这事有意思的地方在于:我们公司没有专职安全,运维只管服务器别宕机,开发只管功能能跑通。网站是三年前外包做的,验收时测了功能,没测安全。外包公司早就不合作了,代码扔在GitLab里没人动。那个登录框的SQL注入,其实是最基础的那种——直接把用户输入拼进SQL语句,连预处理都没用。我翻了下代码,发现整个项目里mysql_query出现了四十多次。这玩意儿PHP 7里已经删了,所以升完级网站直接白屏。又花了一小时把数据库操作全改成PDO预处理。
晚上七点,我给那个号码回拨过去。他接了,背景音里有小孩在闹。我说谢谢,问他能不能把扫描的细节发我一份。他说行,加个微信吧。微信上他发来一个txt,里面列了十二个问题:从SQL注入、XSS、目录遍历,到phpinfo()没删、.git目录可访问、后台弱口令。最后一行写着:“你们那个/admin/后台,账号admin密码admin888,我都没好意思登进去。”
我点开后台,还真进去了。后台里能看到所有用户的手机号和收货地址。一共两千多条。我坐在工位上愣了一会儿,然后把后台密码改成了一串随机字符,又加了个IP白名单。窗外天已经黑了,办公室里只剩我和保洁阿姨的拖把声。我想起那个电话里他说“顺手打个电话”的语气,突然觉得网络安全这事,有时候就是一层窗户纸——捅破了,里面全是裸奔的数据;没人捅,你就以为墙是实的。
第二天我把报告发给老板,附了修复清单。老板回了个“辛苦了”,然后问:“那个打电话的人,要不要给他发个红包?”我说不用,他连漏洞平台都懒得提交。老板说那请他吃个饭吧。我说他人在广州。老板说哦,那算了。
后来我养成了一个习惯:每周五下午扫一遍自己公司的域名。用最基础的工具,nmap、dirsearch、sqlmap。不为什么,就图个心安。那个南方口音再没打来过。但我把他微信置顶了,备注写着“广州·午休安全员”。
友情链接