如何搜索网站数据库的何搜漏洞
一个朋友上周找我,说他的索网电商站被人拖库了,几万条用户数据挂在暗网上叫卖。站数我帮他查日志,据库发现攻击者用的漏洞居然是一个三年前就公开的SQL注入点——就在商品搜索框里,参数根本没做过滤。何搜这让我想起一个事实:绝大多数数据库漏洞,索网不是站数被“挖”出来的,而是据库被“翻”出来的。
搜索数据库漏洞,漏洞第一步不是何搜拿扫描器乱扫,而是索网先看网站怎么跟数据库说话。你打开任意一个带搜索功能的站数页面,输入一个单引号 ',据库如果页面报错或者返回异常,漏洞恭喜你,入口可能就敞开了。别小看这个动作,很多渗透测试新手上来就上sqlmap,反倒被WAF拦得死死的。
更实用的办法是手工测。比如在URL参数后加 and 1=1 和 and 1=2,对比两个页面的响应差异。如果前者正常、后者空白或报错,说明参数能拼进SQL语句。我见过一个极端案例——某政府网站的通知公告详情页,id参数是纯数字,但开发人员把参数值直接拼进了查询,连个类型转换都没做。这种漏洞,小学生都能利用。
绕过WAF是另一门手艺。常见的云WAF会拦截 union select 这样的关键字,但你可以用注释符 /*!50000union*/ 或者内联注释来混淆。还有一招,把关键字拆成十六进制编码,比如 0x7573696e 就是“usin”。我去年测一个金融平台,他们的WAF规则只查GET参数,POST请求里的JSON数据完全不过滤,我在请求体里塞了完整的报错注入payload,直接爆出了数据库版本。
别忘了那些“非主流”入口。文件下载功能、导出Excel的接口、甚至忘记密码的验证码校验逻辑,都可能藏着SQL注入。有一次我盯上一个网站的PDF生成功能,URL里有个 file_id=123,我改成 file_id=123 AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT user()),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a),结果报错信息直接把数据库用户名吐了出来。开发人员压根没想到,生成报表的地方也能成为突破口。
搜索漏洞时,时间盲注是你的好朋友。如果页面没有任何回显差异,用 if(condition,sleep(5),0) 判断真假。响应时间多5秒,说明条件为真。这种手法慢,但有效。我见过一个老程序员,他测试Oracle数据库时,用 UTL_HTTP.REQUEST 把查询结果发到自己的服务器上,比什么盲注都快。
最后说点实在的。搜索数据库漏洞,本质上是理解开发者的懒惰和疏忽。那些框架自动生成的参数、没有正则校验的输入、直接拼接字符串的查询——漏洞就藏在代码的惯性思维里。别指望一个扫描器能解决所有问题,手工测几个关键点,往往比跑一整晚工具更高效。当然,我这话只对合法授权测试说,你要是拿别人的站练手,等着你的不是漏洞,是手铐。
