当前位置:首页 > 热点

下列漏洞中 哪些不属于注入漏洞

上周帮一个朋友看代码,下列他指着一段SQL拼接跟我说:“这儿我做了过滤,漏洞漏洞应该不算注入了。中不注入”我扫了一眼,属于他过滤的下列是单引号,但没管数字型参数。漏洞漏洞这种认知偏差太常见了——很多人把“注入漏洞”和“SQL注入”划等号,中不注入结果一遇到命令注入、属于LDAP注入就懵了。下列更麻烦的漏洞漏洞是,有些漏洞名字里带“注入”,中不注入实际原理却跟注入没半毛钱关系。属于

先明确一下,下列注入漏洞的漏洞漏洞核心是什么?用户可控的数据被当成代码或指令的一部分执行了。注意,中不注入是“执行”,不是“存储”也不是“显示”。SQL注入是把用户输入拼进SQL语句让数据库执行,命令注入是把输入拼进系统命令让shell执行,LDAP注入是把输入拼进LDAP查询让目录服务执行。它们共享同一个逻辑:数据越界成了指令。

那哪些漏洞经常被误认为注入,其实不是?

XSS(跨站脚本)是最常被冤枉的。很多人一看“用户输入被浏览器执行了”,就觉得是注入。但XSS的本质是输出编码问题,用户输入并没有被服务器端当成代码执行,而是被浏览器当成了HTML/JS解析。服务器只是把数据原样吐回来,执行发生在客户端。SQL注入是服务器把数据当SQL跑了,XSS是浏览器把数据当页面渲染了。两者防御思路完全不同:SQL注入靠参数化查询,XSS靠输出编码和CSP。把XSS叫“HTML注入”勉强说得通,但它不属于服务端注入漏洞的范畴。

CSRF(跨站请求伪造)更离谱,名字里连“注入”都没有,但偶尔有人把它归进去。CSRF是诱导用户浏览器在已认证状态下发送请求,服务器收到的请求本身完全合法,参数也合法,没有任何数据被当成代码执行。它利用的是浏览器的Cookie自动携带机制和用户的已登录状态。这跟注入八竿子打不着,防御靠CSRF Token和SameSite Cookie。

文件包含漏洞得分情况。LFI(本地文件包含)如果只是读取文件,那不算注入;但如果包含的文件里含有PHP代码被解析执行了,那就变成了代码执行。RFI(远程文件包含)能加载远程恶意脚本,本质上是代码注入的一种。所以文件包含本身不是注入,它可能触发注入效果,但漏洞类别归属要看具体利用方式。

反序列化漏洞也常被误归类。Java反序列化、PHP反序列化,攻击者控制序列化数据,服务器反序列化时触发魔术方法或readObject,最终导致命令执行。这算注入吗?严格说,反序列化是“数据被当成对象构造指令”了,可以视为一种广义的注入。但安全圈通常把它单独列为“反序列化漏洞”,因为利用链复杂、防御手段特殊(白名单类、签名校验),跟传统注入的防御逻辑差异太大。我倾向于不把它塞进注入分类里,否则分类就失去指导防御的意义了。

XXE(XML外部实体注入)名字里带“注入”,但它是利用XML解析器处理外部实体引用来读取文件或发起SSRF。用户输入是XML文档本身,解析器按DTD规则去加载外部资源。这更像是一种解析器特性滥用,而不是把数据拼进指令。不过XXE经常能升级成SSRF甚至命令执行,所以有人把它当注入也情有可原。但严格分类,它属于“XML解析漏洞”。

还有个冷门的:HTTP头注入。比如CRLF注入,用户输入里的换行符让服务器响应头被拆分,插入了额外头或响应体。这算注入吗?算,因为数据越界成了协议指令。但很多人只盯着SQL,忘了协议层也有注入。

判断一个漏洞是不是注入,就问三个问题:用户数据是否被拼接进了某种指令?该指令是否被解释器执行了?执行发生在服务端还是客户端?三个都答“是”且服务端执行,那就是注入。XSS第三个问题答“客户端”,CSRF第一个问题就答“否”,反序列化第二个问题答“是”但第一个问题模糊。

我见过最离谱的归类是把“越权访问”叫“权限注入”。这纯粹是望文生义。越权是访问控制失效,跟注入没任何关系。安全分类不是文字游戏,分错了会导致防御措施用错地方。你拿防SQL注入的WAF去挡XSS,效果约等于零。

所以下次看到“注入”两个字,先别急着归类。看看数据到底被谁执行了。执行者是数据库、shell、LDAP服务器,那是注入;执行者是浏览器、XML解析器、反序列化引擎,那得另算。分类错了,防御就歪了。

分享到: