下列注入漏洞不属于sql注入的是
很多人一看到“注入”两个字,下列脑子里立刻蹦出SQL注入。注入注入没办法,漏洞这些年安全培训、不属漏洞扫描报告、下列CTF题目,注入注入把SQL注入捧成了注入界的漏洞顶流。但注入漏洞是不属个大家族,SQL注入只是下列其中最有名的那一个。真正的注入注入问题是:哪些漏洞虽然名字里带“注入”,或者原理上属于注入范畴,漏洞却压根不是不属SQL注入?
先拿命令注入来说。一个Web应用调用系统命令去ping某个IP,下列用户输入127.0.0.1; cat /etc/passwd,注入注入分号后面的漏洞命令被执行了。这叫OS Command Injection。它注入的是shell命令,走的是操作系统那一层,跟数据库没有半毛钱关系。你就算把数据库锁得再死,命令注入照样能拿到服务器权限。我见过一个运维平台,SQL注入防护做得滴水不漏,参数化查询用得规规矩矩,结果一个网络诊断功能没过滤分号,直接被反弹shell。数据库安全不等于系统安全,这是两码事。
再比如LDAP注入。企业里用LDAP做统一认证的场景不少,登录接口如果直接把用户输入拼进LDAP查询过滤器,攻击者构造*)(uid=*))(|(uid=*这样的输入,就能绕过认证或者枚举目录信息。LDAP查询语法和SQL完全是两套东西,注入的payload长得也不一样,但它同样属于注入类漏洞。把它叫SQL注入,就像把篮球叫成足球——都是球,规则差远了。
XML注入也容易被混淆。XPath注入针对的是XML文档的查询路径,攻击者通过构造恶意XPath表达式来遍历XML节点。还有XXE,严格说它不算“注入”而是“实体扩展”,但很多人把它归到注入大类里。这些漏洞的输入点、利用链、影响面,跟SQL注入的重叠部分很少。你拿sqlmap去扫XPath注入,扫到天荒地老也扫不出来。
模板注入是另一个典型。服务端模板引擎比如Jinja2、Twig、Freemarker,如果允许用户输入直接进入模板渲染过程,攻击者可以注入模板表达式,最终导致远程代码执行。SSTI(Server-Side Template Injection)这个名字里带Injection,但它注入的是模板语法,不是SQL语句。一个Jinja2的payload { { 7*7}}返回49,这跟数据库查询毫无关联。我见过有人把SSTI的漏洞报告写成“疑似SQL注入”,审核的人差点没气笑。
还有HTTP头注入。攻击者往User-Agent、X-Forwarded-For这些头里塞换行符,如果应用把这些值直接写进响应头或者日志,可能造成响应拆分或者日志伪造。这叫Header Injection,也叫CRLF Injection。它利用的是HTTP协议解析的边界问题,跟SQL语法没有交集。把它归为SQL注入,说明对漏洞分类的理解还停留在“看到注入就想到SQL”的初级阶段。
那为什么这么多人会把非SQL注入误判为SQL注入?一个原因是工具依赖。很多扫描器把“注入”类告警统一打上SQL Injection的标签,使用者不细看就照搬。另一个原因是知识结构偏科。学安全的人入门第一课往往是SQL注入,练手靶场也是SQL注入,久而久之形成了思维定式。看到单引号报错就兴奋,看到其他注入类型反而没感觉。
区分这些注入类型其实有个简单的判断方法:看注入的“宿主语言”是什么。SQL注入的宿主是SQL解析器,命令注入的宿主是shell,LDAP注入的宿主是LDAP查询引擎,SSTI的宿主是模板引擎。宿主不同,防御手段就不同。参数化查询能防SQL注入,但防不了命令注入;转义特殊字符对某些场景有效,但对模板注入往往不够。搞清楚漏洞的归属,才能选对修复方案。
安全圈有个不好的习惯,喜欢用最熟悉的那个名词去套所有相似的东西。SQL注入名声大,就被当成了注入漏洞的代名词。这种偷懒的命名习惯,轻则导致沟通误解,重则让开发人员用错误的方案去修漏洞,修了个寂寞。下次看到“注入”两个字,先别急着喊SQL,看看它到底注入了什么、注入到了哪里。这个习惯,能帮你少走很多弯路。
(责任编辑:百科)














