知识

检测到目标URL存在错误信息注入漏洞

时间:2010-12-5 17:23:32  作者:百科   来源:百科  查看:  评论:0
内容摘要:凌晨两点十七分,日志告警弹出来的时候,我正把脸埋进第三杯冷萃咖啡里。那条记录看起来平平无奇——一个GET请求,参数id后面跟着一串单引号加AND 1=1。但响应包暴露了一切:完整的SQL堆栈跟踪,连着

凌晨两点十七分,检测日志告警弹出来的到目洞时候,我正把脸埋进第三杯冷萃咖啡里。存错那条记录看起来平平无奇——一个GET请求,误信参数id后面跟着一串单引号加AND 1=1。息注但响应包暴露了一切:完整的入漏SQL堆栈跟踪,连着数据库用户名和绝对路径,检测像把家门钥匙挂在门口垫子底下。到目洞

这种漏洞其实不难找。存错攻击者往参数里塞个单引号,误信服务器如果直接报错,息注把查询语句原样吐出来,入漏那就等于递了把刀。检测我见过最离谱的到目洞一次,某个政务系统的存错错误页面居然把整个SELECT语句连带WHERE条件都打印出来了,连表名带列名,就差把密码也写在注释里了。你说开发人员不知道这有风险吗?他们只是没想到真有人会半夜拿扫描器对着他们的系统挠痒痒。

问题出在哪儿?多半是异常处理写得偷懒。catch块里直接return e.ToString(),或者配置了debug模式忘了关。框架自带的错误页确实好看,蓝底白字,堆栈信息排得整整齐齐,可这玩意儿对攻击者来说就是免费的情报站。数据库类型、版本、表结构、甚至某些参数过滤逻辑,全在报错信息里裸奔。

拿这次检测到的目标来说,漏洞点在商品详情接口。攻击者提交id=1',服务端返回的JSON里直接带上了SQLSTATE[42000]: Syntax error near '1'' at line 1。这串字符看着无害,但配合联合查询,就能把users表的密码哈希逐个吐出来。更恶心的是,这个接口还没做频率限制——我拿sqlmap跑了不到五分钟,已经枚举出三个数据库名了。

修复方案倒不复杂。第一步,全局异常过滤器,所有未捕获异常统一返回通用错误码,别把内部细节带出去。第二步,数据库连接字符串里关掉详细错误——具体到MySQL就是mysqli_report(MYSQLI_REPORT_OFF)。第三步,也是很多人忽略的,把生产环境的display_errors设为Off,日志单独写进文件。三步做完,同样的请求进来,攻击者只能看到{ "code":500,"message":"服务器开小差了"}。

但真正让人头疼的不是技术。上周帮一家电商公司做渗透测试,发现他们的订单查询接口也有类似问题。开发负责人听完我的报告,第一反应是“这个接口只有登录用户才能调,应该没事吧”。我当时没忍住,直接当着他面用普通账号构造了个越权请求,把全站用户的手机号拉了出来。他脸都绿了。

说句实在话,错误信息注入在漏洞排行里算低危,可它往往是攻击链的第一环。就像撬锁前先踩点,报错页面把窗户位置全标出来了。你永远不知道哪个看似不起眼的报错,会变成撕开整个系统的那个口子。等真出了事再回头补,代价可就不是改几行代码那么简单了。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap