CHARINDEX用户输入位置SQL注入可行性及相关规则问询
SQL注入相关问题解答
问题1:CHARINDEX函数参数位置的注入点是否可以实现攻击
完全可以,你构造的payload存在语法问题才会触发报错。
你遇到的Missing end comment mark '*/'错误是因为你使用了/*多行注释却没有补充对应的*/闭合标记,换成SQL Server支持的单行注释--即可规避这个问题。
针对该场景的可用payload示例:输入内容为', [Name]) > 0) AS TMP; DROP TABLE [Setting]; --,拼接后的完整执行语句如下:
SELECT * FROM ( SELECT TOP 10 * FROM [User] WHERE CHARINDEX('', [Name]) > 0) AS TMP; DROP TABLE [Setting]; --', [Name]) > 0 ) AS [User] LEFT JOIN [Setting] ON [Setting].[UserId] = [User].[Id]
--会注释掉当前行之后的所有内容,整个语句结构完全合法,在支持堆叠查询的数据库中即可直接执行恶意的DROP语句。
即使不需要堆叠执行额外语句,也可以构造盲注payload直接在当前查询逻辑中获取数据,例如输入', [Name]) > 0 AND 1=(SELECT COUNT(*) FROM [User] WHERE [Password] LIKE 'a%') AND CHARINDEX(',拼接后的WHERE子句完全合法,可通过页面返回结果判断密码是否以a开头,逐步拖取全量敏感数据。
问题2:SQL注入对语句编译合法性的要求及不同DBMS差异
通用规则
SQL注入不要求整条拼接后的语句完全可执行,不同注入类型对语法合法性的要求不同:
- 联合查询注入、堆叠注入:需要构造的恶意语句段结构完全合法,语法错误会直接阻断这类注入的执行
- 报错注入:反而需要主动触发运行时/语法错误,利用数据库的错误回显带出敏感数据,不需要整句完全执行
- 布尔盲注、时间盲注:仅需要注入的逻辑判断部分可被数据库解析即可,哪怕后续语句存在语法错误,只要注入的逻辑能影响页面返回结果、响应时间,就可以完成注入
不同DBMS的差异
- SQL Server:默认支持堆叠查询(用;分隔多个语句),支持
--、/**/两种注释方式,错误回显信息非常详细。即使语句后半段存在语法错误,前面用;分隔的合法语句依然会被执行,对注入语法的容错性较高。 - MySQL:默认普通查询模式不支持堆叠注入,仅在使用预处理语句、特定API调用时支持堆叠。支持
#、--(--后需加空格/控制字符)、/**/三种注释方式。会优先计算WHERE子句的逻辑结果再处理后续语句结构,因此盲注场景下即使后续语句有语法错误,也不影响前面注入逻辑的判断。 - Oracle:不支持堆叠查询,支持
--、/**/两种注释方式。对语句语法合法性要求极高,整句存在任意语法错误都会直接终止全部执行,因此Oracle注入通常需要构造完全合法的完整语句结构。
内容的提问来源于stack exchange,提问作者brechtd
相关产品推荐
相关产品推荐

