数字查询参数后加单引号的SQL注入测试原理及判定逻辑
数字型参数加单引号测试SQL注入的原理
咱们先拆解这个测试方法的核心逻辑:
- 正常情况下,数字型查询参数对应的SQL语句是类似这样的:
select * from ask_user_tags where id=1;,参数1直接作为数值拼入语句,不需要引号包裹。 - 当你在参数后加单引号,请求变成
id=1',如果后端没有对参数做任何过滤或转义,拼接后的SQL就会变成:select * from ask_user_tags where id=1';。 - 这时候问题就来了:SQL语法里,单引号是用来包裹字符串的,现在语句里多了一个未闭合的单引号,数据库会识别为语法错误,通常会抛出类似“字符串未正确闭合”的报错。
- 如果网站返回了这个报错,就说明参数是直接拼进SQL语句的,没有做安全处理,那大概率存在SQL注入的可能。
你遇到的这个情况其实是MySQL的特性导致的,但这种“异常响应”本身就是判断注入的信号:
- 当MySQL遇到未闭合的单引号时,它会认为你还没写完完整的SQL语句,所以进入等待输入状态,等着你补上另一半单引号来闭合字符串。
- 但如果后端做了正确的参数处理(比如把单引号转义成
\'),拼接后的SQL会变成select * from ask_user_tags where id=1\'——这时候单引号被转义,不会破坏SQL结构,MySQL会正常执行(甚至因为是数字型参数,会自动把1'转成数值1,返回和正常请求一样的结果)。 - 现在出现了“等待输入”的异常情况,恰恰说明你的单引号没有被任何处理,直接被带入了SQL语句,这就证明参数是直接拼接进SQL的,存在注入风险。
内容的提问来源于stack exchange,提问作者user7693832
相关产品推荐
相关产品推荐

